คำสั่ง id: ตรวจสอบ UID และกลุ่ม whoami, groups และกลุ่มเสริม

สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8coreutils 8.32บัญชี rootDebian 12 · coreutils 9.1 บัญชีผู้ใช้ทั่วไป
คำสั่งผู้ใช้ · กลุ่มid, whoami, groupsตำแหน่ง/usr/bin/id

บนเซิร์ฟเวอร์ Linux เมื่อต้องการตรวจสอบ UID และกลุ่มของบัญชีปัจจุบันให้ใช้คำสั่ง id ถ้าต้องการเฉพาะชื่อบัญชีให้ใช้ whoami และถ้าต้องการเฉพาะชื่อกลุ่มให้ใช้ groups เมื่อรันทั้งสามคำสั่งตามลำดับบนเซิร์ฟเวอร์ AlmaLinux 9 และ Debian 12 แล้วเปรียบเทียบผลลัพธ์ พบว่า id -un กับ whoami แสดงชื่อบัญชีเดียวกัน ส่วน groups แสดงรายการกลุ่มของ id โดยเหลือเฉพาะชื่อ

ผลลัพธ์ด้านล่างได้จากเซิร์ฟเวอร์ AlmaLinux 9.8 ด้วยบัญชี root และจากเซิร์ฟเวอร์ Debian 12 ด้วยบัญชีทั่วไป ชื่อและหมายเลขของบัญชีล็อกอินกับกลุ่มเสริมถูกเปลี่ยนเป็นค่าตัวอย่าง (user1, 1000, adm, systemd-journal)

1️⃣ วิธีใช้พื้นฐานของคำสั่ง id

  • ↪️ การอ่านสามช่อง uid, gid, groups

เมื่อรัน id โดยไม่ใส่ออปชัน ข้อมูลของบัญชีที่รันเชลล์ปัจจุบันจะแสดงในบรรทัดเดียว เมื่อรันด้วยบัญชี root ทั้งสามช่องเป็น 0(root)

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

ช่อง uid คือหมายเลขและชื่อของบัญชี ช่อง gid คือหมายเลขและชื่อของกลุ่มหลัก (primary group) ส่วนช่อง groups คือกลุ่มทั้งหมดที่บัญชีนั้นสังกัด โดยกลุ่มหลักอยู่หน้าสุด

เมื่อพิมพ์ชื่อบัญชีต่อท้าย id จะแสดงข้อมูลของบัญชีนั้น เมื่อตรวจบัญชีทั่วไป user1 ที่มีกลุ่มเสริม ในช่อง groups มี adm และ systemd-journal ต่อจากกลุ่มหลัก user1 กลุ่มที่สังกัดเพิ่มนอกเหนือจากกลุ่มหลักเหล่านี้คือกลุ่มเสริม (supplementary group)

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

มีหลายบัญชีที่หมายเลข UID กับ gid ตรงกัน จึงเข้าใจได้ง่ายว่าตัวเลขสองตัวนี้เป็นค่าเดียวกัน แต่บัญชี adm ที่มีอยู่ในเซิร์ฟเวอร์ตั้งแต่ต้นมี UID เป็น 3 และหมายเลขกลุ่มหลักเป็น 4 ส่วนบัญชี operator มีกลุ่มหลักเป็น root

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

เมื่อพิมพ์หลายบัญชี จะแสดงบรรทัดละหนึ่งบัญชี

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

ถ้าพิมพ์บัญชีที่ไม่มีอยู่ จะขึ้นข้อผิดพลาด [no such user] และรหัสออกคือ 1

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

รหัสออกเมื่อพิมพ์บัญชีที่มีอยู่คือ 0 จึงใช้ในสคริปต์เป็นเงื่อนไขตรวจว่ามีบัญชีนั้นหรือไม่ได้

2️⃣ ออปชันของคำสั่ง id

  • ↪️ -u, -g, -G สำหรับหมายเลข และ -n สำหรับชื่อ

