Linux避免多次sudo時重複輸入密碼的另一種實現
阿新 • • 發佈:2019-02-19
之所以稱為”另一種實現”是因為在網路上搜索類似的標題時,幾乎所有的建議都是去修改/etc/sudoers這個檔案,加上NOPASSWORD這個引數來搞定。
在我們的系統中,因為某種安全原因,只允許使用者在某些情況下輸入密碼來獲取root許可權,但不能總有超級使用者的許可權。可是總讓使用者頻繁輸入密碼確實很難受(作為一個有良心的程式設計師,還是希望自己的使用者不要太辛苦),怎麼辦呢?又找了一下sudo的男人(man)發現線索...
-S The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.
sudo接受從標準輸入傳入的引數,這樣我們就可以讓使用者輸入一次密碼,儲存下來,然後每次sudo的時候將密碼通過標準輸入傳過去就可以了,像這樣:
echo 密碼 | sudo -S 其它引數
但是,怎麼保證使用者輸入的密碼是正確的呢?雖然我們知道使用者的密碼儲存在/etc/shadow裡面,但是首先這個檔案的許可權是400,只有root可讀,其它使用者無法訪問,其次,即使能夠讀到密碼,裡面也是加密的,如何比對加密後的字串可能又是一篇很長的文章。
於是,取了個巧:使用者執行sudo後,如果密碼正確,就具有超級使用者的許可權了,否則,命令返回錯誤,這樣不就可以檢查密碼正確性了嗎?
後面,就可以拿著密碼為所欲為了ADMPW="" while true do read -esp "Please input the password: " ADMPW echo $ADMPW | sudo -S bash -c 'cat /etc/shadow' 1>/dev/null 2>&1 if [ $? -ne 0 ]; then echo echo "Wrong password, try again" sleep 1 else break fi done
echo $ADMPW | sudo -S bash -c 'do whatever you want’
/etc/sudoers裡面的配置,當前使用者在wheel群組中
# Uncomment to allow people in group wheel to run all commands
%wheel ALL=(ALL) ALL