sudoアクセスがあるかどうかの確認方法
最近これが原因で困っています。
$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].
Man ページ抜粋:
-v (validate) オプションが与えられた場合、sudo はユーザーのタイムスタンプを更新し、必要に応じてユーザーのパスワードを要求します。これは sudo のタイムアウトをさらに 5 分間延長しますが (または sudoers でタイムアウトが設定されているものは何でも)、コマンドは実行されません。
ユーザが specific コマンドの実行のみを許可されている場合、このコマンドは動作します。この場合、許可されていないコマンドを実行しようとすると、メッセージは違って見えますが (そして 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
を使用します。このコマンドではパスワードの入力が必要なので注意してください。
これは非常に簡単です。007を実行してください。これは、あなたが持っているすべての sudo 権限をリストアップします。
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 -v
‘ と ’sudo -l
‘ はスクリプト内では動作しなかった。また、’sudo -n -l
‘ は動作しませんでした、それは私が sudo 権限を持っているにもかかわらず、パスワードが不足しているため、終了コード '1’ を与えました。しかし、コマンドを次のように拡張することで、スクリプトは成功しました。この式は、現在のユーザが'sudo'を呼び出すことができるかどうか0
を与え、そうでない場合は1
を与えます。
説明:
-n
への追加パラメータsudo
は対話性を防ぎます。
コマンド ‘$A
’ の出力 sudo -n -v 2>&1
は次のようになるかもしれない:
- 空 (この場合、現在のユーザが sudo を呼び出すことができる)、または:
- 現在のユーザが sudo のために認可されていないという注意、または:
- パスワードのための質問文 (この場合、ユーザは認可されている)。
私は投票してコメントするために低いランクを持っていますが、私は以前に唯一の方法を発見したように、私は、ジェラルド・シェイドの答えをupvoteしたかったし、他の誰もそれを知っていないと思った - 今まで :D
btw 私のソリューション:
[["$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'*]]
(2015年末から mwhahaaa)
“須藤アクセス "にはフレーバーがあります。2 つの主要なフレーバー。最初にあなた、またはあなたのメンバーのグループは、/etc/sudoers ファイルで sudo アクセスのために設定する必要があります。
第二にあなたのパスワードを知っている必要があります、または最近 sudo コマンドを行っている必要があります。タイムアウトが切れていない程度の最近のことです。(面白い事実: sudoer のファイルでタイムアウトを非常に長くすることができます。)
私はしばしば、いくつかのステップを sudo する必要があるスクリプトのプロログで、2 番目の種類のアクセスをテストしたいと思っています。このチェックが失敗した場合、スクリプトを実行する前に第2のアクセスを有効にする必要があることをユーザーに知らせることができます。p は空のプロンプトを設定します。Kは2回目のアクセスをクリアします。
stderrを/dev/nullに送るので、ユーザが1種類目のsudoアクセスを持っているかどうかもチェックします。