เมื่อต้องการส่งหมายเลขเพียงตัวเดียวจากผลลัพธ์ทั้งหมดให้สคริปต์ ให้เลือกช่องเดียวด้วยออปชัน -u แสดง UID -g แสดงหมายเลขกลุ่มหลัก และ -G แสดงหมายเลขของกลุ่มทั้งหมดที่สังกัด

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

เมื่อใช้ -n ร่วมด้วย จะแสดงชื่อแทนหมายเลข เมื่อตรวจกลุ่มของ user1 ด้วย [id -Gn] หมายเลขสามตัวก็เปลี่ยนเป็นชื่อสามชื่อ

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

-n และ -r ใช้ร่วมกับตัวใดตัวหนึ่งใน -u, -g, -G เมื่อพิมพ์ -n เพียงอย่างเดียวก็ขึ้นข้อผิดพลาดด้านล่าง

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

-r แสดง ID จริง (real) แทน ID ที่มีผล (effective) เมื่อรัน [id -ur] ในเชลล์ของบัญชี root ได้ 0 ถ้าพิมพ์ออปชันที่เลือกหมายเลขตั้งแต่สองตัวขึ้นไปร่วมกัน เช่น -u กับ -g จะขึ้นข้อผิดพลาด [cannot print "only" of more than one choice] สรุปออปชันได้ดังด้านล่าง

ตัวเลือกคัดลอกคำอธิบาย
-u--userแสดงหมายเลข UID
-g--groupแสดงหมายเลขกลุ่มหลัก
-G--groupsแสดงหมายเลขของกลุ่มทั้งหมดที่สังกัด
-n--nameใช้ร่วมกับ -u, -g, -G เพื่อแสดงชื่อแทนหมายเลข
-r--realใช้ร่วมกับ -u, -g, -G เพื่อแสดง ID จริง (real) แทน ID ที่มีผล
ตัวเลือกคัดลอกคำอธิบาย
-Z--contextแสดงเฉพาะบริบทความปลอดภัยของโพรเซส
-z--zeroคั่นรายการผลลัพธ์ด้วยอักขระ NUL แทนช่องว่าง ใช้กับรูปแบบปกติไม่ได้
-aรับไว้เพื่อให้เข้ากันได้กับ id เวอร์ชันอื่นเท่านั้นและไม่นำไปใช้
--helpแสดงวิธีใช้
--versionพิมพ์เวอร์ชัน

🔲 ซิมูเลเตอร์คำสั่ง id

ซิมูเลเตอร์ด้านล่างเริ่มด้วยบัญชี user1 ที่มีกลุ่มเสริม หลังเพิ่มกลุ่ม wheel ด้วยชิป [🖊 Other window] แล้วเปรียบเทียบ [id] กับ [id user1] ได้ และตรวจกลุ่มของเชลล์ใหม่ได้ด้วยชิป [🔁 Log in again]

ซิมูเลเตอร์คำสั่ง idcoreutils 8.32
[root@server work]#
ทำงานภายในเบราว์เซอร์เท่านั้น หลังเปลี่ยนกลุ่มด้วยชิป [🖊 Other window] ให้เปรียบเทียบ [id] กับ [id user1] แล้วตรวจกลุ่มของเชลล์ใหม่ด้วยชิป [🔁 Log in again]

3️⃣ คำสั่ง whoami กับ id -un

  • ↪️ การตรวจชื่อบัญชีปัจจุบันและการตรวจบัญชีอื่น

ถ้าต้องการเฉพาะชื่อบัญชีของเชลล์ปัจจุบัน ให้รัน whoami หน้า man อธิบายว่า whoami เป็นคำสั่งเดียวกับ [id -un] เมื่อรันสองคำสั่งนี้ด้วยบัญชี root ทั้งคู่แสดง root

whoami
root
id -un
root

ด้วยบัญชีทั่วไปบนเซิร์ฟเวอร์ Debian 12 สองคำสั่งนี้ก็แสดงชื่อบัญชีเดียวกัน

whoami
user1
id -un
user1

whoami แสดงชื่อบัญชีที่ตรงกับ UID ที่มีผล (effective) ในขณะนั้น เป็นคำสั่งที่ตรวจเฉพาะบัญชีปัจจุบัน ถ้าใส่ชื่อบัญชีต่อท้ายจึงขึ้นข้อผิดพลาด

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

