Linux: nhóm so với tên người dùng nhóm


12

Có ai biết tại sao lệnh linux

    groups 

hiển thị một đầu ra khác với

    groups username 

Người dùng đã đăng nhập giống như tên người dùng tham số. Thí dụ:

    thorsten@ubuntu:~/tmp$ groups
    thorsten adm dialout cdrom plugdev lpadmin admin sambashare
    thorsten@ubuntu:~/tmp$ groups thorsten
    thorsten : thorsten adm dialout cdrom plugdev nogroup lpadmin admin sambashare

1
Có rất nhiều bản sao của câu hỏi này mà tôi thậm chí không biết bắt đầu từ đâu.
dùng1686

Câu trả lời:


12

Khi bạn chạy , nó sẽ tra cứu 1 người dùng đã cho và (mặc dù đó có thể là LDAP, NIS hoặc thứ gì khác 2 ) và hiển thị cho bạn tất cả các nhóm được tìm thấy.groups username/etc/passwd/etc/group

Mặt khác, khi bạn chạy groupslệnh mà không có bất kỳ đối số nào, nó chỉ liệt kê tất cả các nhóm mà nó thuộc về 3 - không nhất thiết giống như những gì được liệt kê trong đó /etc/group. (Xem phần giải thích bên dưới.) Trong thực tế, các tra cứu duy nhất được thực hiện /etc/grouplà để dịch GID sang tên nhóm.


Mỗi quy trình có một bộ thông tin xác thực , bao gồm (trong số những thứ khác) một "ID nhóm thực" (GID chính), "ID nhóm hiệu quả" (EGID) và danh sách ID "nhóm bổ sung" (GID phụ). Theo mặc định, một quá trình kế thừa thông tin đăng nhập từ cha mẹ của nó; tuy nhiên, các quy trình chạy bằng root (UID 0) hoặc có CAP_SETUIDkhả năng được phép đặt thông tin xác thực tùy ý.

Cụ thể, khi bạn đăng nhập vào Linux (cho dù là tty, X11 hoặc qua SSH), quá trình đăng nhập (/ bin / login, gdm, sshd) sẽ tìm tên người dùng của bạn để xác định UID, GID chính và GID phụ của bạn . Trên máy cá nhân, điều này chỉ có nghĩa là đọc các dòng passwdgrouptệp thích hợp (hoặc NIS, LDAP, v.v.).

Tiếp theo, quy trình đăng nhập chuyển 4 sang các thông tin đăng nhập đó trước khi bắt đầu phiên của bạn và mọi quy trình bạn khởi chạy từ bây giờ sẽ có cùng UID & GID - hệ thống không kiểm tra /etc/groupnữa 5 và sẽ không nhận bất kỳ sửa đổi nào được thực hiện.

Theo cách này, /usr/bin/groupsquy trình sẽ thuộc về các nhóm giống như bạn đã làm khi bạn đăng nhập , chứ không phải những gì cơ sở dữ liệu nói rằng bạn đang tham gia.

Lưu ý: Giải thích trên cũng áp dụng cho hầu hết tất cả các Unix; đối với gia đình Windows NT (ngoại trừ UID và GID đều được gọi là "SID", không có "nhóm chính", thông tin đăng nhập được gọi là "mã thông báo quy trình" và CAP_SETUIDSeCreateTokenPriv đặc biệt hoặc SeTcbPriv đặc biệt ); và có khả năng cho hầu hết các hệ điều hành đa người dùng khác.


1 getpwuid () và getgrouplist () được sử dụng để tra cứu các nhóm người dùng.

2 Trên Linux, glibc sử dụng /etc/nsswitch.confđể xác định nơi cần tìm thông tin này.

3 groups sử dụng getgid (), getegid () và getgroups () để có được thông tin đăng nhập của riêng mình.

4 setuid (), setgid (), initgroups () và có liên quan.

5 Một ngoại lệ, tất nhiên, là những công cụ khác nhau mà chạy cao ( setuid ) chẳng hạn như su, sudo, sg, newgrp, pkexec, và vân vân. Điều này có nghĩa là su $USERsẽ sinh ra một shell với danh sách nhóm được cập nhật.


3

groupstự nó cung cấp cho các thành viên nhóm hiện tại của chủ sở hữu của quá trình. Điều này có thể khác với groups <username>nếu nhómdb đã thay đổi kể từ khi quy trình bắt đầu hoặc chủ sở hữu quy trình thay đổi.


groupskhông cung cấp tư cách thành viên hiện tại , mà là "hiện tại" tại thời điểm quy trình đăng nhập (/ sbin / login, gdm, sshd) được gọi initgroups().
dùng1686

1

Chỉ cần khởi động lại máy tính và cả nhóm và nhóm người dùng sẽ cho kết quả như nhau.

Lý do họ khác nhau là vì bạn đã thêm mình vào một nhóm mới mà bạn không phải là thành viên khi bạn khởi động máy tính.


Bạn chắc chắn không cần phải khởi động lại toàn bộ hệ thống! Bạn chỉ cần bắt đầu một phiên đăng nhập mới (tức là trên bảng điều khiển ảo mới, bằng cách sử dụng su, đóng lại một phiên hiện tại). Bạn cũng có thể sử dụng newgrpđể bắt đầu các quy trình với nhóm mới đi kèm.
pabouk

1
Tôi chỉ có nghĩa là đưa ra một giải pháp khắc phục nhanh đơn giản mà sẽ hoạt động mọi lúc. Có rất nhiều câu trả lời khác đã trả lời chi tiết câu hỏi này. Đôi khi những gì mọi người muốn, giống như trong trường hợp của tôi, là một giải pháp đơn giản chỉ hoạt động mà không cần trải qua vài bước.
Alex

0

Chạy updatedb, xem có thay đổi gì không.

Điều tương tự trong máy OSX của tôi khi groupdb không thay đổi:

albert-hotspot:~ sami$ groups sami
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ groups
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ 
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.