Bash
為什麼 sudo ‘-i’ 選項會破壞變數擴展?
這正如我所料:
$ 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 $
當您使用
-i
with 時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\'
請注意,在最後一個命令中,
$a
at 由使用者的登錄 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. [...]