Die Verwendung von sudo im Shebang scheint völlig kaputt zu sein. Der folgende Code:
#!/usr/bin/sudo /bin/bash
echo "this should work"
funktioniert unter Ubuntu einwandfrei, aber unter OSX erhalte ich Folgendes:
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?
Irgendwelche Ideen, wie man das zum Laufen bringt?
Hinweis: Ansonsten funktioniert sudo einwandfrei:
/usr/bin/sudo echo "This works"
Password:
This works
Antwort1
Es scheint, dass der OS X-Kernel, wenn er einen Interpreter über eine Shebang-Zeile startet, nicht nach dem Setuid-Bit in der ausführbaren Datei des Interpreters sucht. Dies sollte wahrscheinlich als Fehler betrachtet werden, obwohl es möglich ist, dass es als Sicherheitsmaßnahme betrachtet wird ... aber wenn ja, ist es nicht sehr nützlich, da es eine ziemlich einfache Problemumgehung gibt:
#!/usr/bin/env /usr/bin/sudo /bin/bash
echo "running as $USER"
...dadurch übergibt der Kernel das Skript an /usr/bin/env (ohne nach Setuid zu suchen, aber das spielt hier keine Rolle), das es an /usr/bin/sudo weiterleitet (über den normalen Startvorgang, dertutbeachtet das Flag „setuid“), das zu root wechselt und das Skript an /bin/bash übergibt.
( #!/usr/bin/env /usr/bin/sudo /usr/bin/ruby
Funktioniert übrigens auch.)
Antwort2
Ich habe eine Problemumgehung gefunden, würde aber gerne wissen, ob es eine bessere Möglichkeit gibt, dies zu tun.
Die ursprüngliche Verwendung war für ein Ruby-Skript gedacht. Ich habe herausgefunden, dass man mit Ruby Folgendes tun kann:
#!/bin/bash
echo "sudo-running ${BASH_SOURCE[0]}"
sudo ruby "${BASH_SOURCE[0]}"
exit $?
#!ruby
puts "It works! File is #{__FILE__}"
Das funktioniert natürlich nur in Ruby :)