最近、これが原因で困ったことがありました
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
sudoアクセスがあるかどうかを確認する方法はありますか?
120 Bruce 2013-02-18
sudo -v
を実行します。通常は sudo パスワードのタイムアウトを延長するために使われますが、sudo
の権限を持っているかどうかを判断するために使うことができます
$ sudo -v
Sorry, user [username] may not run sudo on [hostname].
マンページ抜粋
v (validate) オプションが与えられた場合、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
を使用します。このコマンドではパスワードを入力する必要があることに注意してください
136 Daniel Beck 2013-02-18
これは非常に簡単です。sudo -l
を実行します。これは、あなたが持っているすべての sudo 権限をリストアップします
45 Brad Dausses 2014-12-17
ここでは、スクリプトに対応したものをご紹介します
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
.をインストールする必要があります
14 kenorb 2016-06-14
ジェラルド・シェイドの回答こちら、まだまだ改善可能です!
Use
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
11 ajneu 2017-12-30
私の場合、’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
を与えます
説明します。 追加のパラメータ -n
から sudo
は対話性を妨げます。 コマンド ‘sudo -n -v 2>&1
‘ の出力 $A
は、次のようになるかもしれません。 – empty (この場合、現在のユーザが sudo を呼び出すことができます)、または。 – 現在のユーザがsudoの権限を持っていないという注意書き、または – パスワードの質問文 (この場合、ユーザは許可されています)。 (“asswor “はドイツ語の “Passwort “と同様に英語の “password “にも適合します)
3 Gerald Schade 2017-02-28
私は投票してコメントするには低いランクを持っていますが、ジェラルド・シェイドさんの回答をアップ投票したかったので、以前に唯一の方法を見つけて、他の誰もそれを知らないと思っていたので – 今まで 😀
私の解決策
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(2015年末からムフフフフ)
2 user629901 2017-10-01
これだけで根があるかどうかがわかるはずです
sudo whoami
sudo
がrootのパスワードを要求してきたり、うまくいかなかったりする場合は、(少なくともsudo
を通しては)root権限を持っていないということにもなります
2 Vedran 2020-02-11
“須藤アクセス “にはフレーバーがあります。2 つの主要なフレーバー。まず、あなたやあなたのメンバーであるグループが /etc/sudoers ファイルで sudo アクセスのために設定する必要があります
次に、パスワードを知っているか、最近 sudo コマンドを実行したことが必要です。最近であれば、タイムアウトが切れていないことを確認する必要があります。(面白い事実: sudoer のファイルでタイムアウトを非常に長くすることができます。)
私は、いくつかのステップを sudo で実行する必要があるスクリプトのプロログで、第二の種類のアクセスをテストしたいことがよくあります。このチェックが失敗した場合は、スクリプトを実行する前に 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 は sudo が stdin からパスワードを読み込むように指示します。p は空のプロンプトを設定します。Kは2回目のアクセスをクリアします
dev/null に stderr を送るので、ユーザが最初のタイプの sudo アクセスを持っているかどうかもチェックしてくれます
1 Ben Hyde 2016-08-30
# Verify if current user is root.
local current_username=$(whoami)
[[ "$current_username" == 'root' ]] && echo true && return 0
# Verify if sudo is installed.
if [[ $(validate_apt 'sudo') == 'false' ]]; then
echo false && return 0
fi
# Verify if the current user belongs to groups 'sudo' or 'root'.
local current_user_groups=$(groups $current_username)
if [[ $current_user_groups == *'root'* ]] ||
[[ $current_user_groups == *'sudo'* ]]; then
echo true && return 0
fi
# Verify if file /etc/sudoers.d/username exists.
if [[ -f /etc/sudoers.d/$current_username ]]; then
echo true && return 0
fi
0 Von Doom 2020-03-11
sudoモードで素敵なスクリプトの対話性/エラーチェックをしたい
私はタイムアウトを使用するKenorbのanswerが好きですが、それはデフォルトのキルシグナルのため、私のためには動作しませんでした。そこで私はこのビットを編集し、以下に説明するようにいくつかの追加を散りばめました
timeout -s SIGKILL 5s sudo -v && (echo SUDO Access Granted ; exit 0) || (echo SUDO Access Denied ; exit 1)
Explanation:
-s SIGKILL
はキルシグナルとしてSIGKILL
を指定する。SIGSTOP
よりもこれの方がSTDOUTの乱雑さが少ないので好ましい。キルシグナルの完全なリストは こちら にあります。また、SIGSTOP v.s. SIGKILLも参照してください
シグナルSIGKILLとSIGSTOPはキャッチ、ブロック、無視することはできません
5s
は5秒を表し、秒がデフォルトですが、m
分やh
時間を使用することもできます。参考までにman timeout
のDURATIONパラメータの説明を参照してくださいsudo -v
選択した回答の中で指定した理由exit 0
とexit 1
はそれぞれ成功と失敗の終了ステータスコードを表します。終了ステータスコードの完全なリストは、こちら1、こちら2、こちら3にあります;
は、シェルコマンドをインラインでチェーンするために使用されました&&
と||
は、sudo -v
の終了コードを使っているだけのブール式です。混乱してしまうと、ただのブール/論理式 短絡回路評価 になってしまいます
0 om-ha 2020-10-08
theseの手順に従って、sudoersファイルを表示してください。あなたがそこにいるなら、あなたはsudoを持っています。そうでない場合は、自分で追加することができます
su
visudo
- 下の方、
your_username_here ALL=(ALL) ALL
を入力します - ESCを押して、
:wq
と入力してください - Type
exit
sudo
を必要とするコマンドを再実行してください- パスワードを入力します(ルートのパスワードではありません)
-5 Kruug 2013-02-18