假设我在一台 PC 上运行一个应用程序,该应用程序通过 SSH 向网络上的另一台 PC 发送命令(两台机器都运行 Linux)。
例如,每次 #1 上发生某事时,我都想在 #2 上运行一项任务。在此设置中,我必须在每个命令上创建 SSH 连接。
有没有简单的方法可以使用基本的unix工具来做到这一点,而无需编写自定义客户端/服务器应用程序?基本上我想要的是通过SSH建立连接,然后一个接一个地发送命令。
答案1
不确定它是否可以在生产中使用,但您可以执行以下操作:
在 #1 上创建文件
1>touch /tmp/commands
然后运行命令:
1>tail -f /tmp/commands | ssh [email protected]
这将打开文件 /tmp/commands 并开始将其内容发送到服务器 xxxx (#2),然后逐行运行
现在,每次在 #1 上发生某事时,请执行以下操作:
1>echo "ls -l" >> /tmp/commands
或者
1>echo "reboot" >> /tmp/commands
任何你添加到文件 /tmp/commands 的内容都将发送到 #2 并执行。请确保你没有运行任何交互操作,或者以某种方式处理它。
答案2
使用 OpenSSH 自动持久化
您还可以使用ControlMaster
OpenSSH 的功能,它为第一次连接打开一个 unix 域套接字,并在所有后续调用中重用此连接。
要启用该功能,您可以使用-M
命令行开关或启用ControlMaster
您的选项~/.ssh/ssh_config
,例如:
ControlMaster auto
此外,您还应ControlPath
使用以下几行进行设置~/.ssh/ssh_config
:
Host *
ControlPath ~/.ssh/master-%r@%h:%p
为了维持与主机的持久连接,例如,如果您要运行一个脚本,该脚本需要与主机建立许多 ssh 连接,而这些连接在脚本的整个生命周期内都不会持久,您可以使用以下命令提前启动一个静默连接:
ssh -MNf remotehost
再见,我爱你
答案3
添加/etc/ssh/ssh_config
# Send keep alive signal to remote sshd
ServerAliveInterval 60
答案4
是的,用管道是可能的:
echo 'echo "hi"' | ssh -i my_private_key tester@host2
这将在 host2 上执行命令 echo "hi"
你只需要编写一个程序,只给出命令(不要忘记;),然后将该输出通过管道传输到 ssh