runuser
util-linux(루트에서 부팅할 때만 실행되는 다른 진입점 )를 사용하면 su
다음과 같은 프로세스 트리가 표시됩니다.
[root] runuser -u username sometool
\- [username] sometool
exec
단순히 권한을 포기하고 대상에 액세스하는 대신 이 상위 프로세스를 유지하는 목적은 무엇입니까?
답변1
맨페이지에서 볼 수 있듯이:
--session-command=command -c와 동일하지만 새 세션을 생성하지 않습니다(권장되지 않음).
따라서 새 세션에는 새 PID가 필요하므로 기본 호출에는 새 프로세스를 만들어야 합니다.
또한 반환 코드는 프로세스를 종료한 종료 상태 또는 신호에 따라 달라집니다. 마지막 지점에서는 하위 프로세스의 상태를 모니터링하는 프로세스도 필요합니다.
나는 이것이 의도적으로 설계된 것이라고 생각합니다. IMO와 달리 su
스크립트 runuser
에서 사용됩니다(따라서 비밀번호를 묻지 않고 오류 상태를 더 잘 처리하며 신호 처리(새 세션)를 호출자와 분리합니다.
답변2
이 상위 프로세스를 유지하는 목적은 무엇입니까?
create_watching_parent
소스 코드를 주의 깊게 읽었습니다 su-common.c
. 부모는 다음을 수행할 수 있도록 근처에 있는 것 같습니다.
cleanup_pam
자식이 종료된 후 부모가 호출함- 신호로 인해 자식 프로세스가 종료되면 부모 프로세스는 쉘처럼 자식 프로세스의 처리 상태를 (stderr에) 인쇄합니다.
- 상위 프로세스가 SIGINT, SIGQUIT 또는 SIGTERM 신호를 수신하면 상위 프로세스는 신호를 포착하고 SIGTERM 및 SIGKILL을 사용하여 하위 프로세스를 종료한 다음 수신된 동일한 신호를 사용하여 자체 종료합니다. 하위 프로세스가 다른 세션이나 pgrp에 들어갈 경우 사용자가 명령을 직접 종료할 수 있도록 이 작업을 수행하고 싶습니다.
답변3
다른 답변을 보완하기 위해 util-linux에서 포크하지 않는 명령은 다음과 같습니다.권한 설정:
# setpriv --reuid=django --regid=django --inh-caps=-all --reset-env --clear-groups ./run-server