스크립트 시작 부분에서 사용자에게 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