Banyak sistem memiliki getent
perintah untuk daftar atau query isi Name Service database seperti passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Akan mencantumkan direktori home (bidang ke- 6 dengan batas kolon ke- 6 ) dari semua pengguna dalam basis data yang dapat disebutkan .
Nama pengguna itu sendiri ada di bidang pertama, jadi untuk daftar nama pengguna:
getent passwd | cut -d: -f1
(perhatikan bahwa itu tidak berarti para pengguna dapat login ke sistem atau direktori home mereka telah dibuat, tetapi mereka dikenal oleh sistem, mereka dapat diterjemahkan ke id pengguna).
Untuk basis data yang tidak dapat disebutkan, Anda dapat mencoba dan menanyakan setiap id pengguna yang memungkinkan secara individual:
getent passwd {0..65535} | cut -d: -f1,6
(disini anggaplah uids berhenti di 65535 (beberapa sistem mendukung lebih) dan sebuah shell yang mendukung {x..y}
bentuk ekspansi brace zsh ). Tetapi Anda tidak ingin sering melakukannya pada sistem di mana basis data pengguna jaringan (dan ada caching lokal terbatas) seperti LDAP, NIS +, SQL ... karena hal itu dapat menyiratkan banyak lalu lintas jaringan (dan memuat pada server direktori ) untuk membuat semua pertanyaan itu.
Itu juga berarti bahwa jika ada beberapa pengguna berbagi uid yang sama, Anda hanya akan mendapatkan satu entri untuk setiap uid, jadi lewatkan yang lain.
Jika tidak getent
, Anda dapat menggunakan perl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
untuk getent passwd
( $e[0]
untuk nama pengguna), atau:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
untuk getent passwd {0..65535}
dengan peringatan yang sama.
Dalam shell, Anda dapat menggunakan ~user
untuk mendapatkan direktori home user
, tetapi di sebagian besar shell, yang hanya berfungsi untuk sekumpulan nama pengguna yang terbatas (daftar karakter yang diizinkan dalam nama pengguna yang didukung untuk ~
operator ekspansi itu bervariasi dari shell ke shell) dan dengan beberapa shell (termasuk bash
), ~$user
tidak akan berfungsi (Anda harus menggunakan eval
ketika nama pengguna disimpan dalam variabel di sana). Dan Anda masih harus menemukan cara untuk mendapatkan daftar nama pengguna.
Beberapa shell memiliki dukungan bawaan untuk mendapatkan daftar nama pengguna itu.
bash
: compgen -u
akan mengembalikan daftar pengguna dalam basis data yang dapat disebutkan.
zsh
: $userdirs
array asosiatif memetakan nama pengguna ke direktori home mereka (juga terbatas pada basis data yang dapat disebutkan, tetapi jika Anda melakukan ~user
ekspansi untuk pengguna yang ada dalam basis data yang tidak dapat dihitung, entri akan ditambahkan ke $userdirs
). Jadi kamu bisa melakukan:
printf '%s => %s\n' "${(kv@)userdirs}"
untuk daftar pengguna dengan direktori home mereka.
Itu hanya berfungsi ketika zsh
bersifat interaktif sekalipun .
tcsh
, fish
dan yash
tiga shell lain yang dapat melengkapi nama pengguna (misalnya saat menyelesaikan ~<Tab>
argumen), tetapi sepertinya mereka tidak membiarkan Anda memperoleh daftar nama pengguna tersebut secara terprogram.