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.

Use ; to run multiple commands in sequence

Here ; 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.

bash -c"cmd1;cmd2;cmd3"

Use && to run multiple commands

Here && means only the previous command run successfully then the next command will be executed.

ssh host "cmd1 && cmd2 && cmd3"

Only cmd1 succeeded then cmd2 will be executed , similarly only if cmd2 succeeded then cmd3 will be executed.

For example:

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.

Use || to run multiple commands

Here || 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.

Multiple lines

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
"

Or with && and ||

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