私は最近このせいで困った。
$Sudo vim /etc/motd
[Sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Sudoにアクセスできるかどうかを確認する方法はありますか?
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
を使用できます。このコマンドではパスワードを入力する必要があります。
これはとても簡単です。 Sudo -l
を実行してください。これはあなたが持っているすべてのSudo権限をリストします。
これはスクリプトにやさしいバージョンです。
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
。
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
「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アクセスの最初のタイプを持っているかどうかもチェックします。
私は投票してコメントするために低いランクを持っています、しかし、私は以前にそれが唯一の方法であるとわかったので、私はGerald Schadeの答えを支持したかったです。
ところで私の解決策:
[[ "$(whereis Sudo)" == *'/'* && "$(Sudo -nv 2>&1)" != 'Sorry, user'* ]]
(2015年末からmwhahaaa)
私にとっては、 '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"にも合うでしょう)。