Hangi kullanıcıların Linux içinde bir grupta olduğunu nasıl öğrenebilirim?


68

Son zamanlarda yeni kullanıcılar oluşturup bunları belirli gruplara atadım. Belirli bir gruba atanmış tüm kullanıcıları gösteren bir komut olup olmadığını merak ediyordum. 'Groups' komutunu kullanmayı denedim, fakat bunu ne zaman kullansam 'grupları: bulunamadı' diyor.


3
Bu groupsemirdir. Coreutils'in bir parçası olduğu için Linux'ta bulunmaması olası değildir.
Thomas Dickey

@ThomasDickey Ama bu mümkün - bazı NAS'larda olduğu gibi.
Thomas W.,

Yanıtlar:


43

Grep kullanabilirsiniz:

grep '^group_name_here:' /etc/group

Bu, yalnızca ek grup üyeliğini listeler, bu grubu birincil grubu olarak alan kullanıcıyı değil. LDAP gibi bir şebeke servisindeki grupları değil yalnızca yerel grupları bulur.


6
Merkezi kimlik doğrulama ile çalışmaz.
Maxim Egorushkin

1
Bu muhtemelen birincil / ikincil farktan dolayı kafa karıştırıcı olabilir. Bunun lehine kaçınılmalıdır düşünüyorum sudo lid -g {group}bir sisteme sahip .I nerede ise bir grup Bu cevap listeleri 8 kullanıcıları sudo lid -g {group}listeleri 10.
DKroot

Bkz getentaşağıda @Murray Jensen tarafından cevap
scrutari

84

Getent komutunu kullanmayı tercih ederim ...

Getent sistemle aynı isim servisini kullandığından, getent LDAP gibi ağ bilgi kaynaklarından edinilenler de dahil olmak üzere tüm bilgileri gösterecektir.

Yani bir grup için aşağıdakileri kullanmalısınız ...

getent group name_of_group

burada name_of_group , aramak istediğiniz grupla değiştirilir. Bunun yalnızca ek grup üyeliğine geri döndüğünü, bu grubu birincil grubu olarak alan kullanıcıları içermediğini unutmayın.

passwdBirincil grupları listelemeniz gereken ... başka bir yararlı olan ... ... yapabileceğiniz daha birçok arama var .


1
Yönetici değilseniz ve grup bilgileri başka bir sunucuda saklanıyorsa diğer cevaplar geçerli değildir.
Andrés Alcarraz

1
Bu muhtemelen birincil / ikincil farktan dolayı kafa karıştırıcı olabilir. Bunun lehine kaçınılmalıdır düşünüyorum sudo lid -g {group}bir sisteme sahip .I nerede ise bir grup Bu cevap listeleri 8 kullanıcıları sudo lid -g {group}listeleri 10.
DKroot

12

Yapması daha kolay groups [username]

Tüm yerel kullanıcıları ve yerel gruplarını listelemek istiyorsanız,

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

"Groups: komut bulunamadı" ifadesini alırsanız, yolunuzu sıfırlamak için çevre yolunuzu daha kötüsü için düzenlediğiniz muhtemeldir. PATH=$(getconf PATH)


| grep {group}getent group name_of_groupgrep '^group_name_here:' /etc/group
Eklenirse

1
Yerine cat /etc/passwd, kullanmak gerekir gentent passwdnis kadar kullanıcılarını / ldap yine olacaktı. Tek dezavantajı oldukça uzun sürebilir.
Brian Minton

8
groupmems -g groupname -l

adlandırılmış gruptaki tüm kullanıcıları listeler.


Not groupmemsancak, çoğu Linux dağıtımlarının kullanılan gölge araçları parçasıdır groupmemsanda (bir Debian devamsızlık ve türevi olan böcek Nov 2016) itibariyle (şimdi sabit ama henüz bir sürümde dahil değildir)
Stéphane Chazelas

2
Ayrıca, groupmemsyalnızca /etc/group(LDAP’deki veya diğer kullanıcı veritabanındakiler değil) içindeki gruplarla ilgilendiğini ve / etc / gshadow’u açmaya çalışırken süper kullanıcı ayrıcalıkları gerektirdiğini unutmayın.
Stéphane Chazelas

Yukarıda belirtilen uyarılara rağmen, bu komut belirli durumlar için idealdir çünkü çıktının (yani cutve arkadaşların) ayrıştırılmasını gerektirmez .
bonh

Bu muhtemelen birincil / ikincil farktan dolayı kafa karıştırıcı olabilir. Bunun lehine kaçınılması gerektiğini düşünüyorum sudo lid -g {group}. Bu cevabın bir gruptaki 8 kullanıcıyı listelediği bir sistem var sudo lid -g {group}. Oysa 10.
DKroot

5

Kimsenin bahsetmediğine şaşırdım

id <user>

