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?
[donotprint][/donotprint]There are various ways to run multiple commands on a remote Unix server. This page show the easiest way to ssh and run multiple commands in using bash shell. 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"
For example, run uptime and date commands on a box named ‘centos7’ as ‘vivek’ user::ssh vivek@centos7 "uptime && date"
Sample outputs:
18:36:17 up 1 day, 8:14, 0 users, load average: 1.02, 1.06, 1.05 Fri Jun 7 18:36:17 IST 2019 |
How To Run Multiple SSH Command
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 to run multiple SSH command
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
ORcat remote-box-commands.bash | ssh -t vivek@nas02nixcrafthomeserver
How to ssh to multiple servers and run commands
One can use simple bash for loop as follows. In this example, run uptime command on three Linux server named box1, box2, and box3:
for s in box1 box2 box3 do ssh vivek@${s} uptime done |
Running local bash script on remote system
Create a shell script as follows:
#!/bin/bash # Name: test.sh # Purpose: Run multiple commands on a remote box # ---------------------------------------------------- uptime date whoami |
Now run it as follows on host named server1.cyberciti.biz:ssh vivek@server1.cyberciti.biz 'bash -s' < /path/to/test.sh
OR run it on four servers:
for s in server{1..4}.cyberciti.biz do ssh vivek@${s} 'bash -s' < /home/vivek/bin/test.sh done |
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. You can also use pssh (parallel ssh) for executing ssh in parallel on a number of Linux/Unix/BSD servers. For more info see your ssh and bash command man page:$ man ssh
$ man bash
$ man sudo
And there you have it, multiple bash shell command run using nothing but ssh client/sever model. A better option is to use the ansible tool.