之所以称为”另一种实现”是因为在网络上搜索类似的标题时,几乎所有的建议都是去修改/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