Bagaimana saya bisa mendaftar semua pengguna manusia yang saya buat? Saya sudah mencoba cat /etc/passwd
dan hanya daftar banyak hal.
Bagaimana saya bisa mendaftar semua pengguna manusia yang saya buat? Saya sudah mencoba cat /etc/passwd
dan hanya daftar banyak hal.
Jawaban:
Pengguna manusia memiliki UID mulai dari 1000, sehingga Anda dapat menggunakan fakta itu untuk menyaring non-manusia:
cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4}$' | cut -d: -f1
Ini memotong bidang pertama yang dibatasi (nama pengguna) dan ketiga (UID) /etc/passwd
, kemudian menyaring untuk garis yang dihasilkan yang berakhir dengan titik dua dan empat digit, kemudian memotong bidang (nama pengguna) pertama dari itu, meninggalkan Anda dengan daftar pengguna dengan UID antara 1000 dan 9999.
Jika Anda memiliki lebih dari sembilan ribu pengguna di sistem Anda, ini akan gagal - tetapi Anda perlu membatasi hasilnya hanya untuk 4 digit UID agar tidak tertangkap nobody
(UID 65534).
Ini cukup banyak apa yang dilakukan jawaban yang diterima , hanya dalam satu perintah, bukan tiga:
awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
Dan terima kasih kepada Karel di komentar, nobody
pengguna juga disaring.
Saya pribadi suka menggunakan hanya:
ls /home
Memang ini bukan daftar pengguna tetapi daftar direktori home mereka. Saat ini pengguna manusia yang ada di sistem akan memiliki direktori home /home
, tetapi Anda dapat melihat direktori home dari pengguna sebelumnya yang juga dihapus.
Ini berfungsi untuk tujuan saya dan dapat bekerja untuk Anda juga. Misalnya, jika Anda ingin menghapus akun pengguna yang ternyata tidak ada lagi ( nonexistent-user
) dan jalankan perintah
sudo deluser nonexistent-user
itu hanya akan memberi tahu Anda bahwa pengguna ini tidak ada.
/home
(yang tidak terhubung ke /home
) daripada bahwa pengguna manusia akan memiliki UID di bawah 1000 (setelah semua, ini adalah metode yang paling umum untuk menjaga tampilan daftar manajer dari daftar pengguna pada layar login, yang kadang-kadang dapat dilakukan untuk pengguna manusia). Satu-satunya, kerugian yang relatif kecil di sini adalah yang lost+found
akan terdaftar pada sistem dengan /home
partisi terpisah .
useradd --no-create-home username
?
useradd --no-create-home
- direktori home mungkin sudah ada atau mungkin akan dibuat segera sesudahnya - tetapi ls /home
metode ini berfungsi dengan baik untuk case-case tersebut.
Sementara itu mungkin tampak seperti ide yang jelas, sebenarnya ada ambiguitas dalam arti pengguna manusia . Apakah akun pengguna sengaja disembunyikan dari layar masuk karena digunakan hanya untuk tujuan khusus (tetapi oleh manusia) pengguna manusia? Bagaimana dengan ubuntu
pengguna (UID 999) pada live CD? Dan akun tamu di Ubuntu dibuat dengan cepat dan dihancurkan setelah keluar; apakah mereka pengguna manusia? Lebih banyak contoh dapat dibuat.
Oleh karena itu, sudah sepantasnya bahwa beberapa jawaban yang tidak setara diberikan. Solusi Saige Hamblin untuk menjalankan ls /home
adalah apa yang sebenarnya dilakukan orang, dan kecuali Anda menulis skrip, Anda mungkin harus menggunakannya.
ls /home
Lebih KuatTetapi mungkin Anda memiliki pengguna yang telah dihapus, tetapi direktori home yang masih ada di /home
dalamnya, dan Anda harus menghindari daftar mereka. Atau mungkin karena alasan lain Anda harus memastikan hanya entri /home
yang terkait dengan akun nyata yang terdaftar.
Dalam hal ini, saya sarankan melewati nama-nama segala sesuatu dalam /home
untuk getent
(untuk mengambil passwd
entri dari pengguna dengan nama-nama itu), hanya kolom username kemudian isolat dan display (dengan grep
, sed
atau awk
, sesuai preferensi Anda). Salah satu dari ini akan dilakukan:
getent passwd $(ls /home) | grep -o '^[^:]*'
getent passwd $(ls /home) | sed 's/:.*//'
getent passwd $(ls /home) | awk -F: '{print $1}'
Ini harus bekerja dengan baik, karena Anda seharusnya tidak memiliki akun pengguna dengan spasi putih atau karakter kontrol dalam nama mereka; tidak bisa, tanpa mengkonfigurasi ulang Ubuntu untuk mengizinkannya ; dan jika Anda melakukannya, Anda memiliki masalah yang lebih besar. Jadi masalah yang biasa terjadi dengan penguraian ls
tidak dapat diterapkan. Tetapi meskipun itu benar-benar baik-baik saja di sini, jika Anda mempertimbangkan penggantian perintah dengan ls
estetika yang tidak menyenangkan atau hanya kebiasaan buruk, Anda dapat memilih:
getent passwd $(basename -a /home/*) | grep -o '^[^:]*'
getent passwd $(basename -a /home/*) | sed 's/:.*//'
getent passwd $(basename -a /home/*) | awk -F: '{print $1}'
Ini tidak mengakomodasi spasi atau karakter kontrol baik. Saya memberi mereka hanya karena $(ls /home)
terlihat salah bahkan ketika itu benar, dan dengan demikian menggosok banyak pengguna dengan cara yang salah. Dalam kebanyakan situasi, ada alasan nyata dan bagus untuk menghindari penguraianls
, dan dalam situasi itu penguraian basename -a
biasanya hanya sedikit lebih buruk. Namun, dalam situasi ini, karena keterbatasan pada karakter apa yang dapat terjadi secara praktis dalam nama pengguna , keduanya baik-baik saja.
Saya menggunakan getent
terutama karena ia menerima nama pengguna sebagai argumen untuk membatasi outputnya, tetapi juga karena itu sedikit lebih universal daripada memeriksa /etc/passwd
secara langsung, jika fasilitas otentikasi dan basis data kata sandi disediakan oleh layanan jaringan.
Metode ini memiliki manfaat tambahan di atas ls /home
itu, pada sistem dengan /home
partisi yang terpisah , lost+found
biasanya muncul di output ls /home
.
lost+found
hanya akan muncul jika kebetulan ada pengguna (manusia atau tidak) yang dipanggil lost+found
, yang tidak mungkin.ls /home
tidak apa-apa - Anda tahu Anda tidak memiliki pengguna manusia yang dipanggil lost+found
.Jarang, metode ini (dalam variasi di atas) akan menghasilkan keluaran yang tidak memuaskan:
/home
, atau tidak sama sekali, ini menunjukkan tetapi tidak menyiratkan akun tidak boleh dianggap mewakili pengguna manusia. Metode ini hanya mencantumkan pengguna ketika ada direktori dengan nama yang sama di /home
./home
yang sebenarnya bukan direktori home siapa pun, dan mereka kebetulan memiliki nama yang sama dengan pengguna non-manusia yang ada - atau terdiri dari kata-kata yang dipisahkan oleh spasi putih, satu atau lebih yang memiliki nama yang sama sebagai pengguna non-manusia yang ada - maka beberapa pengguna non-manusia dapat dimasukkan dalam output. getent
doa terpisah , sehingga pemisahan kata tidak menghasilkan output palsu. Tetapi kerumitannya tidak dijamin; pada dasarnya, jika Anda menggunakan /home
sesuatu selain tempat untuk direktori home pengguna, metode ini akan tidak menghasilkan output yang dapat diandalkan.)Jika Anda memutuskan untuk menggunakan metode yang memeriksa ID pengguna untuk memastikan mereka berada dalam kisaran kemungkinan akun yang mewakili manusia, seperti dalam jawaban yang diterima atau jawaban Oli , maka saya menyarankan ini untuk singkatnya:
getent passwd | grep -oP '^[^:]+(?=:x:\d{4}:)'
Ini menggunakan ekspresi reguler Perl ( -P
) untuk menunjukkan:
^
) yang mengandung no :
s ( [^:]+
) - ini adalah bidang pertama, seperti :
pemisah bidang dalampasswd
(?=
)
) bidang kata sandi x
- harus selalu demikian x
, karena di Ubuntu kata sandi disimpan di dalam shadow
basis data, bukan passwd
basis data yang dapat dibaca dunia:\d{4}:
).Dengan demikian, ini merupakan varian teknik yang secara signifikan lebih pendek dan lebih sederhana dalam jawaban yang diterima . (Teknik yang dijelaskan di sini juga berfungsi dengan baik, dan memang menguntungkan untuk portabel ke sistem non-GNU / Linux yang grep
tidak mendukung -P
.)
Jika Anda ingin mengakomodasi UID yang sangat tinggi dan memeriksa nobody
secara eksplisit, Anda dapat menggunakan metode dalam jawaban Oli . Anda mungkin ingin mempertimbangkan, bagaimanapun, jika pengguna dengan UID sangat tinggi harus benar-benar dianggap manusia, atau jika mereka lebih cenderung menjadi pengguna non-manusia dengan tujuan khusus lainnya (seperti nobody
). Dalam praktiknya, pengguna seperti itu - selain - nobody
jarang terjadi, jadi ini adalah penilaian Anda.
Kemungkinan kompromi adalah untuk membuat daftar pengguna dalam kisaran UID yang benar-benar ditugaskan untuk pengguna yang baru dibuat, bukan "sistem". Anda dapat memeriksa ini diadduser.conf
:
$ grep -E '^(FIRST|LAST)_UID' /etc/adduser.conf
FIRST_UID=1000
LAST_UID=29999
Berikut adalah dua cara untuk membuat daftar pengguna yang kisaran UID-nya dari 1000 hingga 29999:
getent passwd | grep -oP '^[^:]+(?=:x:[12]?\d{4}:)'
getent passwd | awk -F: '999<$3 && $3<30000 {print $1}'
basename
itu jelek. Tidak lebih baik dari itu ls
. Alasan utama kita tidak menguraikan adalah bahwa itu adalah pekerjaan yang dapat dilakukan oleh alat lain jauh lebih aman dan bersih, bukan gaya. Dalam hal ini, shell: cd /home; getent passwd *
.
ls
biasanya tentang gaya. Poin kedua tentang "output yang tidak memuaskan" mencakup masalah ini, tetapi muncul di bagian selanjutnya. Saya telah menulis ulang untuk mengklarifikasi mengapa parsing ls
sesuai dalam situasi ini . Meskipun cd /home; getent passwd *
mengambil bentuk yang sering menunjukkan pendekatan yang lebih baik, saya telah menghindarinya agar tidak membuat pembaca percaya pada isi /home
direktori, dengan entri tambahan aneh yang tidak sesuai dengan pengguna nyata, entah bagaimana masih bisa diandalkan sebagai panduan untuk apa pengguna ada.
TL; DR : hanya pengguna manusia yang memiliki SystemAccount = false
Salah satu cara lain adalah dengan mendaftar keluaran sementara mengabaikan root ls /var/lib/AccountsService/users/ | grep -v root
. Sekarang, ada quirk - gdm, layar penyapa / login (atau lebih desktop manager) juga terdaftar sebagai pengguna. Jadi dari daftar kami tidak tahu apakah gdm itu manusia atau bukan.
Pendekatan yang lebih efisien dan benar adalah memeriksa file-file di folder itu dan mencari tahu pengguna mana yang terdaftar SystemAccount=false
. Satu garis di bawah mencapai itu
grep SystemAccount=false /var/lib/AccountsService/users/* | awk -F '/' '{gsub(":","/");print $6}'
mini.iso
dan tanpa manajer tampilan atau X11 diinstal), saya memiliki satu akun pengguna manusia - namun /var/lib/AccountsService/users
merupakan direktori kosong. Saya berharap ini juga tidak akan bekerja pada instalasi Ubuntu Server out-of-the-box. Lebih jauh lagi, ketika ini berhasil, ia melakukannya di bawah gagasan yang agak membatasi tentang apa yang membuat akun pengguna "manusia": membuat pengguna dengan useradd
, bahkan tanpa --system
, tidak membuat file AccountsService/users
.
Bergabung dengan partai, saya mengawasi sistem jaringan menggunakan LDAP, memiliki direktori home di luar /home
dan UID (karena kesalahan scripting) dalam jutaan. Karena itu, tidak ada jawaban saat ini yang berfungsi. Tes yang berfungsi untuk saya adalah memeriksa apakah pengguna memiliki shell login yang valid. Shell yang valid adalah yang terdaftar di /etc/shells
. Bentuk paling sederhana:
getent passwd | grep -wFf /etc/shells
File mungkin berisi komentar (atau baris kosong), jadi orang mungkin harus memfilternya:
getent passwd | grep -wFf <(grep '^/' /etc/shells)
root
(yang mungkin seharusnya tidak dianggap sebagai pengguna manusia, karena manusia biasanya menjadi root untuk sementara dan untuk tujuan tertentu, daripada menggunakannya untuk pekerjaan rutin mereka), sepertinya itu adalah yang paling tidak mungkin gagal dalam cara utama. Metode dalam jawaban lain (termasuk tambang) mungkin gagal, tergantung pada metode, jika direktori rumah tidak ada /home
, sampah lain ada di dalam /home
, UID aneh, atau sistem tidak menggunakan DM. Jawaban ini berfungsi dengan baik di semua skenario itu.
Pada sistem buntu, pengguna biasa (pengguna manusia, yaitu) memiliki UID yang dimulai dengan 1000 yang ditugaskan secara berurutan kepada mereka ketika akun mereka pertama kali dibuat. Intinya semua ini adalah bahwa akun pertama yang dibuat pada sistem buntu memiliki UID 1000. Yang berikutnya dibuat memiliki UID 1001. Dan seterusnya dan seterusnya.
Jadi, cara paling sederhana untuk mendaftar semua akun pengguna manusia yang ada di sistem, menurut saya, adalah memeriksa apakah kolom ketiga dalam /etc/passwd
file yang berisi UID pengguna lebih besar atau sama dengan 1000 dan kurang dari, katakanlah, 2000 (Sangat tidak mungkin PC desktop biasa memiliki lebih dari seribu akun pengguna, bukan begitu?):
$ awk -F$':' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd
nobody
. =)