Lệnh id: kiểm tra UID và nhóm, whoami, groups và nhóm phụ

Môi trường thử nghiệmHọ RHELAlmaLinux 9.8coreutils 8.32Tài khoản rootDebian 12 · coreutils 9.1 tài khoản thường
Lệnh người dùng · nhómid, whoami, groupsVị trí/usr/bin/id

Trên máy chủ Linux, để kiểm tra UID và nhóm của tài khoản hiện tại thì dùng lệnh id; nếu chỉ cần tên tài khoản thì dùng whoami, còn nếu chỉ cần tên nhóm thì dùng groups. Khi chạy lần lượt ba lệnh trên máy chủ AlmaLinux 9 và Debian 12 rồi so sánh kết quả, id -un và whoami in ra cùng một tên tài khoản, còn groups in ra danh sách nhóm của id chỉ giữ lại tên.

Kết quả bên dưới được lấy trên máy chủ AlmaLinux 9.8 bằng tài khoản root và trên máy chủ Debian 12 bằng tài khoản thường. Tên và số của tài khoản đăng nhập cùng các nhóm phụ đã được đổi thành giá trị ví dụ (user1, 1000, adm, systemd-journal).

1️⃣ Cách dùng cơ bản của lệnh id

  • ↪️ Đọc ba trường uid, gid, groups

Chạy id không có tùy chọn thì thông tin của tài khoản đã chạy shell hiện tại hiện ra trên một dòng. Khi chạy bằng tài khoản root, cả ba trường đều là 0(root).

id
uid=0(root) gid=0(root) groups=0(root)

Trường uid là số và tên của tài khoản, trường gid là số và tên của nhóm chính (primary group). Trường groups là toàn bộ các nhóm mà tài khoản thuộc về, với nhóm chính đứng đầu.

Ghi tên tài khoản sau id thì thông tin của tài khoản đó được in ra. Khi kiểm tra tài khoản thường user1 có nhóm phụ, trong trường groups sau nhóm chính user1 là adm và systemd-journal. Những nhóm mà tài khoản thuộc thêm ngoài nhóm chính này là nhóm phụ (supplementary group).

id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1),4(adm),190(systemd-journal)

Nhiều tài khoản có số UID và gid giống nhau nên dễ coi hai con số là cùng một giá trị, nhưng tài khoản adm có sẵn trên máy chủ có UID là 3 và số nhóm chính là 4. Tài khoản operator có nhóm chính là root.

id adm
uid=3(adm) gid=4(adm) groups=4(adm)
id operator
uid=11(operator) gid=0(root) groups=0(root)

Ghi nhiều tài khoản thì mỗi tài khoản được in trên một dòng.

id root bin
uid=0(root) gid=0(root) groups=0(root)
uid=1(bin) gid=1(bin) groups=1(bin)

Ghi một tài khoản không tồn tại thì lỗi [no such user] xuất hiện, và mã thoát là 1.

id no-such-user9
id: 'no-such-user9': no such user
echo $?
1

Mã thoát khi ghi một tài khoản có tồn tại là 0, nên có thể dùng trong script làm điều kiện kiểm tra tài khoản có tồn tại hay không.

2️⃣ Các tùy chọn của lệnh id

  • ↪️ -u, -g, -G cho số và -n cho tên

Khi chỉ cần chuyển một con số trong toàn bộ kết quả cho script, chọn riêng một trường bằng tùy chọn. -u in ra UID, -g in ra số nhóm chính, còn -G in ra số của tất cả các nhóm mà tài khoản thuộc về.

id -u
0
id -u daemon
2
id -G user1
1000 4 190

Dùng kèm -n thì tên hiện ra thay cho số. Khi kiểm tra nhóm của user1 bằng [id -Gn], ba con số đổi thành ba cái tên.

id -Gn user1
user1 adm systemd-journal
id -gn user1
user1

-n và -r được dùng cùng với một trong các tùy chọn -u, -g, -G. Khi chỉ ghi riêng -n, lỗi bên dưới xuất hiện.

id -n
id: cannot print only names or real IDs in default format

-r in ra ID thực (real) thay cho ID hiệu dụng (effective). Khi chạy [id -ur] trong shell của tài khoản root, kết quả là 0. Nếu ghi cùng lúc từ hai tùy chọn chọn số trở lên, như -u và -g, thì lỗi [cannot print "only" of more than one choice] xuất hiện. Các tùy chọn được tổng hợp bên dưới.

Tùy chọnSao chépMô tả
-u--userIn ra số UID
-g--groupIn ra số nhóm chính
-G--groupsIn ra số của tất cả các nhóm mà tài khoản thuộc về
-n--nameDùng cùng -u, -g, -G để in ra tên thay cho số
-r--realDùng cùng -u, -g, -G để in ra ID thực (real) thay cho ID hiệu dụng
Tùy chọnSao chépMô tả
-Z--contextChỉ in ra ngữ cảnh bảo mật của tiến trình
-z--zeroNgăn cách các mục kết quả bằng ký tự NUL thay cho khoảng trắng; không dùng được ở định dạng mặc định
-aChỉ được nhận để tương thích với các phiên bản id khác rồi bị bỏ qua
--helpIn ra trợ giúp
--versionIn phiên bản

