Meine Umgebung ist Ubuntu 12.04 LTS und die sudo
Version ist 1.8.3p1.
Zuerst logge ich mich als normaler Benutzer ein:
$ whoami
fin
$ cat /etc/passwd | grep -i "root\|fin"
root:x:0:0:root:/root:/bin/bash
fin:x:1000:1000:This is a normal user:/home/fin:/bin/bash
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 30 2012 /bin/sh -> dash
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 920788 Apr 3 2012 /bin/bash
$ echo $SHELL
/bin/bash
$ ps | grep "$$" | awk '{ print $4 }'
bash
$ ls -l ./test.sh
-rwxr-xr-x 1 fin fin 37 Sep 27 16:46 test.sh
$ cat ./test.sh
ps | grep "$$" | awk '{ print $4 }'
$ ./test.sh
bash
$ sudo ./test.sh
sh
Ich nehme an, die letzte Ausgabe sollte auch sein, bash
weil /etc/passwd
zeigt, dass root verwendet bash
, fehlen mir irgendwelche Punkte sudo
?
quelle
sh
oder analysiert werden soll,/etc/passwd
wenn einENOEXEC
Fehler auftritt .sudo
die Anmeldeshell des Benutzers wird nur verwendet, wenn Sie ihm mitteilen, dass Sie ihm eine Befehlszeile übergeben möchten, die von einer Shell (mit -s) interpretiert werden soll, im Gegensatz zu einem auszuführenden Befehl. Wenn ein Befehl ausgeführt werden soll, verhält er sich soexecvp
, als ob das System Befehle ausführen soll.sudo
Richten Sie die Ausführungsumgebung immer vor dem Aufruf von einexecve()
. Wenn Sie nicht bestehen-s
, wird sudo verwenden_PATH_BSHELL
.execvp()
. Es kann auch _PATH_BSHELL mit -s verwenden, wenn die Ausführung$SHELL
ENOEXEC zurückgibt. Weitere Einzelheiten finden Sie in meinem Kommentar zu Ihrer Antwort.Da Sie die
-s
Option nicht verwenden ,sudo
wird sie auch verwendet_PATH_BSHELL
(was in/usr/include/paths.h
Ubuntu 12.04 LTS definiert ist), um die$SHELL
Ausführung festzulegen . Blick in densudo
Quellcode:Wenn Sie die
-s
Option verwenden,sudo
verwenden Sie Ihre$SHELL
anstelle von_PATH_BSHELL
:quelle
-s
dies nicht bedeutet, dass das Skript von interpretiert wird$SHELL
, sondern nur, dass$SHELL
der Befehl (vorausgesetzt, Sie wurden zur Verwendung als Zielbenutzer autorisiert ) als gestartet wird$SHELL -c ./test.sh
. Shells mögenbash
,yash
oderksh93
können die sie Bang lose Skripte mit einer Kopie von sich selbst, andere nicht und nennen würde das System ist zu interpretieren ,sh
statt.exec($SHELL, "-c", "./test.sh")
bedingungslos anstelle vonif (exec("./test.sh") == ENOEXEC) exec(_PATH_BSHELL, "./test.sh")
(Pseudocode).Der Kernel kann nur ausführbare Binärbilder ausführen. Wie werden Skripte ausgeführt? Immerhin kann ich
my_script_without_shebang
an einer Shell-Eingabeaufforderung tippen und bekomme keineENOEXEC
Fehlermeldung. Die Skriptausführung erfolgt nicht durch den Kernel, sondern durch die Shell. Der Exec-Code in der Shell sieht normalerweise so aus:Sie können dies überprüfen, indem Sie ein Dummy-Shell-Skript ohne Shebang verfolgen:
Die Ausführung erfolgt also wie von Stephane beschrieben - die Standard-Shell wird verwendet (im obigen Code-Snippet ist sie fest codiert). Diese nette UNIX-FAQ kann mehr beantworten.
quelle