執行遠端命令,完全脫離 ssh 連接
我有 2 台電腦,
localpc
和remoteserver
.我需要
localpc
在remoteserver
. 它需要做的一件事是啟動一個執行數小時的備份腳本。我希望命令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 會話,請在終端多路復用器(例如Screen或Tmux )中執行它。
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