sudoersで参照されている操作はKillコマンドでまだ失敗します。

sudoersで参照されている操作はKillコマンドでまだ失敗します。

Node-REDでConnManを再起動したいです。サービスは独自のユーザーによって実行されますnodered

ユーザーとしてデバイスにSSHを入力しnoderedて入力すると、

nodered@pi:~$ sudo /etc/init.d/connman restart

これはうまくいきます。

ただし、電話をかけてvisudo次の行を追加すると、次のようになります。

nodered ALL = (root) NOPASSWD: /etc/init.d/connman restart

コマンドを実行すると、次のエラーが発生します。

nodered@pi:~$ /etc/init.d/connman restart
Restarting Connection Manager
/etc/init.d/connman: line 47: kill: (28874) - Operation not permitted

失敗した行は次/etc/init.d/connmanのとおりです。

do_stop() {
        # kill the script monitoring execution
        if [ "X${pid=$(pidof -x /usr/sbin/connmand-watch.sh)}" != "X" ]; then
                kill $pid 

答え1

サービスとその監視者の両方がユーザーとして実行されていて、nodered同じユーザーとしてログインしている場合は、sudoまったくそうする必要はありません。プロセス所有者には、kill -9必要に応じて常にそのプロセスを終了する権利があります。

このsudoers行は:

nodered ALL = (root) NOPASSWD: /etc/init.d/connman restart

noderedユーザーに root でコマンドを実行する権限を与えます/etc/init.d/connman restart。スクリプトまたはサービス自体がサービスとウォッチャーの両方がユーザーとして開始されていることを確認できない場合、スクリプトを実行するnoderedと、サービスおよび/またはスクリプトがルート所有プロセスで再起動されることを意図しないsudo副作用が発生する可能性があります。connmand-watch.sh注意してください。

を使用すると、kill -0実際にシグナルを送信せずにプロセスを終了できるかどうかをテストできます。スクリプトの冒頭で次のことができます/etc/init.d/connman

if [ $(whoami) != "root" ]; then
    watcherpid=$(pidof -x /usr/sbin/connmand-watch.sh)
    if [ "" != "$watcherpid" ] && ! kill -0 "$watcherpid" 2>/dev/null; then
        # Watcher exists but cannot be signaled so it runs as some other user.
        # Attempt to re-execute this script with root powers.
        exec sudo /etc/init.d/connman "$@"
        # If we reach this line, we could not exec sudo. That's bad.
        exit 1
    fi
fi

を使用すると、exec sudo /etc/init.d/connman "$@"スクリプトはsudoを介して再実行されます。その後exec、スクリプトの権限のない通常のコピーの実行はすぐに終了し、sudoedバージョンはそれを元の呼び出しと同じコマンドライン引数に置き換えます。

ウォッチャープロセスが見つからない場合、またはスクリプトがすでにrootとして実行されている場合、このテストは失敗し、アクションは必要ありません。

注:スクリプトがそれ自体で再実行しようとしてsudo失敗しようとすると、スクリプトは何もせずに停止します。

関連情報