在非互動模式下使用 sudo 命令


摘要

在 Linux 中,sudo(超級使用者執行)命令經常用作命令的字首,只有超級使用者才能執行這些命令。任何帶有“sudo”字首的命令都將以提升的許可權執行,或者換句話說,允許具有必要許可權的使用者以其他使用者(例如超級使用者)的角色執行命令。這類似於 Windows 的“以管理員身份執行”選項。由於 sudo,我們可以擁有多個管理員。

注意 - Linux 命令區分大小寫。

預設 sudo 行為

要在大多數現代 Linux 發行版上使用 sudo 命令,使用者必須是 wheel、sudo 或 sudoers 組的成員。單使用者系統預設會為其使用者提供 sudo 許可權。系統或伺服器上的多個使用者帳戶可能會阻止某些使用者獲得 sudo 訪問許可權。

讓我們首先回顧一下 sudo 命令的預設行為 -

$ sudo cp /root/temp1 lecture_class
[sudo] password for tutorials: 

$ ls -l lecture_class
-rw------- 1 root root 12863 Jan 15 13:48 lecture_class

在上面的示例中,我們以普通使用者 tutorials 運行了 sudo 命令。root 的 lecture_class 檔案應複製到當前目錄。

將引數作為密碼傳遞

如果我們需要在指令碼中包含 sudo 命令,或者如果我們想在非互動模式下執行它。

現在讓我們看看如何將密碼作為引數傳送到 sudo。

使用 -S 選項

使用超級使用者/root 角色,sudo -s 啟動在您的 $SHELL 環境變數中給出的 shell。使用 -u,可以指定另一個使用者。

使用者預設登入 shell 的路徑儲存在 $SHELL 環境變數中。通常,etc/passwd 包含實際的預設 shell 程式設定。根據您在當前會話中執行的操作,您當前正在使用的 shell 應用程式可能不在 $SHELL 變數中。例如,如果您使用 zsh 自動登入,然後執行 bash,則 $SHELL 將保持為 /bin/zsh。

讓我們透過執行相同的命令來檢查此選項 -

tutorials$ echo "My Pass" | sudo -S cp /root/temp1 lecture_class
[sudo] password for tutorials: 

tutorials$ ls -l lecture_class
-rw------- 1 root root 12863 Jan 15 13:48 lecture_class

如我們所見,密碼已透過管道傳輸到 stdin。雖然提示仍然存在,但 sudo 命令這次在沒有等待我們的輸入的情況下執行了 cp 命令。

抑制提示

當使用 -S 引數時,sudo 命令會從標準輸入讀取密碼。Man sudo 解釋:-S,—stdin

將提示寫入標準錯誤而不是終端裝置,並從標準輸入讀取密碼。密碼後必須有一個換行符。

需要注意的是,當使用 -S 選項時,sudo 會將提示寫入標準輸出 (stdout) 而不是標準錯誤 (stderr)。

藉助重定向,我們可以快速停用密碼提示 -

tutorials$ echo "My password" | sudo -S cp /root/temp1 lecture_class 2>/null

tutorials$ ls -l lecture_class
-rw------- 1 root root 12863 Jan 15 13:48 lecture_class

我們將使用 2 將 cat 命令的標準錯誤重定向。

無需密碼即可使用超級使用者

對於 Linux 或類 Unix 系統,sudo(“超級使用者執行”)只是一個用於以不同使用者身份執行命令和程式的工具。例如,作為 root 使用者或其他使用者。使用 sudo,您可以將例行任務分配給非特權使用者,例如重新啟動伺服器、啟動 Apache 或建立備份。預設情況下,sudo 在執行命令之前需要使用者的密碼身份驗證。當您需要以 root 身份執行命令但不想輸入密碼時,可以使用 sudo 命令。對於指令碼編寫或任何其他用途,這很有幫助。透過在 /etc/sudoers 檔案中進行適當的條目,可以實現這一點。

$ su -
# or use the sudo command 
$ sudo -i

透過輸入以下命令,您可以備份您的 /etc/sudoers 檔案,並按如下所示編輯檔案,

$ cp /etc/sudoers /root/sudoers.bak
# visudo

在 /etc/sudoers 檔案中新增以下行,以便使用者“tutorials”可以執行命令“/bin/kill”和“systemctl”而無需輸入密碼,以便當所有使用者以 root 身份執行應用程式時,它不會請求密碼 -

# tutorials ALL = NOPASSWD: /bin/systemctl restart httpd.service, /bin/kill

儲存並退出檔案,然後透過執行以下命令進行測試,

# sudo /bin/kill {pid}

結論

當我們使用 sudo 命令啟動程式時,它預設會請求當前登入使用者的密碼。但是,有時我們希望使用 sudo 在非互動模式下執行某些操作。首先,我們演示瞭如何使用 sudo 命令的 -S 選項將密碼作為引數傳遞。在 Linux 或其他類 Unix 系統上使用 sudo 時,您學習瞭如何在沒有密碼的情況下執行命令。不需要密碼的操作會帶來嚴重的安全風險。

更新時間: 2023年8月1日

351 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始
廣告