Làm cách nào tôi có thể tìm ra người dùng nào trong một nhóm trong Linux?


68

Gần đây tôi đã tạo người dùng mới và gán họ cho một số nhóm nhất định. Tôi đã tự hỏi nếu có một lệnh hiển thị tất cả người dùng được gán cho một nhóm nhất định? Tôi đã thử sử dụng lệnh 'nhóm' tuy nhiên bất cứ khi nào tôi sử dụng lệnh này đều nói 'nhóm: không tìm thấy'


3
Đó là groupsmệnh lệnh. Không chắc là bạn không có nó trên Linux, vì nó là một phần của coreutils.
Thomas Dickey

@ThomasDickey Nhưng điều đó là có thể - như trên một số NAS.
Thomas W.

Câu trả lời:


43

Bạn có thể sử dụng grep:

grep '^group_name_here:' /etc/group

Điều này chỉ liệt kê các thành viên nhóm bổ sung, không phải người dùng có nhóm này là nhóm chính của họ. Và nó chỉ tìm thấy các nhóm cục bộ, không phải các nhóm từ một dịch vụ mạng như LDAP.


6
Không hoạt động với xác thực tập trung.
Maxim Egorushkin

1
Điều này có thể thực sự khó hiểu có lẽ vì sự khác biệt chính / phụ. Tôi nghĩ rằng điều này nên tránh để ủng hộ. sudo lid -g {group}Tôi có một hệ thống trong đó câu trả lời này liệt kê 8 người dùng trong một nhóm trong khi sudo lid -g {group}liệt kê 10.
DKroot

Xem getentcâu trả lời của @M Hur Jensen bên dưới
Scrutari

84

Tôi thích sử dụng lệnh getent ...

Vì getent sử dụng dịch vụ cùng tên với hệ thống, getent sẽ hiển thị tất cả thông tin, bao gồm cả thông tin thu được từ các nguồn thông tin mạng như LDAP.

Vì vậy, đối với một nhóm, bạn nên sử dụng ...

getent group name_of_group

nơi name_of_group được thay thế bằng nhóm bạn muốn tìm kiếm. Lưu ý rằng điều này chỉ trả về tư cách thành viên nhóm bổ sung, nó không bao gồm những người dùng có nhóm này là nhóm chính của họ.

Có rất nhiều tra cứu khác mà bạn có thể làm ... passwdlà một công cụ hữu ích khác, bạn sẽ cần liệt kê các nhóm chính.


1
Các câu trả lời khác không áp dụng nếu bạn không phải là quản trị viên và thông tin nhóm được lưu trữ trong máy chủ khác.
Andrés Alcarraz

1
Điều này có thể thực sự khó hiểu có lẽ vì sự khác biệt chính / phụ. Tôi nghĩ rằng điều này nên tránh để ủng hộ. sudo lid -g {group}Tôi có một hệ thống trong đó câu trả lời này liệt kê 8 người dùng trong một nhóm trong khi sudo lid -g {group}liệt kê 10.
DKroot

12

Dễ làm hơn groups [username]

Nếu bạn muốn liệt kê tất cả người dùng cục bộ và các nhóm địa phương của họ, bạn có thể làm

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

Nếu bạn nhận được "nhóm: lệnh không tìm thấy", có khả năng bạn đã chỉnh sửa đường dẫn môi trường của mình tệ hơn, để đặt lại đường dẫn của bạn PATH=$(getconf PATH)


Nó hoạt động cho một nhóm cụ thể nếu | grep {group}được thêm vào và đưa ra câu trả lời chính xác không giống như getent group name_of_grouphoặcgrep '^group_name_here:' /etc/group
DKroot

1
Thay vì cat /etc/passwd, bạn nên sử dụng gentent passwdđể người dùng trong nis / ldap vẫn được liệt kê. Hạn chế duy nhất là nó có thể mất khá nhiều thời gian.
Brian Minton

8
tên nhóm -g tên nhóm -l

liệt kê tất cả người dùng trong nhóm được đặt tên.


Lưu ý rằng đó groupmemslà một phần của các tiện ích bóng được sử dụng trên hầu hết các bản phân phối Linux, tuy nhiên groupmemshiện không có trong Debian và phái sinh (một lỗi hiện đã được sửa nhưng chưa được đưa vào bất kỳ bản phát hành nào (kể từ tháng 11 năm 2016))
Stéphane Chazelas

2
Cũng lưu ý rằng groupmemschỉ giao dịch với các nhóm trong /etc/group(không phải nhóm trong LDAP hoặc cơ sở dữ liệu người dùng khác) và yêu cầu các đặc quyền siêu người dùng khi nó cố gắng mở / etc / gshadow.
Stéphane Chazelas

Mặc dù có những cảnh báo được đề cập ở trên, lệnh này lý tưởng cho một số tình huống nhất định vì nó không yêu cầu phân tích thêm đầu ra (tức là cutvà bạn bè).
bonh

Điều này có thể thực sự khó hiểu có lẽ vì sự khác biệt chính / phụ. Tôi nghĩ rằng điều này nên tránh để ủng hộ sudo lid -g {group}. Tôi có một hệ thống trong đó câu trả lời này liệt kê 8 người dùng trong một nhóm trong khi sudo lid -g {group}liệt kê 10.
DKroot

