SSHが終了する前に、SSHを介してサーバー上で「予約済み」/遅延スクリプトをsudoとして実行します。

SSHが終了する前に、SSHを介してサーバー上で「予約済み」/遅延スクリプトをsudoとして実行します。

これは答えることができるSSH経由でスクリプトを実行し続けます。、スーパーユーザーでコマンドを実行する必要がない場合。たとえば、見てみましょう。私のサーバーに次のスクリプト~/testsleep.shもあるとしましょうchmod +x

#!/usr/bin/env bash

logger Pre sleep: "$USER" / "$USERNAME" / "$1"

sleep 5

logger Post sleep: "$USER" / "$USERNAME" / "$1"

stdout / stderrが失われる可能性があるため、ログインしたいとlogger思います。/var/log/syslogssh

sshローカルPCでこのプログラムを実行し、リモートサーバーを介してログインしているとします。

server$ readlink -f ~/testsleep.sh 
/home/user/testsleep.sh

server$ $ ls -la testsleep.sh 
-rwxr-xr-x 1 user user 126 2015-02-05 13:35 testsleep.sh

server$ sudo /home/user/testsleep.sh some_argument
sudo: unable to execute /home/user/testsleep.sh: No such file or directory

sudo最初の問題は、次を使用してスクリプトを直接実行できないことです。現在、シェルは通常のユーザーIDで実行されており、rootアクセス権を付与できません。sudoPermissions_shell_Stackを使用して現在のシェルでシェルスクリプトを実行する

わかりました、わかりました、走りますsudo bash。それでは、次のように見えます。

server$ sudo bash /home/user/testsleep.sh some_argument

server$ tail -2 /var/log/syslog
Feb  5 13:40:48 user user: Pre sleep: root / root / some_argument
Feb  5 13:40:53 user user: Post sleep: root / root / some_argument

明らかにスクリプトがログインし、期待どおりにsyslog表示されます。今まではそんなに良くなった。root$USER

sshこれで、ターミナルセッションを終了する前に、このスクリプトをサーバーのプロセスとして実行したいと思います。私はこのように思う:

server$ sudo bash /home/user/testsleep.sh from_end & exit
[1] 6293
logout
Connection to 127.1.100.99 closed.
local$

サーバーに再度ログインしてsyslog再確認すると、最後の「exit」呼び出しにログがないことがわかります。

# this `grep` will print the filename, if file doesn't contain the match:

server$ grep --files-without-match 'from_end' /var/log/syslog
/var/log/syslog
server$ tail -2 /var/log/syslog
Feb  5 13:40:48 mypc user: Pre sleep: root / root / some_argument
Feb  5 13:40:53 mypc user: Post sleep: root / root / some_argument

だから私の質問は - このスクリプトをサーバーのsudoからプロセスとして実行する方法です。ただし、sshシェルから呼び出して終了する前に実行するようにしてください(この場合は作成して確認してくださいsyslog)。

答え1

disown接続が「中断」しても終了しないようにするには、次のものが必要です。

sudo bash /home/user/testsleep.sh from_end & sleep 1; disown -h; exit

そのsleep 1目的は、バックグラウンドジョブの開始とシェルの終了間の競争を減らすことです。 1行にすべての操作を実行したくない場合は、2つのコマンドセットを分離してより良い結果を得ることができます。

sudo bash /home/user/testsleep.sh from_end &
disown -h; exit

関連情報