![在 Bash 脚本中保留 SSH 会话](https://linux22.com/image/497001/%E5%9C%A8%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BF%9D%E7%95%99%20SSH%20%E4%BC%9A%E8%AF%9D.png)
我有一个 bash 脚本,它循环遍历服务器列表,通过 SSH 运行几个远程命令,并将这些命令的输出写入本地文件。对于我在远程服务器上运行的每个命令,我都会打开一个新的 SSH 会话。有没有办法只对一个服务器保持一个 SSH 会话打开,并且我可以运行多个命令,并将输出重定向到本地文件?
答案1
您需要查看ControlMaster
SSH 的设置。这样您就可以创建一个 SSH 连接,然后让到同一台服务器的所有其他 SSH 连接都通过该连接进行多路复用。非常方便。
答案2
注意:当您说本地文件时,我不确定您指的是您刚刚 ssh 进入的本地机器,还是指的是启动 ssh 会话的机器的本地。
推与拉:
听起来这可能不是正确的工具,也许你只是想在每台本地机器上使用 cron?如果需要来自主服务器的信息,你可以让 cron 作业从服务器获取文件。这更像是一种拉取方法,而 ssh 是我所说的推送方法。我不能说哪种方法更适合你的情况,但这可能是值得考虑的事情。
运行多个命令:
我不明白您是指在多个命令的每次迭代中都保持会话打开,还是让它始终打开。如果是前者,您可以在命令之间使用分号,或者使用 && 来确保只有第一个命令有效时才会执行下一个命令。例如:
#bar echoed only if foo exists and can be read
ssh myServer 'cat foo && echo bar'
ssh myServer 'cat foo; echo bar'
如果您想在 shell 中指定某些内容的用途,也可以执行以下操作:
ssh myServer "bash -c 'cat foo && echo bar'"
最后,您可以将脚本放在每台服务器上,然后运行它。
答案3
“expect”工具也可以完成您想要的操作,但涉及编写 tcl。
答案4
您可以通过在远程系统上启动 shell 并向其传递命令来按顺序运行多个命令:
ssh server "echo this is; all in one session"
将自动将带引号的字符串传递到远程 shell。不过,请注意 shell 的引号规则!