Kullanıcının Var olup olmadığını Kontrol Edin


165

Bir kullanıcının var olup olmadığını kontrol etmek için bir komut dosyası oluşturmak istiyorum. Aşağıdaki mantığı kullanıyorum:

# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2

Eğer kullanıcı varsa, o zaman başarımız olur, aksi takdirde kullanıcı yoktur. Ben bash komut dosyasında yukarıdaki komutu aşağıdaki gibi koydum:

#!/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

Şimdi, betiğim her zaman kullanıcının ne olursa olsun var olduğunu söylüyor:

# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists

Yukarıdaki koşul neden daima DOĞRU olarak değerlendirilir ve kullanıcının var olduğunu söyler?

Nerede yanlış gidiyorum?

GÜNCELLEME:

Tüm yanıtları okuduktan sonra, senaryomda sorunu buldum. Sorun getentçıktıyı yeniden yönlendirme şeklimdi. Bu yüzden tüm yeniden yönlendirme öğelerini kaldırdım ve getentsatırı şu şekilde yaptım :

getent passwd $user  > /dev/null

Şimdi senaryom iyi çalışıyor.


Bence kullandığınızda komutun $?dönüş kodunu alırsınız test. Aşağıdaki cevaba bakınız.
user000001

Çalıştırdığınız kod tam olarak bu mu? Çağrısı arasında Hayır "yankı" ayıklama ifadeleri getentve ifbeyanı? Bu , çağrınızın değil $?, çıkış durumunun kontrol edilmesine neden olur . echogetent
chepner

4
Evet, 2>&1bunun yerine demek istediğini düşünüyorum 2&>1.
Tim Ludwinski

Kod boş olmayan girdide çalışır, ancak $1ayarlanmazsa, if ifadesi true değerini döndürür. Benim test itibaren, çözüm sarmak olacaktır $1çift tırnak: getent passwd "$1" > /dev/null 2&>1.
Vince

Lütfen bir cevap işaretleyin
Efren

Yanıtlar:


292

kullanıcıyı idkomutla da kontrol edebilirsiniz .

id -u namesize bu kullanıcının kimliğini verir. kullanıcı yoksa, komut dönüş değeri ( $?) elde edersiniz1



24
harika cevap - güzel çalışan küçük bir değişiklik ... user_exists = $ (id -u kullanıcı> / dev / null 2> & 1; echo $?) user_exists = 0 "kullanıcı" varsa 0 veya yoksa 1
Pancho

5
@Pancho Değişkeninizin user_doesnt_exist olarak adlandırılması gerektiğini düşünüyorum
Will Sheppard

1
@WillSheppard: Genel düzeyde bash'taki boole işleme, benim görüşüme göre daha az net ve tipik olarak kodumda örtük boolean çıkarımlardan kaçınırım. Aşağıdakiler ilginç bir okuma yapar ve ilginç bir şekilde hem bash amaçları için 0 = true ve <not 0> = false 'dır ve de facto olmasa da, boole bakış açısıyla da kullandığım değişken adıyla hizalayın: stackoverflow.com/a/5431932 / 3051627 . stackoverflow.com/questions/2933843/… .
Pancho

2
@ Pancho'nun yorumu sayesinde bunu sadece boşluğa hata göndererek ve yaparak başarabilirim validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }. Bu, kullanıcı varsa hemen hemen 1, yoksa 0 değerini döndürür.
lu1s

32

Neden sadece kullanmıyorsun

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

Kullanıcı varsa 1 (bir kullanıcı en fazla 1 girişe sahip olduğu için) ve yoksa 0 döndürür.


19
Sunucu, NIS veya LDAP gibi kullanımları yönetmek için başka bir sistem kullanıyorsa bu çalışmaz. Bu durumda, kullanabilirsinizgetent passwd | grep -c '^username:'
Toby Jackson

1
kullanıcı adınız varsa 1 döndürür, diyelim "test1" diyelim ve "test" adında yeni bir kullanıcı adı oluşturmak istiyorsunuz.
Marin Nedea

2
@MarinNedea :kullanıcı adından sonra iki nokta üst üste , alan ayırıcısıyla eşleştirerek alt dize eşleşmesine karşı korur, bu nedenle açıkladığınız etki gerçekleşmez.
Stéphane Gourichon

30

Çıkış kodunu açıkça kontrol etmeye gerek yoktur. Deneyin

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

