在非互動模式下使用 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 時,您學習瞭如何在沒有密碼的情況下執行命令。不需要密碼的操作會帶來嚴重的安全風險。