web-dev-qa-db-ja.com

すべてのスーパーユーザーをリストするにはどうすればよいですか?

ルート権限を持つすべてのユーザー、つまりSudoをリストするコマンドが必要ですか?

私がsudoerユーザーだとします。他のすべてのsudoerユーザーを知るにはどうすればよいですか?

84
Maythux

Sudoグループにリストされているsudoerをリストする必要がある場合、それを行う最良の方法は、このコマンドを実行することだと思います(これはshouldこの回答の他のコマンド):

grep -Po '^Sudo.+:\K.*$' /etc/group

また、muruのコメントで示唆されているように、/etc/groupのエントリの形式はcutで簡単に処理できます。

grep '^Sudo:.*$' /etc/group | cut -d: -f4

また、muruのコメントで示唆されているように、getentの代わりにgrepを使用できます。

getent group Sudo | cut -d: -f4

これらのコマンドはいずれも、/etc/group(存在する場合)のSudoグループにリストされているすべてのユーザーを出力します。

コマンド#1の内訳:

  • grep:ファイル内の正規表現に一致するすべての行を出力します
  • -PgrepをPerlスタイルの正規表現に一致させます
  • ogrepは一致した文字列のみを出力します
  • '^Sudo.+:\K.*$'grepを引用符間の正規表現に一致させます

正規表現#1の内訳:

  • リストにない文字または文字グループは、文字または文字グループ自体と一致します
  • ^:行の始まり
  • .+:1つ以上の文字
  • \K:前の一致を破棄
  • .*:0個以上の文字
  • $:行末

コマンド#2の内訳:

  • grep:ファイル内の正規表現に一致するすべての行を出力します
  • '^Sudo.+:\K.*$'grepを引用符間の正規表現に一致させます
  • cut:ファイル内の各行の指定されたセクションのみを印刷します
  • -d:cut:をフィールド区切り文字として解釈するようにします
  • -f4cutは4番目のフィールドのみを印刷します

正規表現#2の内訳:

  • リストにない文字または文字グループは、文字または文字グループ自体と一致します
  • ^:行の始まり
  • .*:0個以上の文字
  • $:行末
79
kos

here と述べたように、-l-Uオプションを一緒に使用して発見する最も簡単な方法を検討します。単にusersと入力するだけです。例:Johnその後:

ユーザーがSudoアクセス権を持っている場合、その特定のユーザーのSudoアクセスレベルを出力します。

  Sudo -l -U John
  User John may run the following commands on this Host:
     (ALL : ALL) ALL

ユーザーにSudoアクセス権がない場合、ローカルホストでSudoを実行することはユーザーに許可されていないと表示されます:

   Sudo -l -U John
   User John is not allowed to run Sudo on localhost.
29
JoKeR

既に述べたように、答えは nix&Linux Stack Exchange にあります:

これは、ユーザー「saml」がwheelグループのメンバーであることを示しています。

$ getent group wheel
wheel:x:10:saml

唯一の違いは、Ubuntuのグループがwheelではなく、Sudo(またはUbuntuの古いバージョンではadmin)であることです。したがって、コマンドは次のようになります。

getent group Sudo
13

Sudo -l -Uテストを展開すると、getent passwdを使用して、Sudoを使用できるユーザーを決定できます。 getent を使用すると、LDAPユーザーなど、passwdファイルに存在しないユーザーにアクセスできます。

getent passwd | cut -f1 -d: | Sudo xargs -L1 Sudo -l -U | grep -v 'not allowed'

Sudo -Uは、利用できるゼロ以外の終了値を返さないため、出力をgrepすることになります。

9
muru

ほとんどのUnixライクシステムでは、Sudoコマンドがあり、Sudo構成ファイルがあります。 rootとしてvisudoを実行:

:~$ Sudo bash

または

:~$ su

:~# visudo

管理者は、Sudoコマンドを使用できるグループの特権を検査および修正できます。

UbuntuのようなDebianベースのUnixライクなシステムでは、グループ4と27には一般にSudo特権へのアクセス権があります。

グループ4は管理者グループ(adm)で、グループ27はSudo gidです。

これらのグループに現在割り当てられているユーザーを確認するには、以下に示すように/ etc/groupファイルをcatします。

:~$ cat /etc/group

Ubuntu(Redhatベース、Oracle Solaris/Solarisベース、またはBSDベースのシステムではない)でのサンプル出力では、次の結果が得られます。

adm:x:4:youruser
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9: 
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:youruser,mybrother
floppy:x:25:
tape:x:26:
Sudo:x:27:youruser,mybrother

言うまでもなく、youruserはシステムの管理者であり、グループ4(adm)のメンバーです。ただし、youruserとmybrotherは両方ともグループ27のメンバーであり、これはグループSudoのgid(グループID)番号です。したがって、mybrotherはルート権限(スーパーユーザー)を取得することもできます。

FedoraやSlackwareなどの多くのLinuxシステムには、ホイールグループgid = 10が組み込まれています。 Sudoコマンドが適用されたときに管理者権限を許可します。 BSDベースのシステム(FreeBSDなど)では、rootユーザーはgid 0のwheelグループのメンバーです。

また、idコマンドを使用することにより、すべてのユーザーはシステムに既知の別のユーザーのグループ情報を見つけることができます。

例えば:

:~$ id mybrother

サンプル出力

uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(Sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
2
oOpSgEo

このコマンドは、Sudo権限を持つユーザーのリストを返します。

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]Sudo([[:space:]]|$)\"") }' /etc/passwd

出力は(例):

<username> : <username> adm cdrom Sudo dip plugdev lpadmin sambashare docker

ユーザー名のみを表示する場合、次のコマンド:

awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]Sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
1
A.B.

コマンド:

cat /etc/group | grep Sudo

出力:

Sudo:x:27:Tom,Stacy

トム、ステイシーは、Sudo特権を持つユーザーです。

0
XYZ