Ssh

執行遠端命令,完全脫離 ssh 連接

  • March 25, 2015

我有 2 台電腦,localpcremoteserver.

我需要localpcremoteserver. 它需要做的一件事是啟動一個執行數小時的備份腳本。我希望命令localpc“開火”,然後完全獨立執行remoteserver,就像localpc一開始就沒有一樣。

這是我到目前為止所做的:

remoteserver包含有腳本:

/root/backup.sh

localpc計劃執行這個:

ssh root@remoteserver 'nohup /root/backup.sh' &

我這樣做對嗎?有一個更好的方法嗎?我這樣做會遇到什麼麻煩嗎?

您可能應該screen在遠端主機上使用,以獲得真正的分離命令:

ssh root@remoteserver screen -d -m ./script

關閉,但不完全正確。

獨立於任何終端

ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

您需要關閉所有連接到 ssh 套接字的文件描述符,因為只要某個遠端程序打開了套接字,ssh 會話就不會關閉。如果您對腳本的輸出不感興趣(可能是因為腳本本身負責寫入日誌文件),請將其重定向到/dev/null(但請注意,這將隱藏錯誤,例如無法啟動腳本)。

使用nohup在這裡沒有有用的效果。nohup如果程序的控制終端消失,則安排它執行的程序不接收 HUP 信號,但是這里首先沒有終端,所以沒有什麼會突然向程序發送 SIGHUP。此外,nohup將標準輸出和標準錯誤(但不是標準輸入)重定向到文件,但前提是它們連接到終端,而終端又不是。

從終端分離

aaron@localpc$ ssh root@remoteserver
root@remoteserver# nohup /root/backup.sh </dev/null &
nohup: appending output to `nohup.out'
[1] 12345
root@remoteserver# exit
aaron@localpc$ 

用於將腳本與其控制終端分離,以便在終端消失時nohup它不會收到SIGHUP 。還將腳本的標準輸出和標準錯誤重定向到連接到終端時nohup呼叫的文件;nohup.out您必須自己處理標準輸入。

保留遠端終端

如果您想保持命令在遠端終端中執行但不將其附加到 SSH 會話,請在終端多路復用器(例如ScreenTmux )中執行它。

ssh root@remoteserver 'screen -S backup -d -m /root/backup.sh'

screen -S backup -rd您可以稍後通過在該電腦上以 root 身份呼叫來重新連接到執行腳本的終端。

自動化一個遠端命令

為了稍微更好的安全性,不要過於廣泛地打開直接遠端 root 登錄。創建一個專用密鑰對並在/root/.ssh/authorized_keys. 公鑰文件的內容是AAAA…== wibble@example.com;添加以逗號分隔的選項列表,包括command="…"指定密鑰只能用於執行此特定命令。確保將選項和密鑰全部放在一行中。

command="/root/backup.sh </dev/null >/dev/null 2>/dev/null &",no-port-forwarding,no-agent-forwarding,no-x11-forwarding,no-pty,no-user-rc AAAA…== wibble@example.com

引用自:https://unix.stackexchange.com/questions/30400