5

Tôi ngạc nhiên không ai nhắc đến

id <user>

Lệnh này sẽ đưa ra một danh sách các nhóm người dùng đang ở.


3
Bởi vì - trái với tiêu đề - người hỏi muốn biết người dùng trong một nhóm nhất định, chứ không phải các nhóm của một người dùng nhất định, như chi tiết trong câu hỏi. Bây giờ tôi viết lại tiêu đề cho phù hợp với nội dung.
Dubu

Aaah, tôi hiểu rồi. Tôi nên đọc văn bản câu hỏi tốt hơn. Cảm ơn.
Alex

4

groupslệnh in thành viên nhóm cho người dùng. Bạn có thể sử dụng lidlệnh để liệt kê người dùng trong một nhóm như:

# lid -g <groupname>

4
lidlà một phần của libuser, không được cài đặt theo mặc định trên nhiều bản phân phối.
Chris Down

2

OP đặt câu hỏi để loại trừ khả năng sử dụng lệnh nhóm . Vì đó là một phần của coreutils trên Linux, nên (a) nó đã bị xóa hoặc (b) OP đang nhập sai tên.

OP có thể đã sử dụng groupsnhư thế này, ví dụ:

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

Một câu trả lời được đề xuất chỉ là grep's cho tên nhóm trong /etc/group. Đôi khi điều đó làm việc như dự định.

Việc sử dụng grep tốt hơn một chút sẽ tính đến cú pháp của /etc/group:

group_name:password:GID:user_list

sao cho chỉ phần trước dấu hai chấm đầu tiên là tên nhóm hợp lệ. Một grep đơn giản mà không liên quan đến cú pháp có thể (và sẽ) nhận các kết quả sai lệch từ tệp. Sử dụng các biểu thức chính quy để làm cho grep khớp chính xác những gì cần thiết:

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

hoặc sử dụng biến shell:

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

Tuy nhiên, điều đó chỉ liệt kê những người không thuộc một nhóm mặc định . Để thêm chúng , bạn cần tính đến tệp mật khẩu, ví dụ: bằng cách trích xuất số id nhóm từ /etc/groupvà in người dùng có nhóm mặc định khớp với /etc/passwd, ví dụ:

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

Bạn có thể làm điều tương tự bằng cách chỉ sử dụng grep và sed, nhưng nó hiệu quả hơn so với sử dụng awk.

Một câu trả lời được đề xuất khác được đề xuất bằng cách sử dụng getent, cũng có khả năng là trên máy Linux (với Debian, nó là một phần của GNU libc). Tuy nhiên, kiểm tra nhanh cho thấy nó chỉ cung cấp /etc/groupnội dung.

Tôi (giống như hầu hết) không có libusershoặc không lidcài đặt, vì vậy tôi không thể nhận xét liệu nó có thỏa mãn điều kiện của OP hay không.

Ngoài ra còn có idchương trình, cung cấp thông tin nhóm. Ai đó có thể mở rộng về điều đó như một câu trả lời có thể.


Hoặc chỉ sed -n "s/^$groupname:.*://p" /etc/groupnhưng điều đó vẫn có thể báo cáo kết quả sai nếu tên nhóm chứa toán tử RE ( .ví dụ: không phổ biến trong tên nhóm).
Stéphane Chazelas

GNU getentcũng sẽ truy vấn LDAP / NIS ... mặc dù có thể không khi liệt kê bị vô hiệu hóa rõ ràng cho cơ sở dữ liệu nhóm.
Stéphane Chazelas

Lưu ý rằng điều đó groupssẽ không hữu ích vì nó liệt kê các nhóm mà một người dùng nhất định là thành viên trái ngược với danh sách các thành viên của một nhóm nhất định.
Stéphane Chazelas

2

Hoạt động như một lá bùa:

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

Không giống như câu trả lời được chấp nhận của @ARG, lệnh này liệt kê những người dùng có <tên nhóm> là nhóm chính của họ
Bhasta

đây phải là câu trả lời được chấp nhận
Nikolay Nenov

1
Tôi không đồng ý. Bởi vì nó đọc người dùng trong / etc / passwd, điều này sẽ không hoạt động với các mô-đun nsswitch khác truy cập LDAP, v.v.
Ivan Vučica

Không hoạt động chính xác với tôi: Tôi có 4 thành viên trong một nhóm trong khi sudo lid -gliệt kê 8. @Bhasta Câu trả lời được chấp nhận cũng không đúng.
DKroot

2

Một số người sẽ bảo bạn cài đặt libuser (cho 'nắp') hoặc thành viên (cho 'thành viên'). Nhưng dựa trên câu trả lời https://unix.stackexchange.com/a/349648/77959 đã xử lý vấn đề này với tư cách thành viên nhóm đăng nhập, tôi thấy một nhóm khác không nằm trong kịch bản đó. Vì vậy - đây là cách tốt nhất của cả hai phương pháp kết hợp:

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

Nó hoạt động chính xác trên hệ thống của tôi không giống như các câu trả lời liên quan getenthoặc grep'^group_name_here:' /etc/group
DKroot

0

Việc sửa đổi phương pháp tiếp cận user3717722 này sẽ liệt kê các thành viên nhóm trong cơ sở dữ liệu NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.