(元はStack Overflowに投稿されていました。代わりにここで試すことを提案しました。ここに元の投稿があります: https://stackoverflow.com/questions/3858208/Sudo-is-there-a-command-to-check-if -i-have-Sudo-and-or-how-much-time-is-left )
タイトルを参照してください。 Sudoを照会できるコマンドが必要です。理想的には、私がまだSudoを持っている場合は成功を返し、Sudoが期限切れの場合はfalseを返します。残り時間を取得することも役立つ場合があります(ただし、心配した場合は、Sudo -vを実行して再検証することもできます)。ああ、パスワードを要求する必要はありません。
私が見つけた最も近いものは「Sudo -n true」ですが、-nオプションは作業中のCentos 5マシンにのみ存在します。 -nは、パスワードを要求する必要がある場合は失敗します。この機能を取得する他の方法はありますか?使用しているすべてのマシンに実際にはrootがいないため、好みに合わせてSudoの新しいバージョンをインストールできないとします。
これを行う価値があるので、プロンプトを表示してSudoのステータスを示すことができるようにします。どの端末がアクティブにSudo可能であるかを知るのが好きです。また、rootになると色が変わるプロンプトも表示されますが、rootをあまり使用しないため、用途が限られています。
-n
オプションはSudoの新しいバージョンで使用できますが、これはオプションではありません。 Sudoを試して、パスワードのプロンプトが表示されるかどうかを確認する以外に、探していることを実行する実際の方法はありません。懸念がある場合は、視覚的な表示が必要な場合、Sudo/bin/bashを実行してルートbashセッションを開始してください。これは安全ではありませんが、誰かがSudoでプロンプトの変更を認識した場合も多少安全ではないことに注意してください。
これは非常に古い質問であることは承知していますが、ここでは今日のスクリプトで行いました。
CAN_I_RUN_Sudo = $(Sudo -n uptime 2>&1 | grep "load" | wc -l) if [$ {CAN_I_RUN_Sudo} -gt 0] その後 echo "Sudoコマンドを実行できます" else echo "Sudoコマンドを実行できません" fi
@ wags007の回答を簡略化する
if Sudo -n true
then
Sudo id
else
echo "sorry, but did not want to bother you"
fi
ただし、 https://www.Sudo.ws/man/1.8.15/sudoers.man.html 構成にdefaults mail_badpass
がある場合、テストごとにメールが送信されますその結果はfalseになります(プロンプトが表示されます)。このような迷惑を回避するには、sudoersファイルのその部分を
Defaults mail_badpass
Defaults! /bin/true !mail_badpass
その結果、セキュリティアラートメールは、/ bin/trueを除くすべてのコマンドに対して送信されます。ええ、はい、誰かがSudo true
を無制限に何度も呼び出すことにより、セキュリティ警告メールを送信せずにパスワードを総当たり攻撃しようとする可能性があります。
注:sudoersファイルを編集するには、お気に入りのエディターの代わりに常にvisudo
を使用してください。そうしないと、ロックアウトされるリスクがあります。
以下のコマンドは、Sudoを許可したことを示す色付きの指示を表示するので、Sudo -k
マシンから離れる前。着色されていない端末でも役立ちます。
異なる端末セッションでSudoをアクティブまたは非アクティブにすることができるため、〜/ .bashrcの最後に置くことができるようにこれを作成しました
function FUNCpromptCommand () {
Sudo -n uptime 2>/dev/null 1>/dev/null
local bSudoOn=`if(($?==0));then echo true; else echo false; fi`
history -a; # append to history at each command issued!!!
local width=`tput cols`;
local half=$((width/2))
local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
if $bSudoOn; then dt="!!!Sudo!!!$dt"; fi
local sizeDtHalf=$((${#dt}/2))
#printf "%-${width}s" $dt |sed 's" "="g';
echo
output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`
local colorLightRed="\e[1;31m"
local colorNoColor="\e[0m"
if $bSudoOn; then
echo -e "${colorLightRed}${output}${colorNoColor}"
else
echo -e "${output}"
fi
}
export Prompt_COMMAND=FUNCpromptCommand
端末でbash
と入力してテストします。また、コマンドを実行するたびに、最後のコマンドが終了した時間の情報を含む行全体が追加されるため、昼食に出て、最後のコマンドがいつ終了したかを知ることができます。
あなたはあなたのニーズに合うようにこのコードで遊ぶことができます。 PS1変数(つまり、実際の小さなPrompt単一行)もありますが、それを台無しにしない方が良いと思います。
PS .: OS-Xの場合は、@ nwinklerによる以下のコメントを探してください。
警告
Bugzilla Sudo Bug ID = 590によると、Sudo -n true 2&>/dev/null ; echo $?
への呼び出しはSudo -V 1.7.10
でバグが発生します
Bugzillaを読む[ここ]( http://bugzilla.Sudo.ws/show_bug.cgi?id=59 "Bug ID = 590")
これはおそらくほとんどの人の標準では極端な過剰ですが、Sudo
がロック解除されているかどうかを確認するために使用する(おそらく正しい)関数です(実行中のユーザーがroot
、Sudo
)のロックを解除する必要がないため:
#!/bin/sh
_unlock_Sudo() {
if [ "$USER" != 'root' ]; then
if ! Sudo -n -- true 2>/dev/null; then
printf '\n'
printf 'Enter password for Sudo user "%s":\n' "$USER"
while ! Sudo -- true; do
printf '\n'
while true; do
printf 'Slow your roll. Try to enter password again? [Y/n]: '
read -r answer
case "$answer" in
''|y|Y|yes|Yes|YES)
printf '\n'
printf 'Enter password for Sudo user "%s":\n' "$USER"
break
;;
n|N|no|No|NO)
printf '\n'
printf 'OK. Exiting...\n'
exit 1
;;
*)
printf 'Please enter a valid option...\n'
printf '\n'
;;
esac
done
done
fi
fi
}
_unlock_Sudo
Sudoマニュアルによると、Sudoセッションはタイムスタンプファイル(/usr/lib/Sudo/<username>
)、タイムスタンプファイルの日付/時刻を確認することで、残り時間を把握できる場合があります。ただし、私のシステムでは、タイムスタンプファイルは実際にはディレクトリであり、暗号化されたコンテンツが含まれる3つのファイル(およびいくつかの奇妙なタイムスタンプもありますが、/usr/lib/Sudo/<username>
は、Sudoにパスワードを入力した時刻と一致するタイムスタンプを持っているようです。おもう /usr/lib/Sudo/<username>/0
には、最新のSudo
実行のタイムスタンプがあります。
少なくともSudo 1.8.21p2では、このアプローチは正常に機能します。
if Sudo -vn 2> /dev/null; then
echo "You have an active Sudo session"
fi