我正在尝试在脚本中完成这些操作。我必须在远程主机上运行一些命令。目前,我正在这样做:
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
但我不确定它是否可以在脚本中使用。
答案1
您可以使用ControlMaster
和ControlPersist
允许连接在命令终止后继续存在:
与 结合使用时
ControlMaster
,指定在初始客户端连接关闭后,主连接应在后台保持打开状态(等待将来的客户端连接)。如果设置为no
,则主连接将不会置于后台,并且会在初始客户端连接关闭后立即关闭。如果设置为yes
或0
,则主连接将无限期地保留在后台(直到通过“ssh -O exit
”等机制杀死或关闭)。如果设置为以秒为单位的时间,或采用 中记录的任何格式的时间sshd_config(5)
,则后台主连接将在保持空闲状态(没有客户端连接)指定的时间后自动终止。
因此,第一个 SSH 命令将为连接设置一个控制文件,另外两个命令将通过该控制文件重用该连接。你~/.ssh/config
应该有类似的东西:
Host host
User root
ControlMaster auto
ControlPath /tmp/ssh-control-%C
ControlPersist 30 # or some safe timeout
并且您的脚本不需要任何其他更改。
答案2
你可以从一个提示类似的问题在 StackOverflow 上并使用 bash这里的文档:
ssh root@host 'bash -s' << EOF
command1
command2
command3
EOF
答案3
你可以使用expect
脚本。它可以自动化 ssh 连接并在远程机器上运行命令。这段代码应该对 ssh 连接自动化有一些启发。
你正在寻找这样的东西。将以下代码存储在文件中foo.expect
#login to the remote machine
spawn ssh username@hostname
expect "?assword" { send "yourpassword\r"}
#execute the required commands; following demonstration uses echo command
expect "$ " {send "echo The falcon has landed\r"}
expect "$ " {send "echo The falcons have landed\r"}
expect "$ " {send "echo Will the BFR? land? \r"}
#exit from the remote machine
expect "$ " {send "exit\r"}
运行它作为expect foo.expect
您需要期望应用程序运行此脚本。可以用命令安装apt-get install expect
这本书将帮助您探索期望脚本。快乐的脚本编写!
答案4
您可以使用cat
连接所有文件,然后将它们通过管道传送到ssh
.
cat command1 command2 command3 | ssh root@host 'bash -s'