“存储”远程 SSH 会话?

“存储”远程 SSH 会话?

我正在尝试在脚本中完成这些操作。我必须在远程主机上运行一些命令。目前,我正在这样做:

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

您可以使用ControlMasterControlPersist允许连接在命令终止后继续存在:

与 结合使用时ControlMaster,指定在初始客户端连接关闭后,主连接应在后台保持打开状态(等待将来的客户端连接)。如果设置为no,则主连接将不会置于后台,并且会在初始客户端连接关闭后立即关闭。如果设置为yes0,则主连接将无限期地保留在后台(直到通过“ 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'

相关内容