Cari tahu apakah nama pengguna ada

68

Bagaimana saya bisa mengetahui, dalam skrip shell, apakah nama pengguna yang diberikan ada pada sistem saat ini?


/etc/passwddan /etc/shadowtidak lengkap. Pertimbangkan Layanan Direktori OS X, atau Linux dengan integrasi Direktori Aktif yang Serupa.

Daniel Beck
sumber

Jawaban:

103

Salah satu alat paling dasar yang mungkin digunakan untuk itu id.

#!/bin/bash
if id "$1" >/dev/null 2>&1; then
        echo "user exists"
else
        echo "user does not exist"
fi

Yang menghasilkan

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist
Barbaz
sumber
2
Anda tidak perlu backquote di sini - cukup gunakan if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson
1
@ Gordon benar tentu saja. Terima kasih :)
barbaz
"-u" juga tampaknya tidak perlu
palacsint
Bagaimana jika saya hanya perlu ifdengan pemeriksa hasil negatif?
Yura Shinkarev
id -u $1 1>/dev/null 2>&1; echo $?dapat digunakan untuk pipa
JasonWayne
20

getent

Perintah ini dirancang untuk mengumpulkan entri untuk database yang dapat didukung oleh file / etc dan berbagai layanan jarak jauh seperti LDAP, AD, NIS / Yellow Pages, DNS dan sejenisnya.

Untuk mengetahui apakah nama pengguna diketahui oleh salah satu layanan penamaan kata sandi, jalankan saja:

getent passwd username

Ini juga berfungsi dengan grup, host, dan lainnya, tergantung pada OS dan implementasinya.

Jlliagre
sumber
1
Sementara Solaris dan Linux, dan baru-baru ini juga sebagian besar BSD miliki getent, tidak ada getentpada Mac OS X
barbaz
Memang, saya merindukan Mac OS / X hilang getent.
jlliagre
Namun demikian itu cukup berguna pada sistem yang didukungnya.
Daniel Beck
1
getent bagus karena Anda dapat meminta beberapa nama pengguna di mana id hanya mendukung satu nama pengguna.
nall
6

finger

Parsing output dari finger -m <username>. Sayangnya tidak ada kode kesalahan jika tidak ada pengguna yang ditemukan, tetapi jika tidak ditemukan, output kesalahan akan ditulis. Tidak ada kekurangan sejauh ini.

finger -ms <username> 2>&1 1>/dev/null | wc -l

Akan dicetak 0jika pengguna ditemukan (karena tidak ada output kesalahan), angka yang lebih besar sebaliknya.

chown

Jalankan (seperti halnya pengguna, secara mengejutkan):

T=$( mktemp -t foo.XXX ) ; chown <username> $T

Jika gagal root, nama akun tidak valid.

Jika gagal sebagai bukan rootpengguna, parsing output yang mungkin dilokalkan untuk Operasi tidak diizinkan atau tidak valid pengguna (atau setara). Tetapkan LANGsebelumnya untuk melakukan ini dengan andal.

Daniel Beck
sumber
0

Saya akan mengatakan bahwa Anda ingin mengandalkan /etc/passwddan serupa (misalnya /etc/shadowuntuk sistem berbasis Shadow; pada catatan-off-topik, beberapa sistem yang serupa mungkin menggunakan /etc/master.passwdatau file-file semacam itu).

The /etc/passwdbiasanya diperlakukan sebagai keputusan otoritatif mutlak pada apakah pengguna ada atau tidak. Jika Anda menggunakan salah satu metode lain yang dijelaskan pada halaman ini, dan jika metode lain menunjuk ke pengguna yang sudah ada tetapi /etc/passwdtidak, maka saya akan mengatakan bahwa pengguna tidak ada dengan benar pada sistem, dengan definisi standar paling umum yang perangkat lunak kemungkinan akan bergantung.

Yang mengatakan, saya akan melemparkan cara lain untuk menambah campuran beberapa opsi lain yang bisa digunakan.

ls -l /home | grep ^customUserName$<BR> echo $?

Jelas, ganti "customuserName" dengan nama pengguna yang ingin Anda periksa. Ganti / beranda dengan / pengguna jika itu yang digunakan sistem Anda. Ini mungkin tidak menemukan semua pengguna di / etc / passwd jika tidak ada direktori home yang dibuat untuk pengguna tertentu, yang dapat terjadi jika Anda hanya mengimpor pengguna (yaitu, baris teks ke / etc / passwd) dan jika direktori home tidak dibuat kecuali / sampai seseorang login.

TOOGAM
sumber
Saya tidak mengerti mengapa Anda menyatakan seorang pengguna yang tidak memiliki entri dalam file / etc / password tetapi dilaporkan valid idatau getenttidak "benar" ada pada sistem, terutama ketika OP secara jelas menyatakan layanan penamaan untuk dipertimbangkan.
jlliagre