閉じますが、正確ではありません。
ターミナルに依存しない
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$
ターミナルが消えたときにSIGHUPをnohup
受け取らないように、制御ターミナルからスクリプトをデタッチするために使用します。また、スクリプトの標準出力と標準エラーを、端末に接続されている場合に呼び出されるファイルにリダイレクトします。自分で標準入力を処理する必要があります。nohup
nohup.out
リモート端末を維持する
コマンドをリモートターミナルで実行したままSSHセッションにアタッチしない場合は、ScreenやTmuxなどのターミナルマルチプレクサで実行します。
ssh root@remoteserver 'screen -S backup -d -m /root/backup.sh'
screen -S backup -rd
そのマシンでrootとして起動することにより、後でスクリプトが実行されている端末に再接続できます。
1つのリモートコマンドを自動化する
セキュリティを若干向上させるために、直接リモートルートログインをあまり広く開かないでください。特殊な目的のキーペアを作成し、に強制コマンドを与え/root/.ssh/authorized_keys
ます。公開鍵ファイルの内容は次のとおりですAAAA…== wibble@example.com
。command="…"
この特定のコマンドの実行にのみキーを使用できることを指定するオプションを含む、オプションのコンマ区切りリストを追加します。オプションとキーはすべて1行で入力してください。
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