Bagaimana saya bisa mengetahui pengguna mana yang berada dalam grup di Linux?


68

Saya baru-baru ini membuat pengguna baru dan menugaskan mereka ke grup tertentu. Saya bertanya-tanya apakah ada perintah yang menunjukkan semua pengguna yang ditugaskan ke grup tertentu? Saya telah mencoba menggunakan perintah 'grup' namun setiap kali saya menggunakan ini dikatakan 'grup: tidak ditemukan'


3
Itu adalah groupsperintahnya. Tidak mungkin Anda tidak memilikinya di Linux, karena itu adalah bagian dari coreutils.
Thomas Dickey

@ThomasDickey Tapi itu mungkin - seperti pada beberapa NASes.
Thomas W.

Jawaban:


43

Anda dapat menggunakan grep:

grep '^group_name_here:' /etc/group

Ini hanya mencantumkan keanggotaan grup tambahan, bukan pengguna yang menjadikan grup ini sebagai grup utama mereka. Dan itu hanya menemukan grup lokal, bukan grup dari layanan jaringan seperti LDAP.


6
Tidak berfungsi dengan otentikasi terpusat.
Maxim Egorushkin

1
Ini bisa sangat membingungkan mungkin karena perbedaan primer / sekunder. Saya pikir ini harus dihindari demi. sudo lid -g {group}Saya memiliki sistem di mana jawaban ini mencantumkan 8 pengguna dalam sebuah grup sedangkan sudo lid -g {group}daftar 10.
DKroot

Lihat getentjawaban oleh @Murray Jensen di bawah ini
scrutari

84

Saya lebih suka menggunakan perintah getent ...

Karena getent menggunakan layanan nama yang sama dengan sistem, getent akan menampilkan semua informasi, termasuk yang diperoleh dari sumber informasi jaringan seperti LDAP.

Jadi untuk grup, Anda harus menggunakan yang berikut ...

getent group name_of_group

di mana name_of_group diganti dengan grup yang ingin Anda cari. Perhatikan bahwa ini hanya mengembalikan keanggotaan grup tambahan, itu tidak termasuk pengguna yang memiliki grup ini sebagai grup utama mereka.

Ada banyak sekali pencarian lain yang dapat Anda lakukan ... passwdmenjadi satu lagi yang bermanfaat, yang Anda perlukan untuk membuat daftar grup utama.


1
Jawaban lain tidak berlaku jika Anda bukan administrator dan info grup disimpan di server lain.
Andrés Alcarraz

1
Ini bisa sangat membingungkan mungkin karena perbedaan primer / sekunder. Saya pikir ini harus dihindari demi. sudo lid -g {group}Saya memiliki sistem di mana jawaban ini mencantumkan 8 pengguna dalam sebuah grup sedangkan sudo lid -g {group}daftar 10.
DKroot

12

Lebih mudah dilakukan groups [username]

Jika Anda ingin mendaftar semua pengguna lokal dan grup lokal mereka, Anda dapat melakukannya

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

Jika Anda mendapatkan "grup: perintah tidak ditemukan", kemungkinan Anda telah mengedit jalur lingkungan Anda menjadi lebih buruk, untuk mengatur ulang jalur Anda lakukan PATH=$(getconf PATH)


Ini berfungsi untuk grup tertentu jika | grep {group}ditambahkan dan memberikan jawaban yang benar tidak seperti getent group name_of_groupataugrep '^group_name_here:' /etc/group
DKroot

1
Alih-alih cat /etc/passwd, Anda harus menggunakan gentent passwdagar pengguna di nis / ldap tetap terdaftar. Satu-satunya kelemahan adalah itu bisa memakan waktu cukup lama.
Brian Minton

8
groupmems -g groupname -l

daftar semua pengguna dalam grup yang disebutkan.


Perhatikan bahwa groupmemsini adalah bagian dari shadow utils yang digunakan pada kebanyakan distro Linux, namun groupmemssaat ini absen dari Debian dan turunannya ( bug sekarang sudah diperbaiki tetapi belum termasuk dalam rilis apa pun (per Nov 2016))
Stéphane Chazelas

2
Juga perhatikan bahwa groupmemshanya berurusan dengan grup di /etc/group(bukan yang di LDAP atau basis data pengguna lain) dan memerlukan hak pengguna super saat mencoba membuka / etc / gshadow.
Stéphane Chazelas

Terlepas dari peringatan yang disebutkan di atas, perintah ini ideal untuk situasi tertentu karena tidak memerlukan penguraian tambahan dari output (yaitu cutdan teman).
bonh

Ini bisa sangat membingungkan mungkin karena perbedaan primer / sekunder. Saya pikir ini harus dihindari demi sudo lid -g {group}. Saya memiliki sistem di mana jawaban ini mencantumkan 8 pengguna dalam grup sedangkan sudo lid -g {group}daftar 10.
DKroot

5

