Bash

使用 sudo 執行命令並使用 sudo 執行 Bash 腳本

  • September 7, 2020

我一直認為執行命令sudo和執行 bash 腳本sudo是一樣的。但是今天我發現它們是不同的。這是我測試過的:

me@my_machine:~$ sudo echo $(whoami)

我從終端執行命令並獲得輸出:me. 看完這個連結:為什麼“sudo -u root echo whoami”不返回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 身份執行。

關鍵是*執行的 shellwhoami*是以 root 使用者身份執行的。

whoami在第一個命令中執行的 shell 以sudo echo $(whoami)普通使用者身份執行,而不是 root。

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