linux – sudoアクセスがあるかどうかを確認するには?

linux sudo sudoers

最近、これが原因で困ったことがありました

$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 0exit 1 はそれぞれ成功と失敗の終了ステータスコードを表します。終了ステータスコードの完全なリストは、こちら1こちら2こちら3にあります
  • ;は、シェルコマンドをインラインでチェーンするために使用されました
  • &&||は、sudo -vの終了コードを使っているだけのブール式です。混乱してしまうと、ただのブール/論理式 短絡回路評価 になってしまいます

0  om-ha  2020-10-08


theseの手順に従って、sudoersファイルを表示してください。あなたがそこにいるなら、あなたはsudoを持っています。そうでない場合は、自分で追加することができます

  1. su
  2. visudo
  3. 下の方、your_username_here ALL=(ALL) ALLを入力します
  4. ESCを押して、:wqと入力してください
  5. Type exit
  6. sudoを必要とするコマンドを再実行してください
  7. パスワードを入力します(ルートのパスワードではありません)

-5  Kruug  2013-02-18


タイトルとURLをコピーしました