Bu komut kullanıcının içinde bulunduğu grupların bir listesini verecektir.


3
Çünkü - başlığın aksine - sorgulayıcı, belirli bir gruptaki kullanıcıları, belirli bir kullanıcının gruplarını değil, soruyu ayrıntılı şekilde tanımlamak istiyordu. Şimdi içeriğe uyacak şekilde başlığı değiştirdim.
Dubu

Aaah, görüyorum. Soru metnini daha iyi okumalıydım. Teşekkürler.
Alex,

4

groupskomutu, bir kullanıcı için grup üyeliklerini yazdırır. Aşağıdaki lidgibi bir gruptaki kullanıcıları listelemek için komutu kullanabilirsiniz :

# lid -g <groupname>

4
lid, birçok dağıtıma varsayılan olarak yüklenmeyen libuser öğesinin bir parçasıdır.
Chris Down,

2

OP, groups komutunu kullanma olasılığını dışlamak için soruyu ifade etti . Bu Linux'ta coreutils'in bir parçası olduğundan, (a) kaldırıldı ya da (b) OP ismi yanlış yazıyor.

OP bunun gibi kullanılmış olabilir groups:

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

Biri önerilen cevap sadece grubun adı için grep's /etc/group. Bazen bu amaçlandığı gibi çalışır.

Grep'in biraz daha iyi kullanılması aşağıdakilerin sözdizimini dikkate alır /etc/group:

group_name:password:GID:user_list

sadece bir parçası, böylece daha önce ilk iki nokta geçerli bir grup adıdır. Sözdizimine bakmadan düz bir grep dosyadan yanıltıcı eşleşmeler alabilir (ve olacaktır). Grep öğesinin tam olarak ihtiyaç duyulanı eşleştirmesi için normal ifadeleri kullanın:

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

veya bir kabuk değişkeni kullanarak:

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

Ancak, bu yalnızca varsayılan bir grupta olmayanları listeler . Eklemek için olanlar , aralarından grup kimliği numarası çıkararak dikkate örneğin şifre dosyasını almak gerekir /etc/group, ve kimin varsayılan grubu eşleşmeler kullanıcıları baskı /etc/passwdörneğin,

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

Aynı şeyi sadece grep ve sed kullanarak da yapabilirsiniz, ancak awk kullanmaktan daha fazla iştir.

Bir getentLinux makinesinde olması muhtemel olan bir başka önerilen cevap da önerilmiştir (Debian ile birlikte, GNU libc'nin bir parçasıdır). Bununla birlikte, bunun hızlı bir kontrolü, yalnızca /etc/groupiçerik sağladığını gösterir .

Ben (çoğu gibi) kullanmıyorum libusersya da lidkurmadım, bu yüzden OP’nin koşullarını sağlayıp sağlamadığını yorumlayamıyorum.

Ayrıca idgrup bilgisi veren program da bulunmaktadır. Birisi bunun üzerine olası bir cevap olarak genişleyebilir.


Ya da sadece sed -n "s/^$groupname:.*://p" /etc/group, eğer grup ismi RE operatörleri içeriyorsa ( .örneğin grup isimlerinde nadir değildir) , yine de bu yanlış sonuçlar verebilir .
Stéphane Chazelas,

GNU getent, LDAP / NIS'yi de sorgulayacaktır ... ancak büyük olasılıkla grup veritabanı için numaralandırma açıkça devre dışı bırakılmamış olsa da.
Stéphane Chazelas,

groupsBelirli bir kullanıcının üyesi olduğu grupları listelediğinden yardım etmeyeceğini, verilen gruba ait üyelerin listesine karşılık gelmeyeceğini unutmayın .
Stéphane Chazelas

2

Tıkır tıkır çalışıyor:

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

@ARG'nin kabul edilen yanıtından farklı olarak, bu komut, <grup adı> olan kullanıcıları birincil grupları olarak listeler
Bhavik

kabul edilen cevap bu olmalı
Nikolay Nenov

1
Katılmıyorum. / Etc / passwd içindeki kullanıcıları okuduğu için, bu LDAP'a vb.
Erişen

Benim için doğru çalışmadı: Ben bir grupta 4 sudo lid -güyem var, ancak listelerde 8 var. @Bhavik Kabul edilen cevap da doğru değil.
DKroot

2

Bazıları size libuser ('kapak' için) veya üyeler ('üyeler için') kurmanızı söyler. Ancak bu konuyu giriş grubu üyeliği ile ele alan https://unix.stackexchange.com/a/349648/77959 cevabı üzerine inşa ederek bu senaryo kapsamında olmayan başka bir grup buldum. Yani - işte her iki yaklaşımın da en iyisi:

#!/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

getent'^group_name_here:' /etc/group
Dahil

0

Kullanıcının 3717722 yaklaşımındaki bu değişiklik, NIS veritabanındaki grup üyelerini listeler:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.