Periksa Apakah Pengguna Ada

164

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 getentoutput. Jadi saya menghapus semua hal pengalihan dan membuat getentgaris terlihat seperti ini:

getent passwd $user  > /dev/null

Sekarang skrip saya berfungsi dengan baik.

dibunuh oleh lucifer
sumber
Saya pikir ketika Anda menggunakan $?Anda mendapatkan kode kembali dari testperintah. Lihat jawaban di bawah ini.
user000001
Apakah itu kode persis yang Anda jalankan? Tidak ada pernyataan debug "gema" antara panggilan ke getentdan ifpernyataan Anda ? Itu akan menyebabkan $?untuk memeriksa status keluar echo, bukan panggilan Anda getent.
chepner
4
Ya saya pikir Anda maksudkan 2>&1bukan 2&>1.
Tim Ludwinski
Kode berfungsi pada input yang tidak kosong, tetapi jika $1tidak disetel, pernyataan if akan mengembalikan true. Dari pengujian saya, solusi akan membungkus $1dalam tanda kutip ganda: getent passwd "$1" > /dev/null 2&>1.
Vince
Harap tandai jawaban
Efren

Jawaban:

292

Anda juga dapat memeriksa pengguna dengan idperintah.

id -u namememberi Anda id dari pengguna itu. jika pengguna tidak ada, Anda mendapat nilai pengembalian perintah ( $?)1

Kent
sumber
3
Itu yang saya gunakan. Lihat superuser.com/questions/336275/find-out-if-user-name-exists
guettli
24
jawaban yang bagus - hanya sedikit perubahan yang berfungsi dengan baik ... user_exists = $ (id -u user> / dev / null 2> & 1; echo $?) user_exists = 0 jika "pengguna" ada, atau 1 jika tidak
Pancho
5
@Pancho Saya pikir variabel Anda harus dinamai user_doesnt_exist
Will Sheppard
1
@ WillSheppard: Pada tingkat umum penanganan boolean di bash menurut saya kurang jelas dan saya biasanya menghindari kesimpulan boolean implisit dalam kode saya. Berikut ini membuat bacaan yang menarik dan menarik keduanya mendukung 0 = benar dan <bukan 0> = salah untuk tujuan bash, dan meskipun tidak secara de facto, selaraskan dengan nama variabel yang saya gunakan dari perspektif boolean juga: stackoverflow.com/a/5431932 / 3051627 . stackoverflow.com/questions/2933843/… .
Pancho
2
Berkat komentar @ Pancho saya bisa mencapai itu, hanya dengan mengirim kesalahan ke kekosongan dan melakukan validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }. Itu, cukup banyak mengembalikan 1 jika pengguna ada, atau 0 jika tidak.
Agustus
31

Mengapa tidak Anda gunakan saja

grep -c '^username:' /etc/passwd

Ini akan mengembalikan 1 (karena pengguna memiliki entri maksimal 1) jika pengguna ada dan 0 jika tidak.

poitroae
sumber
19
Ini tidak berfungsi jika server menggunakan sistem lain untuk mengelola penggunaan seperti NIS atau LDAP. Dalam hal ini, Anda dapat menggunakangetent passwd | grep -c '^username:'
Toby Jackson
1
ini akan mengembalikan 1 jika Anda memiliki nama pengguna, katakanlah "test1" dan ingin membuat nama pengguna baru yang disebut "test".
Marin Nedea
2
@MarinNedea titik dua :setelah nama pengguna melindungi terhadap pencocokan substring dengan mencocokkan dengan pemisah bidang, sehingga efek yang Anda uraikan tidak akan terjadi.
Stéphane Gourichon
30

Tidak perlu memeriksa kode keluar secara eksplisit. Mencoba

if getent passwd $1 > /dev/null 2>&1; then
    echo "yes the user exists"
else
    echo "No, the user does not exist"
fi

Jika itu tidak berhasil, ada yang salah dengan Anda getent, atau Anda memiliki lebih banyak pengguna daripada yang Anda pikirkan.

chepner
sumber
23

Inilah yang akhirnya saya lakukan dalam Freeswitchskrip startup bash:

# Check if user exists
if ! id -u $FS_USER > /dev/null 2>&1; then
    echo "The user does not exist; execute below commands to crate and try again:"
    echo "  root@sh1:~# adduser --home /usr/local/freeswitch/ --shell /bin/false --no-create-home --ingroup daemon --disabled-password --disabled-login $FS_USER"
    echo "  ..."
    echo "  root@sh1:~# chown freeswitch:daemon /usr/local/freeswitch/ -R"
    exit 1
fi
Daniel Sokolowski
sumber
14

Saya menyarankan untuk menggunakan perintah id karena ia menguji keberadaan pengguna yang benar entri file passwd WRT yang tidak perlu berarti sama:

if [ `id -u $USER_TO_CHECK 2>/dev/null || echo -1` -ge 0 ]; then 
echo FOUND
fi

Catatan: 0 adalah root uid.

Valdas Rapševičius
sumber
12

Saya menggunakannya dengan cara itu:

if [ $(getent passwd $user) ] ; then
        echo user $user exists
else
        echo user $user doesn\'t exists
fi
Takeda
sumber
9

Sejauh ini solusi paling sederhana:

if id -u user >/dev/null 2>&1; then
    echo user exists
else
    echo user missing
fi

