如何在 bash 脚本中退出 SSH 连接

如何在 bash 脚本中退出 SSH 连接

我已经阅读了有关该主题的几篇文章,但我发现的每个解决方案似乎都是一行运行一个命令的命令。

我正在创建一个脚本,用于依次 ssh 到多个不同的主机。目标是 ssh 到一台机器,执行一些本地命令,执行一个脚本,等待它完成,然后退出 ssh 会话并转到下一个。

但是,当我使用“退出”命令时,它不起作用并且只是完全退出脚本。

答案1

我猜想你的脚本没有退出 shell 会话,因为你直接用 调用它./exit.sh。你应该source使用它。

脚本中的语句exit将关闭 shell 会话。

$ source exit.sh
# or
$ . exit.sh

内置source命令在当前 shell 上下文,同时./exit.sh发射新壳来运行它。

答案2

您是否尝试过将命令放入文件中并使用 cat 或 EOF

ssh -t [email protected] << EOF
 command1
 command2
 exit
EOF

答案3

我建议您看看pssh您想要完成的任务 - 它可以让您轻松处理跨机器打开/关闭连接的细微差别,甚至可以并行运行以减少执行时间。

它仍然用作ssh传输协议,因此显然与循环ssh连接一样安全。

https://linux.die.net/man/1/pssh

答案4

通常,您可以毫无问题for地完成循环。ssh

$ for srv in 192.168.88.138; do echo $srv:; ssh $srv uptime; done
192.168.88.138:
 13:27:25 up 30 days,  8:42,  1 user,  load average: 4.15, 4.06, 4.06

uptime所以在这种情况下,我在另一边运行。你可以uptime用你想要运行的内容替换。无论你放在那里什么,出口都需要在那里。 uptime一旦它打印出输出,它就会退出,但如果您正在编写脚本,您可能需要确保它最终退出,这样循环for才能继续。

如果您要执行任何复杂操作,我建议您在单独的文件中创建脚本,然后scp将其发送到要运行它的服务器,然后通过 ssh 运行它。尝试通过引用和转义将复杂操作放入 ssh 中通常比它本身更有挑战性。

我已经这样做了数百次,当你想让某项任务一次在一台服务器上运行时,这种方法效果很好。如果你想要并行运行任务,还有其他选择,但我会考虑第一的。

相关内容