sudoアクセスがあるかどうかを確認する方法は?


104

私は最近、このためにトラブルに巻き込まれました。

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

sudoアクセスがあるかどうかを確認する方法はありますか?


システム管理者にお問い合わせください。
mdpc

1
@mdpc:それ以外に別の方法はありますか?
ブルース

ルートアクセスを取得できるかどうかについては言及していません。
mdpc

回答:


121

を実行しますsudo -v。通常、sudoパスワードのタイムアウトを延長するために使用されますが、sudo特権があるかどうかを判断するために使用できます。

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].

マニュアルページの抜粋:

-v(検証)オプションを指定すると、sudoはユーザーのタイムスタンプを更新し、必要に応じてユーザーのパスワードを要求します。これにより、sudoタイムアウトがさらに5分間(またはsudoersでタイムアウトが設定されている場合)延長されますが、コマンドは実行されません。

ユーザーが特定のコマンドの実行のみを許可されている場合、このコマンドは機能し、異なる特権で何かを実行できることを示します。この場合、許可されていないコマンドを実行しようとすると(およびrootにメールが送信されない)メッセージは異なって見えますが、管理者がを読むと問題が発生する可能性があります/var/log/secure

$ sudo ls
[sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

異なる権限で実行できるものを調べるには、を使用できますsudo -l。このコマンドでは、パスワードを入力する必要があることに注意してください。


2
ありがとう。sudo -vは私のために機能します。manページには、sudo -lも実行できると書かれていますが、パスワードを要求されます。何故ですか?
ブルース

2
@Bruce私はここで推測していますが、そうでなければ、誰か(またはあなたが実行するプログラム)が現在のユーザーが実行できるプログラムを(おそらくパスワードを入力せずに)見つけ、悪意を持ってその情報を使用しようとします。
ダニエルベック

これが返ってきたら、どういう意味だと思いますpatrick@<host>:~$ sudo -v sudo: unable to resolve host <host>か?私はパスワードを入力しましたが、不正については何も知りませんでした。sudo他のコマンドを正常に実行できたことは知っていますが、そのunable to resolve hostメッセージは、ホスト上で他の何かがファンキーになる可能性があることを懸念しています。
パトリックM 14

@PatrickM sudoersファイルに問題があるようです。そこで、特定のコマンドの実行をユーザーに許可するホストを指定できます(これはsudoers、複数のマシンで同じファイルを使用する場合に便利です)。そのファイルで指定されたホスト名を解決できなかった可能性があります。hostたとえばコマンドで確認してみてください。
エール14

RHEL 6では、sudo -v「xxはsudoersファイルに含まれていません。このインシデントは報告されます」と表示されます。
79E09796

43

これは非常に簡単です。を実行しますsudo -l。これにより、所有しているsudo特権がリストされます。


1
ダニエル・ベックが2年近く前に言ったことを繰り返しているので、たぶんダウンボット。
G-マン

1
または何が起こるかを説明します、それはせいぜいコメントです
ラムハウンド14

2
@ジョナサン:ubuntu rigtでスクリプトを作成sudo -lする場合、sudoが可能かどうかを確認するためにパスワードを要求します。sudo -vuができる場合にのみ"$(whoami)" != "root"質問し、どのLinuxでも何も質問しません。
bksunday

@bksundayあなたは正しいです。クリーンなDebian Jessyでテストし、結果を確認しました。私の以前の(今削除された)コメントは、おそらく私がいくつかのsudo特権を持っていたマシンでテストした結果でした。
ジョナサンベンアブラハム

@ G-マンが、この単純な答えは...このコマンドは生憎非常に終わりで、おそらくより正確なダニエルの答えは、より多くの私を助けた
Betlista

11

スクリプトに対応したバージョンは次のとおりです。

timeout 2 sudo id && echo Access granted || echo Access denied

あなたがsudoアクセス権を持っていなくてもパスワード入力にこだわらないためです。

次のような変数に設定することもできます。

timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"

注意:MacOSの上では、インストールする必要がありcoreutils、例えばbrew install coreutils


timeoutOS Xなど、デフォルトで利用できない場所の代替手段はありますか?
ハリー

1
coreutilsたとえば、インストールする必要がありbrew install coreutilsます。
ケノーブ

2
これはスクリプトでは機能しません。原因不明の理由で、スクリプトは私がそれを殺すまでハングします。
ベール

7

ここでジェラルドシェードの答え、まだ改善することができます!

つかいます

prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
  # exit code of sudo-command is 0
  echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
  echo "has_sudo__needs_pass"
else
  echo "no_sudo"
fi

スクリプトでの完全な使用例は次のとおりです。

#!/usr/bin/env bash

is_root () {
    return $(id -u)
}

has_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
    echo "has_sudo__pass_set"
    elif echo $prompt | grep -q '^sudo:'; then
    echo "has_sudo__needs_pass"
    else
    echo "no_sudo"
    fi
}

