web-dev-qa-db-ja.com

Sudoにアクセスできるかどうかを確認する方法

私は最近このせいで困った。

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

Sudoにアクセスできるかどうかを確認する方法はありますか?

93
Bruce

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

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

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

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

ユーザーがspecificコマンドの実行のみを許可されている場合、このコマンドは機能し、somethingの実行が許可されていることを示します。 /別の権限でこの場合、あなたが許可されていないコマンドを実行しようとするとメッセージは違って見えますが(そしてrootにメールは送信されません)。管理者が/var/log/secureを読んだ場合、問題が発生する可能性があります。

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

whatを別の権限で実行することが許可されていることを確認するには、Sudo -lを使用できます。このコマンドではパスワードを入力する必要があります。

115
Daniel Beck

これはとても簡単です。 Sudo -lを実行してください。これはあなたが持っているすべてのSudo権限をリストします。

41
Brad Dausses

これはスクリプトにやさしいバージョンです。

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

9
kenorb

Gerald Schadeの答え はここ ですが、まだ改善することができます!

つかいます

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
3
ajneu

「Sudo access」には味があります。 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は、stdinからパスワードを読み取るようにSudoに指示します。 -pは空のプロンプトを設定します。 -Kは2回目のアクセスをクリアします。

それは/ dev/nullに標準エラーを送信するので、ユーザーがSudoアクセスの最初のタイプを持っているかどうかもチェックします。

1
Ben Hyde

私は投票してコメントするために低いランクを持っています、しかし、私は以前にそれが唯一の方法であるとわかったので、私はGerald Schadeの答えを支持したかったです。

ところで私の解決策:

[[ "$(whereis Sudo)" == *'/'* && "$(Sudo -nv 2>&1)" != 'Sorry, user'* ]]

(2015年末からmwhahaaa)

1
user629901

私にとっては、 'Sudo -v'と 'Sudo -l'は対話的であるためスクリプトでは機能しませんでした(上記のようにパスワードを要求されます)。 'Sudo -n -l'も機能しませんでした。私はSudo権限を持っていますが、パスワードがないために終了コード '1'を与えました。しかし、コマンドを次のように拡張します。

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

私にとってはスクリプトで成功しました。現在のユーザーが 'Sudo'を呼び出すことができる場合、この式は0を、そうでない場合は1を返します。

説明:
Sudoへの追加パラメータ-nは対話性を防ぎます。
コマンド '$A'の出力Sudo -n -v 2>&1は、次のようになります。
- 空(この場合、Sudoは現在のユーザーが呼び出すことができます)、または:
- 現在のユーザーがSudoに認証されていない、または
- パスワードの質問テキスト(この場合、ユーザーは承認されています)。
( "asswor"はドイツ語の "Passwort"と同様に英語の "password"にも合うでしょう)。

1
Gerald Schade