哪個 shell 會使用 sudo 來執行沒有 shebang 行的 shell 腳本

哪個 shell 會使用 sudo 來執行沒有 shebang 行的 shell 腳本

我的環境是Ubuntu 12.04 LTS,sudo版本是1.8.3p1。

首先我以一般使用者登入:

$ 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

我想最後的輸出也應該是bash因為/etc/passwd顯示 root 使用bash,我是否遺漏了任何要點sudo

答案1

它的使用_PATH_BSHELL類似於execvp()Linux 上的定義,/bin/sh/usr/include/paths.h.這應該與使用envor執行時相同find -exec

它當然不應該使用使用者的登入 shell。您在上面看到的事實bash是因為它bash(您輸入該命令行的 shell)嘗試執行它,並且當它ENOEXEC從中獲取錯誤代碼時execve,它決定用自己來解釋它(在sh兼容模式下)。

答案2

因為您不使用-s選項,所以sudo將使用(在 Ubuntu 12.04 LTS 中_PATH_BSHELL定義)來設定它運行。查看原始碼:/usr/include/paths.h$SHELLsudo

/* Stash user's shell for use with the -s flag; don't pass to plugin. */
    if ((ud->shell = getenv("SHELL")) == NULL || ud->shell[0] == '\0') {
    ud->shell = pw->pw_shell[0] ? pw->pw_shell : _PATH_BSHELL;
    }

如果您使用-s選項,sudo將使用您的$SHELL而不是_PATH_BSHELL

$ cat ./test.sh
ps | grep "$$" | awk '{ print $4 }'

$ ./test.sh
bash

$ sudo -s ./test.sh
bash

答案3

核心只能運行二進制可執行映像。那麼腳本如何運作呢?畢竟,我可以my_script_without_shebang在 shell 提示字元下鍵入並且不會收到ENOEXEC錯誤。腳本的執行不是由內核完成的,而是由 shell 完成的。 shell 中的執行程式碼通常類似:

/* try to run the program */
execl(program, basename(program), (char *)0);

/* the exec failed -- maybe it is a shell script without shebang? */
if (errno == ENOEXEC)
    execl ("/bin/sh", "sh", "-c", program, (char *)0);

您可以透過追蹤虛擬 shell 腳本(不使用 shebang)來驗證這一點:

cat > /tmp/foo.sh <<EOF
echo
EOF

chmod u+x /tmp/foo.sh

strace /tmp/foo.sh 2>&1 | grep exec
execve("/tmp/foo.sh", ["/tmp/foo.sh"], [/* 28 vars */]) = -1 ENOEXEC (Exec format error)

然後,按照 Stephane 的描述繼續執行 - 使用預設 shell(在上面的程式碼片段中是硬編碼的)。這個不錯的 UNIX 常見問題解答可以回答更多。

相關內容