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에서만 작동합니다 :)