如何在一段時間內建立與「流」命令的持久 SSH 連線?

如何在一段時間內建立與「流」命令的持久 SSH 連線?

假設我有一個應用程式在一台 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 自動持久化

您也可以使用ControlMasterOpenSSH 的功能,它為第一個連線開啟一個 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

這將在主機2上執行命令 echo "hi"

你只需要編寫一個程序,只給出命令(不要忘記 ; ),然後將輸出通過管道傳輸到 ssh

相關內容