web-dev-qa-db-ja.com

Sudo-Sudoがあるかどうか、および/または残り時間を確認するコマンドはありますか?

(元は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をあまり使用しないため、用途が限られています。

28
valadil

-nオプションはSudoの新しいバージョンで使用できますが、これはオプションではありません。 Sudoを試して、パスワードのプロンプトが表示されるかどうかを確認する以外に、探していることを実行する実際の方法はありません。懸念がある場合は、視覚的な表示が必要な場合、Sudo/bin/bashを実行してルートbashセッションを開始してください。これは安全ではありませんが、誰かがSudoでプロンプトの変更を認識した場合も多少安全ではないことに注意してください。

10
8BitsOfGeek

これは非常に古い質問であることは承知していますが、ここでは今日のスクリプトで行いました。

 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 
30
wags007

@ 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を使用してください。そうしないと、ロックアウトされるリスクがあります。

2
Uwe Geuder

以下のコマンドは、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による以下のコメントを探してください。

1
Aquarius Power

警告

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")

0

これはおそらくほとんどの人の標準では極端な過剰ですが、Sudoがロック解除されているかどうかを確認するために使用する(おそらく正しい)関数です(実行中のユーザーがrootSudo)のロックを解除する必要がないため:

#!/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
0
Harold Fischer

Sudoマニュアルによると、Sudoセッションはタイムスタンプファイル(/usr/lib/Sudo/<username>)、タイムスタンプファイルの日付/時刻を確認することで、残り時間を把握できる場合があります。ただし、私のシステムでは、タイムスタンプファイルは実際にはディレクトリであり、暗号化されたコンテンツが含まれる3つのファイル(およびいくつかの奇妙なタイムスタンプもありますが、/usr/lib/Sudo/<username>は、Sudoにパスワードを入力した時刻と一致するタイムスタンプを持っているようです。おもう /usr/lib/Sudo/<username>/0には、最新のSudo実行のタイムスタンプがあります。

0
Dysaster

少なくともSudo 1.8.21p2では、このアプローチは正常に機能します。

if Sudo -vn 2> /dev/null; then
    echo "You have an active Sudo session"
fi
0
fxlv