≡ Menu

How To SSH Run Multiple Command On Remote Machine And Exit Safely

I have a backup sync program on local server. I have an ssh password less login set up, and I can run commands on an external server in bash script doing:

ssh root@server2 "sync; sync; /sbin/shutdown -h now"

How do I run multiple commands in bash on a remote Unix or Linux server? What is the best way to SSH in and run various unix commands in a bash shell?

There are various ways to run multiple commands on a remote Unix server. The syntax is as follows:

Simple bash syntax to run multiple commands on remote machine

Simply run command2 if command1 successful on a remote host called foo
$ ssh bar@foo "command1 && command2"
Run date and hostname commands:
$ ssh user@host "date && hostname"
You can run sudo command as follows on a remote box called server1.cyberciti.biz:
$ ssh -t vivek@server1.cyberciti.biz "sudo /sbin/shutdown -h now"
And, finally:
$ ssh root@server1.cyberciti.biz "sync && sync && /sbin/shutdown -h now"

Bash here document syntax

The here document syntax tells the shell to read input from the current source (HERE) until a line containing only word (HERE) is seen:

ssh server1 << HERE
 command1
 command2
HERE

Here is another example to run a multiple commands on a remote system:

ssh vivek@server1.cyberciti.biz << EOF
 date
 hostname
 cat /etc/resolv.conf
EOF

With sudo command type:

ssh -t vivek@server1.cyberciti.biz << EOF
 sync
 sync
 sudo /sbin/shutdown -h 0
EOF

Pipe script to a remote server

Finally, create a script called “remote-box-commands.bash” as follows on your local server:

date
hostname
cat /etc/resolv.conf

Run it as follows on a remote server called nas02nixcrafthomeserver:
$ cat remote-box-commands.bash | ssh user@nas02nixcrafthomeserver
OR
cat remote-box-commands.bash | ssh -t vivek@nas02nixcrafthomeserver

Please note that the -t option will get rid of “Sorry, you must have a tty to run sudo/insert your-command-here” error message. For more info see your ssh and bash command man page.

Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 9 comments… add one }
  • deepak September 17, 2015, 4:35 am

    SUDO will not work inside EOF unless it is set up with the NOPASSWD option in sudoers, because your STDIN is not a standard terminal.

    The correct format would be.

    ssh server sudo -S shutdown <<EOF
    SUDOPASSWORD
    EOF
    
    -S will instruct sudo to get the password from STDIN (in this case the EOF) instead of a terminal. One disadvantage to this is your password will be captured in your session logs if it is set up. You can avoid that by running it inside a script.
    • carlitoregencia March 18, 2017, 1:41 am

      Just don’t forget to put newline at the end of the password

  • James September 17, 2015, 9:08 am

    For SSH connections where a password is needed, use sshpass.
    For example:

    SSHPASS="password"
    SSHCOMMAND="ssh -p 22 -T -o StrictHostKeyChecking=no -o BatchMode=no"
    SSHACCOUNT="xyz@abc.com"
    
    sshpass -p "$SSHPASS" $SSHCOMMAND $SSHACCOUNT << EOF_run_commands
    uptime
    EOF_run_commands
    
  • Bruce September 17, 2015, 9:58 pm

    For more complex tasks, put a script in a file, scp, ssh to execute the script , then remove the file

  • Ian T September 20, 2015, 7:11 am

    For more complicated tasks use Ansible.

    In fact even for non complicated tasks use Ansible; It is essentially Bash & SSH on steroids.

  • Mork October 22, 2015, 4:42 am

    Better way: https://code.google.com/p/parallel-ssh/

    pssh -h hosts.list -P apt-get update

  • Devrim baris acar October 22, 2015, 5:43 am

    Also you may check gnu parallel with –nonall option if you have more than one machine.

  • Kranthi August 22, 2016, 10:41 am

    Can I connect to multi remote host using SSH command in linux ? If not then how i connect to multi remote system using linux.?

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: ,