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사용자에게 루트로 명령을 실행할 수 있는 권한을 부여합니다 /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 버전은 이를 원래 호출과 동일한 명령줄 인수로 대체합니다.

감시자 프로세스를 찾을 수 없거나 스크립트가 이미 루트로 실행 중인 경우 이 테스트는 실패하며 조치가 필요하지 않습니다.

참고: 스크립트가 자체적으로 다시 실행을 시도 sudo하고 시도가 실패하면 스크립트는 어떤 작업도 수행하지 않고 중지됩니다.

관련 정보