Saya terkejut tidak ada yang disebutkan

id <user>

Perintah ini akan memberikan daftar grup pengguna.


3
Karena - bertentangan dengan judul - si penanya ingin mengetahui pengguna dalam suatu kelompok, bukan kelompok pengguna tertentu, sebagaimana dirinci dalam pertanyaan. Saya sekarang mengulang judul untuk mencocokkan isi.
Dubu

Aaah, begitu. Seharusnya saya membaca teks pertanyaan dengan lebih baik. Terima kasih.
Alex

4

groupsperintah mencetak keanggotaan grup untuk pengguna. Anda dapat menggunakan lidperintah untuk mendaftar pengguna dalam grup seperti:

# lid -g <groupname>

4
lidadalah bagian dari libuser, yang tidak diinstal secara default di banyak distribusi.
Chris Down

2

OP mengajukan pertanyaan untuk mengecualikan kemungkinan menggunakan perintah grup . Karena itu adalah bagian dari coreutils di Linux, baik (a) itu dihapus, atau (b) OP salah mengetikkan namanya.

OP dapat digunakan groupsseperti ini, misalnya:

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

Satu saran menyarankan hanya grep's untuk nama grup /etc/group. Terkadang itu berfungsi sebagaimana dimaksud.

Penggunaan grep yang sedikit lebih baik memperhitungkan sintaksis dari /etc/group:

group_name:password:GID:user_list

sehingga hanya bagian sebelum usus besar pertama adalah nama grup yang valid. Grep polos tanpa memperhatikan sintaks dapat (dan akan) mengambil kecocokan yang menyesatkan dari file. Gunakan ekspresi reguler untuk membuat grep mencocokkan dengan apa yang dibutuhkan:

grep -E '^users:' /etc/group |sed -e 's/^.*://'

atau menggunakan variabel shell:

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

Namun, itu hanya mencantumkan yang tidak dalam grup default . Untuk menambahkan orang-orang , Anda perlu memperhitungkan file password, misalnya, dengan mengekstraksi jumlah kelompok-id dari /etc/group, dan mencetak pengguna yang grup standar pertandingan dari /etc/passwd, misalnya,

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

Anda bisa melakukan hal yang sama hanya dengan menggunakan grep dan sed, tetapi lebih banyak pekerjaan daripada menggunakan awk.

Jawaban lain yang disarankan diusulkan menggunakan getent, yang juga kemungkinan berada pada mesin Linux (dengan Debian, itu adalah bagian dari GNU libc). Namun pemeriksaan cepat yang menunjukkan itu hanya menyediakan /etc/groupkonten.

Saya (seperti kebanyakan) tidak memiliki libusersatau lidmenginstal, jadi saya tidak dapat mengomentari apakah memenuhi persyaratan OP.

Ada juga idprogram, yang memberikan informasi grup. Seseorang mungkin mengembangkannya sebagai jawaban yang mungkin.


Atau hanya sed -n "s/^$groupname:.*://p" /etc/grouptetapi itu masih bisa melaporkan hasil yang salah jika nama grup berisi operator RE ( .misalnya tidak jarang dalam nama grup).
Stéphane Chazelas

GNU getentjuga akan meminta LDAP / NIS ... meskipun mungkin tidak ketika enumerasi secara eksplisit dinonaktifkan untuk basis data grup.
Stéphane Chazelas

Catatan yang groupstidak akan membantu karena mencantumkan grup yang diberikan pengguna sebagai lawan dari daftar anggota grup tertentu.
Stéphane Chazelas

2

Bekerja seperti pesona:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1

Tidak seperti jawaban @ARG yang diterima, perintah ini mencantumkan pengguna yang memiliki <groupname> sebagai grup utama mereka
Bhavik

ini seharusnya jawaban yang diterima
Nikolay Nenov

1
Saya tidak setuju. Karena membaca pengguna di / etc / passwd, ini tidak akan bekerja dengan modul nsswitch lain yang mengakses LDAP dll.
Ivan Vučica

Tidak bekerja dengan benar untuk saya: Saya mendapat 4 anggota dalam grup sedangkan sudo lid -gdaftar 8. @ Bhavik Jawaban yang diterima juga tidak benar.
DKroot

2

Beberapa akan memberitahu Anda untuk menginstal libuser (untuk 'tutup') atau anggota (untuk 'anggota'). Tetapi berdasarkan jawaban https://unix.stackexchange.com/a/349648/77959 yang menangani masalah ini dengan keanggotaan grup login, saya menemukan grup lain tidak dicakup oleh skrip itu. Jadi - inilah yang terbaik dari kedua pendekatan yang digabungkan:

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi

Ini bekerja dengan benar pada sistem saya tidak seperti jawaban yang melibatkan getentatau grep'^group_name_here:' /etc/group
DKroot

0

Modifikasi pendekatan user3717722 ini akan mencantumkan anggota grup dalam database NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.