ระบบหลายคนมีgetent
คำสั่งไปยังรายการหรือสอบถามเนื้อหาของบริการชื่อฐานข้อมูลเช่นpasswd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
จะแสดงรายการโฮมไดเรกทอรี ( ฟิลด์ตัวคั่นลำไส้ใหญ่ลำดับที่ 6 ) ของผู้ใช้ทั้งหมดในฐานข้อมูลที่สามารถระบุได้
ชื่อผู้ใช้เองอยู่ในฟิลด์แรกดังนั้นสำหรับรายชื่อผู้ใช้:
getent passwd | cut -d: -f1
(โปรดทราบว่ามันไม่ได้หมายความว่าผู้ใช้เหล่านั้นสามารถเข้าสู่ระบบหรือสร้างโฮมไดเร็กตอรี่ แต่พวกเขาเป็นที่รู้จักในระบบพวกเขาสามารถแปลเป็นรหัสผู้ใช้ได้)
สำหรับฐานข้อมูลที่ไม่สามารถระบุได้คุณสามารถลองค้นหาแต่ละ ID ผู้ใช้ที่เป็นไปได้แต่ละรายการ:
getent passwd {0..65535} | cut -d: -f1,6
(ที่นี่สมมติว่า uids หยุดที่ 65535 (บางระบบรองรับมากกว่า) และเชลล์ที่สนับสนุน zsh {x..y}
การขยายรูปแบบ ) แต่คุณไม่ต้องการที่จะทำเช่นนั้นบ่อยครั้งในระบบที่ฐานข้อมูลผู้ใช้ถูกเชื่อมต่อเครือข่าย (และมีการแคชเฉพาะที่ จำกัด ) เช่น LDAP, NIS +, SQL ... ซึ่งอาจบ่งบอกถึงปริมาณเครือข่ายจำนวนมาก (และโหลดบนเซิร์ฟเวอร์ไดเรกทอรี ) เพื่อทำการค้นหาทั้งหมด
นั่นก็หมายความว่าหากมีผู้ใช้หลายคนที่แชร์ uid เดียวกันคุณจะได้รับหนึ่งรายการต่อ uid เท่านั้นดังนั้นพลาดคนอื่น ๆ
หากคุณไม่มีgetent
คุณสามารถหันไปperl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
สำหรับgetent passwd
( $e[0]
สำหรับชื่อผู้ใช้) หรือ:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
สำหรับ getent passwd {0..65535}
ด้วย caveats เดียวกัน
ในเชลล์คุณสามารถใช้~user
เพื่อรับโฮมไดเร็กตอรี่ของuser
แต่ในเชลล์ส่วนใหญ่ที่ใช้งานได้เฉพาะกับชื่อผู้ใช้ที่ จำกัด (รายการของอักขระที่อนุญาตในชื่อผู้ใช้ที่รองรับสำหรับ~
ตัวดำเนินการส่วนขยายนั้นแตกต่างจากเชลล์ไปยังเชลล์) และ กระสุนจำนวนมาก (รวมถึงbash
), ใช้~$user
งานไม่ได้ (คุณต้องหันไปใช้eval
เมื่อชื่อของผู้ใช้ถูกเก็บในตัวแปรที่นั่น) และคุณยังคงต้องหาวิธีรับรายชื่อผู้ใช้
เชลล์บางตัวมีการสนับสนุนในตัวเพื่อรับรายการชื่อผู้ใช้นั้น
bash
: compgen -u
จะส่งคืนรายการผู้ใช้ในฐานข้อมูลที่สามารถระบุได้
zsh
: $userdirs
อาเรย์ที่เชื่อมโยงจับคู่ชื่อผู้ใช้กับโฮมไดเร็กตอรี่ (จำกัด เฉพาะฐานข้อมูลที่สามารถระบุได้, แต่ถ้าคุณทำการ~user
ขยายสำหรับผู้ใช้ที่อยู่ในฐานข้อมูลที่ไม่สามารถนับได้, รายการจะถูกเพิ่มเข้าไป$userdirs
) ดังนั้นคุณสามารถทำได้:
printf '%s => %s\n' "${(kv@)userdirs}"
เพื่อแสดงรายการผู้ใช้ด้วยโฮมไดเร็กตอรี่ของพวกเขา
ที่ทำงานเฉพาะเมื่อzsh
เป็น แต่แบบโต้ตอบ
tcsh
, fish
และyash
สามหอยอื่น ๆ ที่สามารถดำเนินการชื่อผู้ใช้ (เช่นเมื่อเสร็จสิ้น~<Tab>
การขัดแย้ง) แต่มันดูไม่เหมือนพวกเขาช่วยให้คุณได้รับรายชื่อของผู้ใช้ที่โปรแกรม