我想在脚本开始时询问用户 sudo 密码,然后在运行脚本的其余部分之前测试该密码是否正确。
经过一段时间的搜索,我得到了这个测试脚本:
SUDO_PWD=whatever
sudo -k # <- So I can test it
echo $SUDO_PWD | sudo -Svp '' 2>/dev/null
sudo_response=$(SUDO_ASKPASS=/bin/false sudo -A whoami @>/dev/null)
if [ "$sudo_response" = "root" ]; then
echo "sudo"
else
echo "no sudo"
fi
但是,即使使用 @>/dev/null 重定向,这两条消息也会出现在控制台中。为什么 ?
答案1
如果您不想有任何输出(即没有标准输出且没有错误),则需要使用如下重定向:
your_command > /dev/null 2>&1
your_command &> /dev/null
仅显示错误并丢弃标准输出:
your_command > /dev/null
并仅显示标准输出并丢弃错误:
your_command 2> /dev/null
答案2
如果有人对检查 sudo 密码脚本的最终版本感兴趣,我将把它留在这里:
#!/bin/bash
echo "Informe superuser password:"
. getpass.sh
echo ""
sudo -k
echo $PASSWORD | sudo -Svp '' 2> /dev/null
SUDO_ANSWER=$(SUDO_ASKPASS=/bin/false sudo -A whoami 2> /dev/null)
if [ "$SUDO_ANSWER" != "root" ]; then
echo "Invalid superuser password. Exiting."
exit
fi
echo "Sudo password correct. Excuting rest of the script."
getpass.sh
是我很久以前在互联网上得到的一个 bash 脚本,它在终端中获取一个密码,回显星号而不是字符。为了完整起见,我将代码留在这里:
#!/bin/bash
stty -echo
CHARCOUNT=0
while IFS= read -p "$PROMPT" -r -s -n 1 CHAR
do
# Enter - accept password
if [[ $CHAR == $'\0' ]] ; then
break
fi
# Backspace
if [[ $CHAR == $'\177' ]] ; then
if [ $CHARCOUNT -gt 0 ] ; then
CHARCOUNT=$((CHARCOUNT-1))
PROMPT=$'\b \b'
PASSWORD="${PASSWORD%?}"
else
PROMPT=''
fi
else
CHARCOUNT=$((CHARCOUNT+1))
PROMPT='*'
PASSWORD+="$CHAR"
fi
done
PROMPT=""
stty echo