elevate_cmd () {
    local cmd=$@

    HAS_SUDO=$(has_sudo)

    case "$HAS_SUDO" in
    has_sudo__pass_set)
        sudo $cmd
        ;;
    has_sudo__needs_pass)
        echo "Please supply sudo password for the following command: sudo $cmd"
        sudo $cmd
        ;;
    *)
        echo "Please supply root password for the following command: su -c \"$cmd\""
        su -c "$cmd"
        ;;
    esac
}

if is_root; then
    echo "Error: need to call this script as a normal user, not as root!"
    exit 1
fi


elevate_cmd which adduser

2

私にとって、「sudo -v」および「sudo -l」はスクリプトで機能しませんでした。これは、インタラクティブな場合があるためです(上記のようにパスワードを要求します)。' sudo -n -l'も機能しませんでした。パスワードがないため、sudo権限がありますが、終了コード '1'が返されました。ただし、コマンドを次のように拡張します。

A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

私はスクリプトで成功しました。この式は0、現在のユーザーが「sudo」を呼び出すことができる1かどうかを示します。

説明:対話性を妨げる
追加パラメーター。コマンド ' ' の出力は次のとおりです 。-空(この場合、現在のユーザーがsudoを呼び出すことができます)、または: -現在のユーザーがsudoを許可されていないことを示すメモ、または -パスワード(この場合、ユーザーは許可されています)。 (「asswor」は、英語の「パスワード」とドイツ語の「Passwort」に適合します)。-nsudo
$Asudo -n -v 2>&1





1

「Sudoアクセス」にはフレーバーがあります。2つの主要なフレーバー:最初に、または自分のメンバーであるグループを、/ etc / sudoersファイルでsudoアクセス用にセットアップする必要があります。

次に、パスワードを知る必要があるか、最近sudoコマンドを実行する必要があります。最近、タイムアウトが期限切れにならないほど十分です。(面白い事実:sudoerのファイルでタイムアウトを非常に長くすることができます。)

いくつかのステップをsudoする必要があるスクリプトのプロローグで、2番目の種類のアクセスをテストしたいことがよくあります。このチェックが失敗した場合、スクリプトを実行する前に第2種類のアクセスを有効にする必要があることをユーザーにアドバイスできます。

bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled

-Sは、sdinにstdinからパスワードを読み取るように指示します。-pは空のプロンプトを設定します。-Kは2回目のアクセスをクリアします。

また、stderrを/ dev / nullに送信するため、ユーザーが最初のタイプのsudoアクセスを持っているかどうかも確認します。


-4

以下手順に従って、sudoersファイルを表示します。そこにいるなら、あなたはsudoを持っています。そうでない場合は、自分で追加できます。

  1. su
  2. visudo
  3. ファイルの最後に、入力します your_username_here ALL=(ALL) ALL
  4. ヒットESCして入力:wq
  5. タイプ exit
  6. 必要なコマンドを再実行します sudo
  7. パスワードを入力します(ルートのパスワードではありません)

11
OPは、実行するために、「トラブルになった」sudoので、彼はおそらくないシステム管理者、またエリートシステム管理者の一つでも。彼はおそらく、限られた権限を与えられているのではないかと思った単なるユーザーです。彼が行けると疑うのはどうしてですか?su
スコット14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.