대신, 새 사용자 ID로 새 쉘 프로세스를 시작합니다. 원래 쉘은 새 쉘이 완료되고 su가 종료될 때까지 차단됩니다. 왜 그럴까요?
답변1
간단합니다. 왜냐하면 그럴 수 없기 때문입니다. 다른 프로세스의 uid를 변경하기 위한 시스템 호출은 없습니다. 상위 셸이 종료될 때까지 기다리지 않으려면 내장 명령을 su
앞에 추가하세요. exec
이렇게 하면 먼저 분기하지 않고 셸이 직접 실행됩니다. 물론 잘못된 비밀번호를 입력하면 돌아갈 쉘이 없으므로 세션이 종료됩니다.
답변2
이미 지적했듯이 이를 수행할 수 있는 방법은 없습니다. 물론 뜻이 있으면 방법이 있다. 그런 시스템 콜이 없다는 것이 이유는 아니다.할 수 없다완성된. 즉 말하자면,의견에서 mtk가 언급했듯이관련 없는 프로세스의 보안 컨텍스트를 변경하기 위해 시스템 호출을 사용하면 발생할 수 있는 혼란을 상상해 보십시오. 다른 것이 없다면 경쟁 조건이 3...2...1...로 발생하는 것을 보게 될 것입니다. (그리고 우리는 init
보안 컨텍스트를 변경하거나 getty
할 수 있는 것이 무엇인지 이해조차 하지 못합니다.)
하나다른왜냐하면su
새로운 쉘을 호출할 뿐만 아니라. 또한 어떤 쉘이 시작되는지( -s
또는 사용) 제어하고 --shell
(GNU에서) / -
/ -l
및 --login
( -c
) 인수를 통해 --command
인수를 전달하여 이를 제어할 수 있습니다 . su에 전달된 인수는 새 쉘의 환경에도 영향을 미칩니다. 그러니 당신이할 수 있다상위 프로세스의 보안 컨텍스트를 변경하기만 하면 반드시 그럴 필요는 없습니다.생각하다이 방법.