使用 sudo 執行命令並使用 sudo 執行 Bash 腳本
我一直認為執行命令
sudo
和執行 bash 腳本sudo
是一樣的。但是今天我發現它們是不同的。這是我測試過的:me@my_machine:~$ sudo echo $(whoami)
我從終端執行命令並獲得輸出:
me
. 看完這個連結:為什麼“sudo -u root echowhoami
”不返回root,我明白了。然後我創建一個名為的 bash 腳本
test.sh
:#!/usr/bin/env bash echo $(whoami)
我執行了這個腳本:
sudo ./test.sh
,令我驚訝的是,輸出現在變成了:root
。那麼執行命令
sudo
和執行 Bash 腳本sudo
是不同的嗎?如果我有一個包含命令的 Bash 腳本,
whoami
它是否被執行sudo
,我怎麼能得到me
,而不是root
?
該答案解釋了哪些使用者執行了
$(whoami)
問題中顯示的命令替換。實際上,該結構echo $(whoami)
希望永遠不會被使用,因為whoami
它本身就是輸出目前使用者的使用者名的正確方式。根本不需要呼叫
echo
命令替換,甚至在某些情況下可能會在命令替換中修改命令的輸出。不要使用echo $(...)
.執行
whoami
將輸出問題中非特權使用者的使用者名,並sudo whoami
輸出root
.讓 shell 執行命令
sudo echo $(whoami)
它必須首先弄清楚要呼叫
sudo
的參數。echo
只是一個簡單的字元串,所以 shell 對它什麼都不做,而是$(whoami)
一個需要擴展的命令替換。它通過執行whoami
命令替換並將其替換為其輸出來做到這一點。然後就可以呼叫了sudo
。這意味著
sudo
將使用(作為非特權使用者執行)echo
的輸出whoami
作為參數執行。如果您想
whoami
在命令替換中sudo
執行,您可以將它放在一個腳本中並使用 執行腳本sudo
,就像您所做的那樣,或者您可以使用一個內聯腳本,如sudo sh -c 'echo "$(whoami)"'
在這裡,
sh -c
腳本以 root 身份執行,因此whoami
也將以 root 身份執行。關鍵是*執行的 shell
whoami
*是以 root 使用者身份執行的。
whoami
在第一個命令中執行的 shell 以sudo echo $(whoami)
普通使用者身份執行,而不是 root。