ชื่อหรือหมายเลขของบัญชีอื่นตรวจได้โดยพิมพ์บัญชีนั้นต่อท้าย id

id -un user1
user1

ถ้าพิมพ์ -u แทน -un ตำแหน่งเดียวกันจะแสดงหมายเลข UID แทนชื่อบัญชี

4️⃣ คำสั่ง groups กับกลุ่มเสริม

  • ↪️ กลุ่มหลักกับกลุ่มเสริม และเชลล์หลังเปลี่ยนกลุ่ม

groups แสดงเฉพาะชื่อกลุ่มในบรรทัดเดียว ถ้าไม่พิมพ์ชื่อบัญชีจะแสดงกลุ่มของเชลล์ปัจจุบัน และด้วยบัญชี root มีเพียง root กลุ่มเดียว

groups
root

ถ้าพิมพ์ชื่อบัญชี จะแสดงชื่อบัญชีและกลุ่มต่อจากเครื่องหมายโคลอน เมื่อพิมพ์หลายบัญชีก็แสดงบรรทัดละหนึ่งบัญชี

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

กลุ่มหลักกับกลุ่มเสริมถูกบันทึกไว้คนละที่ กลุ่มเสริมถูกเขียนเป็นสมาชิกในช่องที่สี่ของฐานข้อมูลกลุ่ม (/etc/group) ส่วนกลุ่มหลักถูกเขียนเป็นหมายเลขในช่องที่สี่ของข้อมูลบัญชี (/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

กลุ่ม user1 ซึ่งเป็นกลุ่มหลักของ user1 มีช่องที่สี่ว่าง ส่วนกลุ่มเสริม adm มี user1 เขียนเป็นสมาชิก เลข 2 ในช่องที่สี่ของบรรทัดบัญชี daemon คือหมายเลขกลุ่มหลัก

เมื่อต้องการเพิ่มบัญชีเข้ากลุ่มเสริม ให้ใช้ คำสั่ง usermod ในรูป [usermod -aG กลุ่ม บัญชี] ถ้าใช้ -G โดยไม่มี -a บัญชีจะหลุดจากกลุ่มเสริมเดิมที่ไม่ได้เขียนไว้ในรายการ จึงต้องพิมพ์ -a ร่วมด้วย

groups ที่รันโดยไม่มีชื่อบัญชีจะแสดงกลุ่มของโพรเซสเชลล์ปัจจุบัน หน้า man อธิบายว่าเมื่อฐานข้อมูลกลุ่มเปลี่ยน ค่านี้อาจต่างจากฐานข้อมูลได้

ดังนั้นทันทีหลังเปลี่ยนกลุ่ม ให้ตรวจกลุ่มในฐานข้อมูลด้วย [groups บัญชี] หรือ [id บัญชี] และล็อกอินใหม่เพื่อให้มีผลกับเชลล์ ส่วนคำสั่งที่เปลี่ยน ID กลุ่มปัจจุบันโดยยังล็อกอินอยู่คือ newgrp

🔢 FAQ & เนื้อหาแนะนำ

ได้ เมื่อรัน [id 0] บนเซิร์ฟเวอร์ AlmaLinux 9.8 ได้ uid=0(root) gid=0(root) groups=0(root) เหมือนกับ [id root]

ตั้งแต่หมายเลขที่เขียนไว้ใน UID_MIN ของ /etc/login.defs บนเซิร์ฟเวอร์ AlmaLinux 9.8 คือ 1000 ส่วน SYS_UID_MIN และ SYS_UID_MAX ในไฟล์เดียวกันคือ 201 และ 999 ซึ่งเป็นช่วงของบัญชีระบบ

who am i คือ who ที่ตามด้วยคำสองคำ ทำงานเหมือนออปชัน -m และแสดงข้อมูลล็อกอินของเทอร์มินัลที่กำลังพิมพ์อยู่หนึ่งบรรทัด ส่วน whoami แสดงเพียงชื่อบัญชีของ UID ที่มีผลในขณะนั้นหนึ่งบรรทัด

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 1   +   9   =