我已经阅读了有关该主题的几篇文章,但我发现的每个解决方案似乎都是一行运行一个命令的命令。
我正在创建一个脚本,用于依次 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
连接一样安全。
答案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 中通常比它本身更有挑战性。
我已经这样做了数百次,当你想让某项任务一次在一台服务器上运行时,这种方法效果很好。如果你想要并行运行任务,还有其他选择,但我会考虑ansible第一的。