我想通过 ssh 从本地计算机上的脚本执行多个命令,但不需要为每个命令重新连接。通常,我会选择类似以下方法:
$ ssh [user]@[server] '[command 1] | [command 2] | [command 3]'
但是,这剥夺了我了解每个命令的输出和退出代码的机会。我真正想做的是让 ssh 连接在后台某处挂起,然后只需向其输入命令并接收其输出,例如(这显然是无效的,只是我希望它看起来像的一个例子):
$ ssh --name=my_connection [user]@[server]
$ ssh my_connection 'command_1'
$ ssh my_connection 'command_2'
$ ssh my_connection 'command_3'
有任何方法可以实现吗?
答案1
例如已经回答过在 Serverfault 上:
~/.ssh/config
您可以使用以下选项进行设置:
Host machine1
HostName machine1.example.org
User yourusername
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
ControlPersist 10m
然后确保mkdir ~/.ssh/controlmasters/
从那时起,您的连接将machine1
持续 10 分钟,以便您可以在一次连接期间发出更多会话或数据传输。
然后它就可以正常工作了:
$ ssh [server] 'command_1'
# authenticate
$ ssh [server] 'command_2'
$ ssh [server] 'command_3'
如果您有某种原因不使用该配置,那么您也可以在命令行上执行此操作:
$ 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'