1. 程式人生 > >Linux避免多次sudo時重複輸入密碼的另一種實現

Linux避免多次sudo時重複輸入密碼的另一種實現

之所以稱為”另一種實現”是因為在網路上搜索類似的標題時,幾乎所有的建議都是去修改/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