我正在尝试在脚本中执行这些操作。我必须在远程主机上运行一些命令。目前,我正在这样做:
ssh root@host 'bash -s' < command1
ssh root@host 'bash -s' < command2
ssh root@host 'bash -s' < command3
但是,这意味着我必须重复连接到服务器,这增加了处理命令之间的大量时间。我正在寻找这样的东西:
varSession=$(ssh root@host 'bash -s')
varSeesion < command1
varSeesion < command2
varSeesion < command3
同样,我需要通过脚本运行这些命令。我看过screen
但我不确定它是否可以在脚本中使用。
您可以使用
ControlMaster
andControlPersist
允许在命令终止后保持连接:因此,第一个 SSH 命令将为连接设置一个控制文件,另外两个将通过该控制文件重用该连接。你
~/.ssh/config
应该有类似的东西:而且您的脚本不需要任何其他更改。
您可以从 StackOverflow 上的类似问题中获得提示,并使用 bash Here 文档:
您可以使用
expect
脚本。它可以自动化 ssh 连接并在远程机器上运行命令。这段代码应该对自动化 ssh 连接有所帮助。你正在寻找这样的东西。将以下代码存储在文件中
foo.expect
运行它
expect foo.expect
您需要期望应用程序来运行此脚本。可以用命令安装
apt-get install expect
本书将帮助你探索expect脚本。快乐的脚本!
一个或多个SSH连接的独立文件描述符
除了穆鲁的回答
ControlPath
提出的ControlPersist
正确方法之外,我想提出一个替代方案:方法
创建一个用于 ssh 输出的 fifo
您必须在您有信心的路径中创建此文件
运行长时间运行的命令:
那么现在你不再需要fifo了
您现在已准备好从您的连接发送和接收命令:
注意:
0.002 seconds
在互联网连接不佳时可能不够用...超时可能无用,具体取决于请求的类型。总而言之,这可以适应关注哪种对话。等等...
这将一直存在,直到您明确关闭此连接:
更远
这并不完美。你可以
也绑定STDERR,使用第二个 fifo
使用交互式 bash,然后减少超时
...然后观察
/^ReAdY aS BoUnD$/
fromfd/10
作为最后一个命令执行结束的标记,您可以避免 STDERR (-u 10
) 的超时,然后减少STDOUT (-u 9 -t .002
) 的超时。从那里
甚至可以打开多个连接一起使用
然后
同时向两端发送相同的命令...
您可以使用
cat
连接所有文件,然后将它们通过管道传输到ssh
.