Bu işe yaramazsa, cihazınızda bir sorun var getentveya düşündüğünüzden daha fazla kullanıcı tanımlı.


23

Ben bir Freeswitchbash başlangıç ​​komut dosyasında yaptığım budur :

# 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

14

Geçerli olmayan kullanıcı varlığı wrt passwd dosya girişini sınamak için id komutunu kullanmanızı öneririm ki bu gerekli değildir:

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

Not: 0 kök kullanıcı kimliğidir.


12

Ben bu şekilde kullanıyordum:

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

9

Şimdiye kadar en basit çözüm:

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

>/dev/null 2>&1İçin kısaltılabilir &>/dev/nullBash.


Evet teşekkür ederim!
Zane Hitchcox

7

Linux kullanıcısının var olup olmadığını kontrol etmek için komut dosyası

Komut Dosyası Kullanıcının var olup olmadığını kontrol etmek için

#! /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

2
Neden kullanılmalı cat? grep $USER_NAME /etc/passwd >/dev/null 2>&1
Alexx Roche

Evet Alexx Roche, kedi kullanmaya gerek yok, yeni başlayanlar için konsepti görselleştirmenin daha iyi bir yoluna sahip olmak için kullanıyorum.
Bakul Gupta

6

Geç cevap, aynı fingerzamanda kullanıcı hakkında daha fazla bilgi gösterir

  sudo apt-get finger 
  finger "$username"

OP Debian kullanmıyor olabilir.
narendra-choudhary

3

Aslında problemi tekrarlayamıyorum. Soruda yazılan komut dosyası, $ 1'in boş olduğu durumlar dışında iyi çalışıyor.

Ancak, komut dosyasında yönlendirme ile ilgili bir sorun var stderr. İki form &>ve >&var olmasına rağmen, sizin durumunuzda kullanmak istiyorsunuz >&. Zaten yönlendirdiniz stdout, bu yüzden form &>çalışmıyor. Bu şekilde kolayca doğrulayabilirsiniz:

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

1Geçerli dizinde bir dosya göreceksiniz . Bunun 2>&1yerine veya şunu kullanmak istiyorsunuz :

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

Bu aynı zamanda yönlendirmeleri stdoutve stderriçin /dev/null.

Uyarıstderr adresine yönlendirmek /dev/nulliyi bir fikir olmayabilir. İşler ters gittiğinde, neden olduğuna dair hiçbir fikriniz olmayacak.


3

kullanıcı bilgileri / etc / passwd içinde saklanır, böylece kullanıcı adının mevcut olup olmadığını kontrol etmek için "grep 'kullanıcı adı' / etc / passwd" kullanabilirsiniz. bu arada "id" kabuk komutunu kullanabilirsiniz, kullanıcı kimliği ve grup kimliği yazdıracak, eğer kullanıcı yoksa, "böyle bir kullanıcı yok" mesajı yazdıracaktır.


2

Sunucuya giriş yapın. grep "kullanıcı adı" / etc / passwd Varsa kullanıcı ayrıntılarını görüntüler.


3
Bu, "kullanıcı adı" içeren tüm kullanıcı adlarıyla da eşleşir. Örneğin "bazı_kullaniciadi". Yapmak isterdinizif grep -q "^username:" /etc/passwd; then ...
maedox

2

Sed kullanma:

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

1

Kabuk uygulamanıza bağlı olarak (örneğin, Meşgul Kutusu veya yetişkin yetiştirme gibi) [operatör bir işlemi değiştirerek başlayabilir $?.

Deneyin

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

değiştirmek $?bana aynı çıktıyı verir. Bu bash sürümüdür:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
slayedbylucifer

Deneyinif test "$RES" == "0"; then ...
Eugen Rieck

1
$?[çalıştırmadan önce genişletilebilir , bu yüzden bu bir sorun değil.
chepner

1
Komutun sonucunu test etmek yerine, komutu doğrudan test edebilirsiniz: 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

İşletim sistemi dağıtımını kontrol etmek ve yoksa Kullanıcı oluşturmak ve kullanıcı varsa hiçbir şey yapmak için komut dosyası aşağıdadır.

#!/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

0

some_userMevcut değilse sistem kullanıcısı oluşturun

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

0

Bu güzel tek satırlı çözümü beğendim

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

ve senaryoda:

#!/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

kullanın:

[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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.