Saya ingin membuat skrip untuk memeriksa apakah ada pengguna. Saya menggunakan logika di bawah ini:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Jadi, jika pengguna ada, maka kami sukses, kalau tidak, pengguna tidak ada. Saya telah menempatkan perintah di atas dalam skrip bash seperti di bawah ini:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
Sekarang, skrip saya selalu mengatakan bahwa pengguna ada apa pun yang terjadi:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Mengapa kondisi di atas selalu dinilai BENAR dan mengatakan bahwa pengguna itu ada?
Di mana saya salah?
MEMPERBARUI:
Setelah membaca semua tanggapan, saya menemukan masalah dalam skrip saya. Masalahnya adalah cara saya mengarahkan getent
output. Jadi saya menghapus semua hal pengalihan dan membuat getent
garis terlihat seperti ini:
getent passwd $user > /dev/null
Sekarang skrip saya berfungsi dengan baik.
$?
Anda mendapatkan kode kembali daritest
perintah. Lihat jawaban di bawah ini.getent
danif
pernyataan Anda ? Itu akan menyebabkan$?
untuk memeriksa status keluarecho
, bukan panggilan Andagetent
.2>&1
bukan2&>1
.$1
tidak disetel, pernyataan if akan mengembalikan true. Dari pengujian saya, solusi akan membungkus$1
dalam tanda kutip ganda:getent passwd "$1" > /dev/null 2&>1
.Jawaban:
Anda juga dapat memeriksa pengguna dengan
id
perintah.id -u name
memberi Anda id dari pengguna itu. jika pengguna tidak ada, Anda mendapat nilai pengembalian perintah ($?
)1
sumber
validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }
. Itu, cukup banyak mengembalikan 1 jika pengguna ada, atau 0 jika tidak.Mengapa tidak Anda gunakan saja
Ini akan mengembalikan 1 (karena pengguna memiliki entri maksimal 1) jika pengguna ada dan 0 jika tidak.
sumber
getent passwd | grep -c '^username:'
:
setelah nama pengguna melindungi terhadap pencocokan substring dengan mencocokkan dengan pemisah bidang, sehingga efek yang Anda uraikan tidak akan terjadi.Tidak perlu memeriksa kode keluar secara eksplisit. Mencoba
Jika itu tidak berhasil, ada yang salah dengan Anda
getent
, atau Anda memiliki lebih banyak pengguna daripada yang Anda pikirkan.sumber
Inilah yang akhirnya saya lakukan dalam
Freeswitch
skrip startup bash:sumber
Saya menyarankan untuk menggunakan perintah id karena ia menguji keberadaan pengguna yang benar entri file passwd WRT yang tidak perlu berarti sama:
Catatan: 0 adalah root uid.
sumber
Saya menggunakannya dengan cara itu:
sumber
Sejauh ini solusi paling sederhana:
The
>/dev/null 2>&1
dapat dipersingkat untuk&>/dev/null
di Bash.sumber
Script untuk Memeriksa apakah pengguna Linux ada atau tidak
Script Untuk memeriksa apakah pengguna ada atau tidak
sumber
cat
?grep $USER_NAME /etc/passwd >/dev/null 2>&1
Terlambat menjawab tetapi
finger
juga menunjukkan lebih banyak informasi tentang penggunasumber
Sebenarnya saya tidak bisa mereproduksi masalah. Skrip seperti yang ditulis dalam pertanyaan berfungsi dengan baik, kecuali untuk kasus di mana $ 1 kosong.
Namun, ada masalah dalam skrip yang terkait dengan pengalihan
stderr
. Meskipun dua bentuk&>
dan>&
ada, dalam kasus Anda yang ingin Anda gunakan>&
. Anda sudah diarahkanstdout
, itu sebabnya formulir&>
tidak berfungsi. Anda dapat dengan mudah memverifikasinya dengan cara ini:Anda akan melihat file bernama
1
di direktori saat ini. Anda ingin menggunakan2>&1
sebagai gantinya, atau menggunakan ini:Ini juga mengalihkan
stdout
danstderr
ke/dev/null
.Peringatan Redirect
stderr
ke/dev/null
mungkin bukan ide yang bagus. Ketika ada masalah, Anda tidak akan tahu mengapa.sumber
informasi pengguna disimpan di / etc / passwd, sehingga Anda dapat menggunakan "grep 'usename' / etc / passwd" untuk memeriksa apakah nama pengguna ada. sementara itu Anda dapat menggunakan perintah shell "id", itu akan mencetak id pengguna dan id grup, jika pengguna tidak ada, itu akan mencetak pesan "no like user".
sumber
Login ke server. grep "nama pengguna" / etc / passwd Ini akan menampilkan detail pengguna jika ada.
sumber
if grep -q "^username:" /etc/passwd; then ...
Menggunakan sed:
sumber
Tergantung pada implementasi shell Anda (mis. Busybox vs dewasa)
[
operator mungkin memulai proses, berubah$?
.Mencoba
sumber
$?
memberi saya output yang sama. Ini adalah versi bash:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
if test "$RES" == "0"; then ...
$?
akan diperluas sebelum[
berjalan, jadi itu tidak masalah.if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
Di bawah ini adalah skrip untuk memeriksa distribusi OS dan membuat Pengguna jika tidak ada dan tidak melakukan apa pun jika pengguna ada.
sumber
Buat pengguna sistem
some_user
jika tidak adasumber
Saya suka solusi satu baris yang bagus ini
dan dalam skrip:
menggunakan:
sumber