假設我有一個應用程式在一台 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
這將在主機2上執行命令 echo "hi"
你只需要編寫一個程序,只給出命令(不要忘記 ; ),然後將輸出通過管道傳輸到 ssh