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'

Jess Louise
sumber
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.

ARG
sumber
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.

Murray Jensen
sumber
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)

ZN13
sumber
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.

pengguna198963
sumber
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.

Alex
sumber
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>
Kadir
sumber
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.

Thomas Dickey
sumber
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
Bhavik
sumber
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
flowtron
sumber
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
Holger Foersterling
sumber