Shebangs는 OSX에서 sudo를 좋아하지 않습니다.

Shebangs는 OSX에서 sudo를 좋아하지 않습니다.

Shebang에서 sudo를 사용하는 것은 완전히 손상된 것 같습니다. 다음 코드:

#!/usr/bin/sudo /bin/bash
echo "this should work"

Ubuntu에서는 잘 작동하지만 OSX에서는 다음을 제공합니다.

sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 
'nosuid' option set or an NFS file system without root privileges?

이것을 작동시키는 방법에 대한 아이디어가 있습니까?

참고: sudo는 그렇지 않은 경우에도 잘 작동합니다.

/usr/bin/sudo echo "This works"
Password:
This works

답변1

OS X 커널이 shebang 라인을 통해 인터프리터를 시작할 때 인터프리터 실행 파일에서 setuid 비트를 확인하지 않는 것으로 보입니다. 아마도 보안 조치로 간주될 수도 있지만 버그로 간주되어야 합니다. 하지만 그렇다면 매우 간단한 해결 방법이 있기 때문에 그다지 유용하지 않습니다.

#!/usr/bin/env /usr/bin/sudo /bin/bash
echo "running as $USER"

...이렇게 하면 커널이 스크립트를 /usr/bin/env(setuid를 확인하지 않고 여기서는 중요하지 않음)로 전달하고, 이 스크립트는 이를 /usr/bin/sudo(일반 시작 프로세스를 통해)로 전달합니다.하다setuid 플래그를 따르십시오. 이 플래그는 루트로 전환하고 스크립트를 /bin/bash에 전달합니다.

(BTW #!/usr/bin/env /usr/bin/sudo /usr/bin/ruby도 작동합니다.)

답변2

해결 방법을 찾았지만 더 좋은 방법이 있는지 알고 싶습니다.

원래는 Ruby 스크립트용이었습니다. Ruby를 사용하면 다음을 수행할 수 있다는 것을 알았습니다.

#!/bin/bash
echo "sudo-running ${BASH_SOURCE[0]}"
sudo ruby "${BASH_SOURCE[0]}"
exit $?

#!ruby
puts "It works! File is #{__FILE__}"

물론 이것은 Ruby에서만 작동합니다 :)

관련 정보