ระบบหลายคนมี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>การขัดแย้ง) แต่มันดูไม่เหมือนพวกเขาช่วยให้คุณได้รับรายชื่อของผู้ใช้ที่โปรแกรม