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


27

(元々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は失敗します。この機能を取得する他の方法はありますか?私が実際に作業しているすべてのマシンのルートを持っているわけではないので、自分の好みに合わせて新しいバージョンのsudoをインストールすることはできません。

私がこれをやる価値があるのは、sudoステータスを示すプロンプトを表示できるようにするためです。どの端末がアクティブにsudo対応かを知るのが好きです。また、rootになったときに色を変更するプロンプトもありますが、あまり頻繁にrootを使用しないため、使用が制限されています。

回答:


10

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


1
ビジュアルインジケーターのセキュリティ上の影響については+1!
追って通知があるまで一時停止します。

その部分は私には起こらなかった。インジケーターが望んでいるのは、sudoをアクティブにしておき、危険な可能性のある端末を開いたままにするのではなく、sudo -Kを実行することを思い出させることです。画面をロックするのを忘れることが多いのではなく、追加の保険が好きです。
バラジル

現時点では、sudo -Vをチェックすることに傾いています。-nを使用できるほど十分に新しい場合は、-nをチェックして通知を取得します。どこにも壊れてはならないようです。
バラジル

@valadil:微妙なインディケーターはあまりセキュリティリスクをもたらさないと思います。たとえば、プロンプトでユーザー名の下線をオンにします。
追って通知があるまで一時停止します。

@デニス:その通り。プロンプトを「OMG_YOU_HAVE_SUDO_NOW!_user @ host」などに変更するつもりはありませんでした。たぶん色を少し変えるだけでしょう。彼らが座って私の.bashrcに親しんでいない限り、それが何を意味するのか誰も知っているとは思わない。
バラジル

29

これは非常に古い質問ですが、今日はスクリプトで行いました。

CAN_I_RUN_SUDO = $(sudo -n uptime 2>&1 | grep "load" | wc -l)
if [$ {CAN_I_RUN_SUDO} -gt 0]
それから
    echo "sudoコマンドを実行できます"
他に
    echo "Sudoコマンドを実行できません"
fi

1

以下のコマンドは、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変数もあります(これは実際の小さなプロンプトの1行です)が、混乱しない方が良いと思います。

PS .: OS-Xについては、@ nwinklerによる以下のコメントを探してください。


終了コードを確認するsudo -nここで私の質問を参照してくださいOS X上で動作していないよう:superuser.com/questions/902826/...
nwinkler

sudo -nさて、私が提案するテストは、ユーザーがsudoアクセスをアクティブにしているかどうかを判断するために使用できる他のテストがあると思いますか?または、OS-Xに何らかの更新が必要ですか?OS-X btwを使用したことはありません。
アクエリアスパワー

2
OS Xの最新バージョンを使用しsudo -nています。BSD(OS Xのベースとなっている)では、GNUバージョンとは異なる動作をする可能性があります。私はコメントを追加して、このバージョンのチェックがOS Xで動作しないように見えることを人々に知らせました。別の回答(sudo -n uptime 2>&1|grep "load"|wc -l)のチェックを使用しましたが、これはOS Xでは正常に動作するようです。しかし、それは動作します。
nwinkler

1
ああ@nwinklerので、それは実際にそれが生成する出力(ない戻り値)、興味深いの回避策に依存
水瓶座パワー

@nwinklerしかし、それは可能な限り近いです。またはsudo -nsudo -V 1.7.9でバグが発生するため、さらに良いです
マルコM.フォンハーゲン

1

@ 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セキュリティ警告メールを送信せずに、無制限の回数呼び出してパスワードをブルートフォースしようとすることができます。

注:visudosudoersファイルを編集するには、お気に入りのエディターの代わりに常に使用してください。そうしないと、ロックアウトされる危険があります。


0

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


1
私のシステムでは、タイムスタンプファイルはsudoを使用せずに読み取れないディレクトリにあります。sudoはパスワードの入力を要求するため、OPのニーズには対応しません。
追って通知があるまで一時停止します。

いい視点ね。これらのファイルの所有権を確認しませんでした。あなたは正しい、それは役に立たないだろう。
災害


0

少なくともsudo 1.8.21p2では、このアプローチはうまく機能します。

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

0

これはおそらくほとんどの人の標準では極端に過剰なものですが、ここに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

-1

簡単な答え...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0

ユーザーがアクティブなsudoセッションをまだ持っていない場合、パスワードの入力を求められます
Slizzered

-2

マニュアルページはどうですか

man sudo

使用可能なコマンドをリストします。

sudo -l

sudo自体には時間や日付の制限はありません...

man sudo
man sudoers

sudo -lはパスワードプロンプトを表示します。アクティブなsudoセッションがないことを通知するために必要です。
バラジル

sudoステータスはタイムアウトしますが、スケジュール機能がないことを意味する場合は正しいです。
追って通知があるまで一時停止します。

はい-タイムアウトします-しかし、スケジュールはありません。
アンドレアスレーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.