Bash

為什麼 sudo ‘-i’ 選項會破壞變數擴展?

  • October 18, 2022

這正如我所料:

$ sudo -u romain bash -c 'a="b" ; echo $a'
b
$

但是對於’-i’,變數沒有回顯,為什麼?:

$ sudo -iu romain bash -c 'a="b" ; echo $a'

$

我想知道 ‘-i’ 是否添加了 bash 間接/變數插值級別,但如果是,這如何工作?:

$ sudo -iu romain bash -c 'a="b" ; echo ${a}'
b
$

當您使用-iwith 時sudo,將使用使用者的登錄 shell ,$SHELL並將作為登錄 shell 呼叫。

當您另外給命令一個要執行的命令時,如

sudo -u user -i 'some-command'

…將在轉義 中的每個字元後sudo執行該命令,但字母數字、下劃線、連字元和美元符號除外。$SHELL -c``some-command

這意味著

sudo -u user -i bash -c 'a="b" ; echo ${a}'

將以使用者身份執行user,轉義為

$SHELL -c bash\ -c\ \'a\=\"b\"\ \;\ echo\ $\{a\}\'

… while using$a將命令變為

$SHELL -c bash\ -c\ \'a\=\"b\"\ \;\ echo\ $a\'

請注意,在最後一個命令中,$aat 由使用者的登錄 shell 擴展,然後才能啟動bash -c。在上一個${a}使用where 的命令中,$確實出現在任何看起來像有效擴展的內容之前,因此使用者的 shell 不會進行任何擴展。

發生的這種額外引用在sudo手冊中描述-i選項的部分中進行了解釋:

-i, --login
           Run the shell specified by the target user's password
           database entry as a login shell.  This means that login-
           specific resource files such as .profile, .bash_profile, or
           .login will be read by the shell.  If a command is specified,
           it is passed to the shell as a simple command using the -c
           option.  The command and any arguments are concatenated,
           separated by spaces, after escaping each character (including
           white space) with a backslash (‘\’) except for alphanumerics,
           underscores, hyphens, and dollar signs.  If no command is
           specified, an interactive shell is executed. [...]

引用自:https://unix.stackexchange.com/questions/721421