The >/dev/null 2>&1dapat dipersingkat untuk &>/dev/nulldi Bash.

Fleshgrinder
sumber
Ya terima kasih!
Zane Hitchcox
7

Script untuk Memeriksa apakah pengguna Linux ada atau tidak

Script Untuk memeriksa apakah pengguna ada atau tidak

#! /bin/bash
USER_NAME=bakul
cat /etc/passwd | grep ${USER_NAME} >/dev/null 2>&1
if [ $? -eq 0 ] ; then
    echo "User Exists"
else
    echo "User Not Found"
fi
Bakul Gupta
sumber
2
Mengapa menggunakan cat? grep $USER_NAME /etc/passwd >/dev/null 2>&1
Alexx Roche
Ya Alexx Roche, tidak perlu menggunakan cat, saya harus menggunakan agar ada cara yang lebih baik untuk memvisualisasikan konsep untuk pemula.
Bakul Gupta
6

Terlambat menjawab tetapi fingerjuga menunjukkan lebih banyak informasi tentang pengguna

  sudo apt-get finger 
  finger "$username"
jackotonye
sumber
OP mungkin tidak menggunakan Debian.
narendra-choudhary
3

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 diarahkan stdout, itu sebabnya formulir &>tidak berfungsi. Anda dapat dengan mudah memverifikasinya dengan cara ini:

getent /etc/passwd username >/dev/null 2&>1
ls

Anda akan melihat file bernama 1di direktori saat ini. Anda ingin menggunakan 2>&1sebagai gantinya, atau menggunakan ini:

getent /etc/passwd username &>/dev/null

Ini juga mengalihkan stdoutdan stderrke /dev/null.

Peringatan Redirect stderrke /dev/nullmungkin bukan ide yang bagus. Ketika ada masalah, Anda tidak akan tahu mengapa.

Christian Hujer
sumber
3

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".

Yu Chai
sumber
2

Login ke server. grep "nama pengguna" / etc / passwd Ini akan menampilkan detail pengguna jika ada.

syam
sumber
3
Ini juga akan cocok dengan nama pengguna apa pun yang berisi "nama pengguna". Misalnya "some_username". Anda ingin melakukannyaif grep -q "^username:" /etc/passwd; then ...
maedox
2

Menggunakan sed:

username="alice"
if [ `sed -n "/^$username/p" /etc/passwd` ]
then
    echo "User [$username] already exists"
else
    echo "User [$username] doesn't exist"
fi
Steve
sumber
1

Tergantung pada implementasi shell Anda (mis. Busybox vs dewasa) [operator mungkin memulai proses, berubah$? .

Mencoba

getent passwd $1 > /dev/null 2&>1
RES=$?

if [ $RES -eq 0 ]; then
    echo "yes the user exists"
else
    echo "No, the user does not exist"
fi
Eugen Rieck
sumber
mengubah $?memberi saya output yang sama. Ini adalah versi bash:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
slayedbylucifer
Cobaif test "$RES" == "0"; then ...
Eugen Rieck
1
$?akan diperluas sebelum [berjalan, jadi itu tidak masalah.
chepner
1
Alih-alih menguji hasil perintah, Anda dapat menguji perintah secara langsung: if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
GMartinez
1

Di bawah ini adalah skrip untuk memeriksa distribusi OS dan membuat Pengguna jika tidak ada dan tidak melakukan apa pun jika pengguna ada.

#!/bin/bash

# Detecting OS Ditribution
if [ -f /etc/os-release ]; then
    . /etc/os-release
    OS=$NAME
elif type lsb_release >/dev/null 2>&1; then
OS=$(lsb_release -si)
elif [ -f /etc/lsb-release ]; then
    . /etc/lsb-release
    OS=$DISTRIB_ID
else
    OS=$(uname -s)
fi

 echo "$OS"

 user=$(cat /etc/passwd | egrep -e ansible | awk -F ":" '{ print $1}')

 #Adding User based on The OS Distribution
 if [[ $OS = *"Red Hat"* ]] || [[ $OS = *"Amazon Linux"* ]] || [[ $OS = *"CentOS"*  
]] && [[ "$user" != "ansible" ]];then
 sudo useradd ansible

elif [ "$OS" =  Ubuntu ] && [ "$user" != "ansible" ]; then
sudo adduser --disabled-password --gecos "" ansible
else
  echo "$user is already exist on $OS"
 exit
fi
Santosh Garole
sumber
0

Buat pengguna sistem some_userjika tidak ada

if [[ $(getent passwd some_user) = "" ]]; then
    sudo adduser --no-create-home --force-badname --disabled-login --disabled-password --system some_user
fi
luchaninov
sumber
0

Saya suka solusi satu baris yang bagus ini

getent passwd username > /dev/null 2&>1 && echo yes || echo no

dan dalam skrip:

#!/bin/bash

if [ "$1" != "" ]; then
        getent passwd $1 > /dev/null 2&>1 && (echo yes; exit 0) || (echo no; exit 2)
else
        echo "missing username"
        exit -1
fi

menggunakan:

[mrfish@yoda ~]$ ./u_exists.sh root
yes
[mrfish@yoda ~]$ echo $?
0

[mrfish@yoda ~]$ ./u_exists.sh
missing username
[mrfish@yoda ~]$ echo $?
255

[mrfish@yoda ~]$ ./u_exists.sh aaa
no
[mrfish@indegy ~]$ echo $?
2
nir vizel
sumber