スクリプトの冒頭で、ユーザーに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