🔲 Trình mô phỏng lệnh id

Trình mô phỏng bên dưới bắt đầu bằng tài khoản user1 có nhóm phụ. Sau khi thêm nhóm wheel bằng chip [🖊 Other window], có thể so sánh [id] với [id user1] và kiểm tra nhóm của shell mới bằng chip [🔁 Log in again].

Trình mô phỏng lệnh idcoreutils 8.32
[root@server work]#
Chỉ hoạt động trong trình duyệt. Sau khi đổi nhóm bằng chip [🖊 Other window], so sánh [id] với [id user1] rồi kiểm tra nhóm của shell mới bằng chip [🔁 Log in again].

3️⃣ Lệnh whoami và id -un

  • ↪️ Kiểm tra tên tài khoản hiện tại và kiểm tra tài khoản khác

Nếu chỉ cần tên tài khoản của shell hiện tại thì chạy whoami. Trang man mô tả whoami là lệnh giống với [id -un]. Khi chạy hai lệnh bằng tài khoản root, cả hai đều in ra root.

whoami
root
id -un
root

Với tài khoản thường trên máy chủ Debian 12, hai lệnh cũng in ra cùng một tên tài khoản.

whoami
user1
id -un
user1

whoami in ra tên tài khoản ứng với UID hiệu dụng (effective) hiện tại. Đây là lệnh chỉ kiểm tra tài khoản hiện tại, nên thêm tên tài khoản vào sau thì báo lỗi.

whoami user1
whoami: extra operand 'user1'
Try 'whoami --help' for more information.

Tên hoặc số của tài khoản khác được kiểm tra bằng cách ghi tài khoản đó sau id.

id -un user1
user1

Ghi -u thay cho -un thì ở cùng vị trí, số UID hiện ra thay cho tên tài khoản.

4️⃣ Lệnh groups và nhóm phụ

  • ↪️ Nhóm chính và nhóm phụ, và shell sau khi đổi nhóm

groups chỉ in ra tên nhóm trên một dòng. Không ghi tên tài khoản thì nhóm của shell hiện tại hiện ra, và với tài khoản root chỉ có một nhóm root.

groups
root

Ghi tên tài khoản thì tên tài khoản và các nhóm sau dấu hai chấm hiện ra. Khi ghi nhiều tài khoản, mỗi tài khoản được in trên một dòng.

groups user1 daemon
user1 : user1 adm systemd-journal
daemon : daemon

Nhóm chính và nhóm phụ được ghi ở những chỗ khác nhau. Nhóm phụ được ghi dưới dạng thành viên ở trường thứ tư của cơ sở dữ liệu nhóm (/etc/group), còn nhóm chính được ghi bằng số ở trường thứ tư của thông tin tài khoản (/etc/passwd).

getent group adm
adm:x:4:user1
getent group user1
user1:x:1000:
getent passwd daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

Nhóm user1, nhóm chính của user1, có trường thứ tư để trống, còn ở nhóm phụ adm thì user1 được ghi là thành viên. Số 2 ở trường thứ tư trên dòng của tài khoản daemon là số nhóm chính.

Để thêm tài khoản vào nhóm phụ thì dùng lệnh usermod ở dạng [usermod -aG nhóm tài khoản]. Nếu chỉ dùng -G mà không có -a, tài khoản sẽ bị loại khỏi những nhóm phụ đang có mà không được ghi trong danh sách, nên ghi kèm -a.

groups chạy không kèm tên tài khoản in ra nhóm của tiến trình shell hiện tại. Trang man giải thích rằng khi cơ sở dữ liệu nhóm thay đổi, giá trị này có thể khác với cơ sở dữ liệu.

Vì vậy ngay sau khi đổi nhóm, kiểm tra nhóm trong cơ sở dữ liệu bằng [groups tài khoản] hoặc [id tài khoản], và đăng nhập lại để áp dụng cho shell. Lệnh đổi ID nhóm hiện tại trong khi vẫn đăng nhập là newgrp.

🔢 FAQ & nội dung đề xuất

Có thể. Khi chạy [id 0] trên máy chủ AlmaLinux 9.8, kết quả là uid=0(root) gid=0(root) groups=0(root), giống với [id root].

Từ số được ghi ở UID_MIN trong /etc/login.defs. Trên máy chủ AlmaLinux 9.8 là 1000, còn SYS_UID_MIN và SYS_UID_MAX trong cùng tệp là 201 và 999, tức phạm vi tài khoản hệ thống.

who am i là who kèm thêm hai từ phía sau; nó hoạt động giống tùy chọn -m và in ra một dòng thông tin đăng nhập của terminal đang gõ. whoami chỉ in ra một dòng tên tài khoản của UID hiệu dụng hiện tại.

ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 5   +   4   =