In most of the cases we run ssh to execute one command or script on remote machine ,actually we can run multiple commands in one line with ssh.
; to run multiple commands in sequence
; means no matter the previous command run successfully or failed, the next command always will be executed.
ssh host "cmd1;cmd2;cmd3"
And the background is : initialize a ssh session with server
host , by default without tty (notty) , the execute command in remote host.
&& to run multiple commands
&& means only the previous command run successfully then the next command will be executed.
ssh host "cmd1 && cmd2 && cmd3"
cmd1 succeeded then
cmd2 will be executed , similarly only if
cmd2 succeeded then
cmd3 will be executed.
j@ubuntu:~$ ssh 192.168.171.161 "touch /root/abc ; echo done" touch: cannot touch '/root/abc': Permission denied done j@ubuntu:~$ ssh 192.168.171.161 "touch /root/abc && echo done" touch: cannot touch '/root/abc': Permission denied j@ubuntu:~$
Here we can see while using
; , although command
touch /root/abc failed , command
echo done still been executed.
But while using
&& , because the first command failed ,so
echo done was not been executed.
|| to run multiple commands
|| means only if the previous command failed then the next command will be executed.
ssh host "cmd1 || cmd2 || cmd3"
Let’s also see an example:
j@ubuntu:~$ ssh 192.168.171.161 "touch /root/abc >/dev/null 2>&1 || echo failed" failed
Here because the first command
touch /root/abc failed then
echo failed been executed.
>/dev/null 2>&1 means redirect both standard output and standard error to null.
In case you need to run many commands or you think one line command is a little bit ugly , you can try below
ssh hosts " cmd1 cmd2 cmd3 "
ssh host " cmd1 && cmd2 || cmd3 "
Some shells like csh doesn’t support newlines between double quotes , you can use below method instead
ssh hosts <<EOF cmd1 cmd2 EOF