私は最近、このためにトラブルに巻き込まれました。
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
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].
マニュアルページの抜粋:
-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
。このコマンドでは、パスワードを入力する必要があることに注意してください。
patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>
か?私はパスワードを入力しましたが、不正については何も知りませんでした。sudo
他のコマンドを正常に実行できたことは知っていますが、そのunable to resolve host
メッセージは、ホスト上で他の何かがファンキーになる可能性があることを懸念しています。
sudoers
ファイルに問題があるようです。そこで、特定のコマンドの実行をユーザーに許可するホストを指定できます(これはsudoers
、複数のマシンで同じファイルを使用する場合に便利です)。そのファイルで指定されたホスト名を解決できなかった可能性があります。host
たとえばコマンドで確認してみてください。
sudo -v
「xxはsudoersファイルに含まれていません。このインシデントは報告されます」と表示されます。
これは非常に簡単です。を実行しますsudo -l
。これにより、所有しているsudo特権がリストされます。
sudo -l
する場合、sudoが可能かどうかを確認するためにパスワードを要求します。sudo -v
uができる場合にのみ"$(whoami)" != "root"
質問し、どのLinuxでも何も質問しません。
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
。
timeout
OS Xなど、デフォルトで利用できない場所の代替手段はありますか?
coreutils
たとえば、インストールする必要がありbrew install coreutils
ます。
ここでジェラルドシェードの答えは、まだ改善することができます!
つかいます
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'が返されました。ただし、コマンドを次のように拡張します。
A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor
私はスクリプトで成功しました。この式は0
、現在のユーザーが「sudo」を呼び出すことができる1
かどうかを示します。
説明:対話性を妨げる
追加パラメーター。コマンド ' '
の出力は次のとおりです
。-空(この場合、現在のユーザーがsudoを呼び出すことができます)、または:
-現在のユーザーがsudoを許可されていないことを示すメモ、または
-パスワード(この場合、ユーザーは許可されています)。
(「asswor」は、英語の「パスワード」とドイツ語の「Passwort」に適合します)。-n
sudo
$A
sudo -n -v 2>&1
私は投票してコメントするのに低いランクを持っていますが、ジェラルドシェードの答えを支持したかったのです。
ところで私の解決策:
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(2015年末からmwhahaaa)
「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アクセスを持っているかどうかも確認します。
以下の手順に従って、sudoersファイルを表示します。そこにいるなら、あなたはsudoを持っています。そうでない場合は、自分で追加できます。
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
sudo
ので、彼はおそらくないシステム管理者、またエリートシステム管理者の一つでも。彼はおそらく、限られた権限を与えられているのではないかと思った単なるユーザーです。彼が行けると疑うのはどうしてですか?su