다른 사용자, 해당 사용자로만 스크립트를 실행할 수 있기를 원합니다.
현재 제가 설정한 방식은
alice ALL = (bob) NOPASSWD: /home/alice/script.sh
sudoers 파일에서
alice@foo:~$ ls script.sh
-rwxr-xr-x 1 root root ..... script.sh
alice@foo:~$ lsattr script.sh
----i----------- script.sh
alice@foo:~$ head -1 script.sh
#!/bin/bash
alice@foo:~$ sudo -u bob ./script.sh
ok
쉐뱅라인을 이렇게 만들 수 있는 방법이 없을까요?
#!/usr/bin/sudo -u bob -- /bin/bash
앨리스가 도망갈 수 있게
alice@foo:~$ ./script.sh
ok
?
이 작업을 시도하면 오류 메시지가 나타납니다.
sudo: unknown user: blog -- /bin/bash
sudo: unable to initialize policy plugin
답변1
Linux(다른 많은 Unix 변형과 마찬가지로)는 스크립트 인터프리터에 단일 인수 전달만 지원합니다. (인터프리터는 shebang 라인에 있는 프로그램입니다.) 로 시작하는 스크립트는 #!/usr/bin/sudo -u bob -- /bin/bash
인수와 를 호출하여 실행됩니다./usr/bin/sudo
-u bob -- /bin/bash
/home/alice/script.sh
한 가지 해결책은 래퍼 스크립트를 사용하는 것입니다 /home/alice/script.sh
.
#!/bin/sh
exec sudo -u bob /home/alice/script.real
그리고 코드를 /home/alice.script.real
시작 부분 에 넣고 #!/bin/bash
sudo 규칙에서 참조되도록 만드세요 /home/alice.script.real
.
또 다른 해결책은 스크립트가 자체적으로 다시 실행되도록 하는 것입니다. 필요한 조건을 올바르게 감지하도록 주의해야 합니다. 그렇지 않으면 무한 루프가 생성될 위험이 있습니다.
#!/bin/bash
if ((EUID != 123)); then
exec sudo -u \#123 /home/alice/script.sh
fi
(여기서 123은 사용자 ID입니다 bob
)
간단한 해결책은 사람들에게 sudo -u bob /home/alice/script.sh
스크립트를 직접 실행하는 대신 실행하라고 지시하는 것입니다. 셸 별칭, .desktop
파일 등을 제공할 수 있습니다 .
답변2
별칭을 사용해 보세요.
alias bobscript="sudo -u bob ./script.sh"
그리고 다음을 실행하세요:
bobscript
답변3
스크립트 내에서 sudo를 호출하지 않는 것이 가장 좋은 방법일 수 있지만, 쉬운 방법은 env -S
shebang 라인에 더 많은 매개변수를 전달하는 것입니다.
#!/usr/bin/env -S /usr/bin/sudo -- /bin/bash
# ...
또는 더 작은 줄의 경우:
#!/usr/bin/env -S sudo bash
# ...