tee / sudo 密碼記憶體衝突?
我有一個大型 bash 腳本(Ubuntu 12.04)。該腳本旨在由普通使用者呼叫;只有腳本中的某些命令使用 sudo 執行。不能以 root 身份執行整個腳本。
在腳本中,我有很多類似於這些的語句:
echo "blah blah" | sudo tee /path/to/file
和
sudo tee /path/to/file > /dev/null << 'END' blah blah END
這些語句的形式主要是由於腳本被設計為不以 root 身份執行。我做了很多工作來使這些陳述正確。(這對我來說是一次學習經歷。)
該腳本執行良好,我不想對其進行大規模更改。事實上,我根本不想更改它*,*因為它已經過調試並在生產(某種)環境中工作。
但是,我確實想添加更好的日誌記錄。因此,我根據https://stackoverflow.com/a/11886837/463994在 bash 腳本的開頭添加了以下幾行
#!/bin/bash >foo.log exec > >(tee -a foo.log) exec 2> >(tee -a foo.log >&2)
但是,現在當我執行腳本時,它會詢問我上面顯示的 sudo/tee 命令範例的每個實例的密碼(其中大約 50 個!)。
是否有不需要我顯著更改現有程式碼的解決方案?我只想記錄腳本的輸出而不改變它的執行方式(包括在短時間內不需要多次輸入密碼)。
這是顯示問題的程式碼:
#!/bin/bash sudo -k >foo.log #truncate log file to start fresh exec > >(tee -a foo.log) exec 2> >(tee -a foo.log >&2) if [ -f fileone.txt ] ; then echo "sudo rm fileone.txt" sudo rm fileone.txt fi echo "sudo touch fileone.txt" sudo touch fileone.txt echo "sudo touch filetwo.txt" sudo touch filetwo.txt sudo touch /opt/file3.txt echo "blah blah" | sudo tee /opt/file3.txt sudo rm /opt/file3.txt exit
預期結果:
輸入密碼一次,整個腳本執行
實際結果:
必須再次輸入密碼
echo "blah blah" | sudo tee /opt/file3.txt
以及該問題頂部給出的表格的任何類似陳述。但僅當使用腳本頂部的日誌記錄程式碼時。沒有日誌記錄,就沒有問題。
您
tty_tickets
在 sudo 配置中啟用了該選項。這是預設設置。此選項告訴 sudo,如果您通過在一個終端上輸入密碼進行身份驗證,那麼這只會驗證該終端上 sudo 的使用。當您添加這些重定向時, sudo 失去了與您的終端的連接。(我認為 sudo 使用 pam 的
PAM_TTY
設置來確定它在哪個終端上執行;我不知道這是如何確定的。)如有疑問,sudo 會一直詢問。僅當您可能在某處的終端上留下無人參與的登錄會話時,該
tty_tickets
選項才有用,偶然的路人可能會嘗試執行sudo
以從您的帳戶升級到 root。它對甚至可以在您的帳戶中植入惡意軟體並在您下次執行 sudo 時劫持的稍微老練的攻擊者也沒有影響。所以這個選項沒有真正的好處,它只是一個障礙。要關閉該選項,請執行
visudo
以編輯 sudo 配置並添加該行Defaults !tty_tickets