shebang 라인의 `sudo -u user`

shebang 라인의 `sudo -u user`

다른 사용자, 해당 사용자로만 스크립트를 실행할 수 있기를 원합니다.

현재 제가 설정한 방식은

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/bashsudo 규칙에서 참조되도록 만드세요 /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 -Sshebang 라인에 더 많은 매개변수를 전달하는 것입니다.

#!/usr/bin/env -S /usr/bin/sudo -- /bin/bash

# ...

또는 더 작은 줄의 경우:

#!/usr/bin/env -S sudo bash

# ...

관련 정보