I'd like to execute multiple commands through ssh from the script on my local machine, but without the need to reconnect for each command. Normally, I'd go with something like:

$ ssh [user]@[server] '[command 1] | [command 2] | [command 3]'

However this strips me of the opportunity to know the output and exit code of each command. What I'd really like to do is have ssh connection hang on somewhere in the background and then just feed it commands and receive output from it, for example (this is not valid, obviously, just an example of what I'd like it to look like):

$ ssh --name=my_connection [user]@[server]
$ ssh my_connection 'command_1'
$ ssh my_connection 'command_2'
$ ssh my_connection 'command_3'

Is it possible in any way?


Already answered for example here on Serverfault:

You can set up ~/.ssh/config, with these options:

Host machine1
  HostName machine1.example.org
  User yourusername
  ControlPath ~/.ssh/controlmasters/%r@%h:%p
  ControlMaster auto
  ControlPersist 10m

Then make sure you mkdir ~/.ssh/controlmasters/ and from that time, your connections to machine1 will persist for 10 minutes so you can issue more sessions or data transfers during one connection.

Then it will Just WorkTM:

$ ssh [server] 'command_1'
# authenticate
$ ssh [server] 'command_2'
$ ssh [server] 'command_3'

If you have some reason not to use the config, then you can do it also on command-line:

$ ssh -MNfS ~/.ssh/controlmasters/%r@%h:%p [server]
# authenticate and go to background
$ ssh -S ~/.ssh/controlmasters/%r@%h:%p [server] 'command_1'
# authenticate
$ ssh -S ~/.ssh/controlmasters/%r@%h:%p [server] 'command_2'
$ ssh -S ~/.ssh/controlmasters/%r@%h:%p [server] 'command_3'
| improve this answer | |
  • Does "issuing a session" take additional time? Is there a way to make this work without fixing config (like, supply a command line argument to ssh? – snitko Mar 26 '16 at 18:30
  • Yes, you can use direct command-line options to ssh, but then the first one will be ssh -MNfS ~/.ssh/controlmasters/%r@%h:%p [server] and the others just ssh -S ~/.ssh/controlmasters/%r@%h:%p [server] command. But the config is much more convenient. – Jakuje Mar 26 '16 at 18:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.