जांचें कि क्या कोई उपयोगकर्ता मौजूद है


165

मैं यह जांचने के लिए एक स्क्रिप्ट बनाना चाहता हूं कि क्या कोई उपयोगकर्ता मौजूद है। मैं नीचे दिए गए तर्क का उपयोग कर रहा हूं:

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

इसलिए यदि उपयोगकर्ता मौजूद है, तो हमारे पास सफलता है, अन्यथा उपयोगकर्ता मौजूद नहीं है। मैंने नीचे के रूप में बाश स्क्रिप्ट में कमांड को ऊपर रखा है:

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

अब, मेरी स्क्रिप्ट हमेशा कहती है कि उपयोगकर्ता मौजूद नहीं है:

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

उपरोक्त स्थिति हमेशा TRUE होने का मूल्यांकन क्यों करती है और कहती है कि उपयोगकर्ता मौजूद है?

मुझसे कहां गलती हो रही है?

अपडेट करें:

सभी प्रतिक्रियाओं को पढ़ने के बाद, मुझे अपनी स्क्रिप्ट में समस्या मिली। समस्या यह थी कि मैं getentआउटपुट को रीडायरेक्ट कर रहा था । इसलिए मैंने सभी पुनर्निर्देशन सामग्री को हटा दिया और getentलाइन को इस तरह बनाया :

getent passwd $user  > /dev/null

अब मेरी स्क्रिप्ट ठीक काम कर रही है।


मुझे लगता है कि जब आप उपयोग $?करते हैं तो आपको testकमांड का रिटर्न कोड मिलता है । नीचे उत्तर देखें।
user000001

क्या आप जो सही कोड चला रहे हैं? कॉल getentऔर आपके ifस्टेटमेंट के बीच कोई "इको" डिबग स्टेटमेंट नहीं है ? यह आपके कॉल करने के लिए नहीं, $?के बाहर निकलने की स्थिति की जाँच करने का कारण होगा । echogetent
chepner

4
हाँ, मुझे लगता है कि आप के 2>&1बजाय इसका मतलब है 2&>1
टिम लुडविंस्की

कोड गैर-रिक्त इनपुट पर काम करता है, लेकिन यदि $1सेट नहीं किया गया है, तो यदि कथन सही है। मेरे परीक्षण से, समाधान रैप करने के लिए किया जाएगा $1दोहरे उद्धरण में: getent passwd "$1" > /dev/null 2&>1
विन्स

कृपया उत्तर दें
Efren

जवाबों:


292

आप उपयोगकर्ता को idकमांड द्वारा भी देख सकते हैं ।

id -u nameआपको उस उपयोगकर्ता की आईडी देता है। यदि उपयोगकर्ता मौजूद नहीं है, तो आपको कमांड रिटर्न वैल्यू मिली है ( $?)1


3
यही मैं उपयोग करता हूं। देखें superuser.com/questions/336275/find-out-if-user-name-exists
guettli

24
महान जवाब - बस एक छोटी सी ट्वीक कि अच्छी तरह से काम करता है ... user_exists = $ (आईडी -u उपयोगकर्ता> / dev / बातिल 2> & 1;? गूंज $) user_exists = 0 "उपयोगकर्ता" मौजूद है, या 1 यदि नहीं, तो
पान्चो

5
@Pancho मुझे लगता है कि आपके वैरिएबल का नाम user_doesnt_exist होना चाहिए
Sheppard

1
@WillSheppard: बैश में एक सामान्य स्तर पर बूलियन हैंडलिंग मेरे विचार में स्पष्ट से कम है और मैं आमतौर पर अपने कोड में निहित बूलियन इनफेक्शन से बचता हूं। निम्नलिखित रोचक पढ़ने और दिलचस्प रूप से दोनों पक्ष को 0 = सत्य और <नहीं 0> = झूठे उद्देश्यों के लिए गलत करते हैं, और वास्तविक नहीं होने के बावजूद, मैं बूलियन परिप्रेक्ष्य से उपयोग किए गए चर नाम के साथ संरेखित करता हूं: stackoverflow.com/a/5434332 / 3,051,627stackoverflow.com/questions/2933843/…
पंचो

2
@ पंचो की टिप्पणी की बदौलत मैं वह हासिल कर सका, जो केवल शून्य को त्रुटि देकर और कर रहा था validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }। यदि उपयोगकर्ता मौजूद है, या 0 नहीं है तो यह बहुत अधिक रिटर्न देता है।
lu1s

32

तुम बस का उपयोग क्यों नहीं करते

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

यदि उपयोगकर्ता मौजूद है और यह नहीं है तो यह 1 (उपयोगकर्ता के पास अधिकतम 1 प्रविष्टि है) वापस आ जाएगा।


19
यदि सर्वर NIS या LDAP जैसे उपयोग को प्रबंधित करने के लिए सर्वर का उपयोग कर रहा है तो यह काम नहीं करता है। इस मामले में, आप उपयोग कर सकते हैंgetent passwd | grep -c '^username:'
टोबी जैक्सन

1
यदि आपके पास उपयोगकर्ता नाम है तो यह 1 वापस आ जाएगा, मान लें कि "test1" और "परीक्षण" नामक एक नया उपयोगकर्ता नाम बनाना चाहते हैं।
मारिन नेडिया

2
@MarinNedea :उपयोक्ता के बाद उपनिवेशक को क्षेत्र विभाजक के साथ मिलान करके प्रतिस्थापित करने से बचाता है, इसलिए आपके द्वारा वर्णित प्रभाव नहीं होगा।
स्टीफन गौरीचॉन

30

स्पष्ट रूप से निकास कोड की जांच करने की कोई आवश्यकता नहीं है। प्रयत्न

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

यदि वह काम नहीं करता है, तो आपके साथ कुछ गड़बड़ है getent, या आपके पास आपके विचार से अधिक उपयोगकर्ता परिभाषित हैं।


23

यह वह है जो मैं एक Freeswitchस्टार्टअप स्टार्टअप स्क्रिप्ट में कर रहा था :

# 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

मैं आईडी कमांड का उपयोग करने का सुझाव देता हूं क्योंकि यह मान्य उपयोगकर्ता अस्तित्व wrt passwd फ़ाइल प्रविष्टि का परीक्षण करता है जो आवश्यक नहीं है इसका मतलब है:

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

नोट: 0 रूट यूआईडी है।


12

मैं इसे इस तरह से उपयोग कर रहा था:

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

9

अब तक का सबसे सरल उपाय:

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

>/dev/null 2>&1को छोटा किया जा सकता &>/dev/nullबैश में।


हाँ धन्यवाद!
ज़ेन हिचकॉक्स

7

लिनक्स उपयोगकर्ता मौजूद है या नहीं, यह जांचने के लिए स्क्रिप्ट

स्क्रिप्ट यह जाँचने के लिए कि उपयोगकर्ता मौजूद है या नहीं

#! /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
क्यों उपयोग करें cat? grep $USER_NAME /etc/passwd >/dev/null 2>&1
एलेक्सएक्स रोश

हाँ एलेक्स रॉश, बिल्ली का उपयोग करने की कोई आवश्यकता नहीं है, मेरे पास शुरुआत के लिए अवधारणा की कल्पना करने के लिए बेहतर तरीका है।
बकुल गुप्ता

6

देर से जवाब लेकिन fingerउपयोगकर्ता पर अधिक जानकारी भी दिखाता है

  sudo apt-get finger 
  finger "$username"

ओपी शायद डेबियन का उपयोग नहीं कर रहा है।
नरेंद्र-चौधरी

3

वास्तव में मैं समस्या को पुन: पेश नहीं कर सकता। प्रश्न में लिखी गई स्क्रिप्ट ठीक काम करती है, केवल उस मामले को छोड़कर जहां $ 1 खाली है।

हालाँकि, स्क्रिप्ट में समस्या पुनर्निर्देशन से संबंधित है stderr। यद्यपि दो रूप &>और >&मौजूद हैं, आपके मामले में आप उपयोग करना चाहते हैं >&। आपने पहले ही रीडायरेक्ट कर लिया है stdout, इसीलिए फॉर्म &>काम नहीं करता है। आप इसे इस तरह आसानी से सत्यापित कर सकते हैं:

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

आपको 1वर्तमान निर्देशिका में एक फ़ाइल दिखाई देगी । आप 2>&1इसके बजाय उपयोग करना चाहते हैं , या इसका उपयोग करना चाहते हैं :

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

यह भी पुनर्निर्देश stdoutऔर stderrकरने के लिए /dev/null

चेतावनी पुन: निर्देशित stderrकरने के लिए /dev/nullहो सकता है इस तरह के एक अच्छा विचार नहीं हो सकता है। जब चीजें गलत हो जाती हैं, तो आपके पास कोई सुराग नहीं होगा कि क्यों।


3

उपयोगकर्ता जानकारी / etc / passwd में संग्रहीत की जाती है, इसलिए आप "grep 'usename' / etc / passwd" का उपयोग करके देख सकते हैं कि उपयोगकर्ता नाम मौजूद है या नहीं। इस बीच आप "आईडी" शेल कमांड का उपयोग कर सकते हैं, यह यूजर आईडी और ग्रुप आईडी प्रिंट करेगा, यदि उपयोगकर्ता मौजूद नहीं है, तो यह "ऐसा कोई उपयोगकर्ता नहीं" संदेश प्रिंट करेगा।


2

सर्वर पर लॉगिन करें। grep "उपयोगकर्ता नाम" / etc / passwd यह मौजूद होने पर उपयोगकर्ता विवरण प्रदर्शित करेगा।


3
यह किसी भी उपयोगकर्ता नाम से मेल खाता है जिसमें "उपयोगकर्ता नाम" शामिल है। जैसे "some_username"। आप करना चाहते हैंif grep -q "^username:" /etc/passwd; then ...
maedox

2

Sed का उपयोग करना:

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

1

आपके शेल कार्यान्वयन (उदाहरण के लिए, बिजीबॉक्स बनाम बड़े हो गए) के आधार पर, [ऑपरेटर एक प्रक्रिया शुरू कर सकता है, बदल सकता है $?

प्रयत्न

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

बदलने $?से मुझे वही आउटपुट मिलता है। यह बैश संस्करण है:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
slayedbylucifer

कोशिश करेंif test "$RES" == "0"; then ...
यूजेन रीक

1
$?[रनों से पहले विस्तारित किया जाएगा , इसलिए यह कोई समस्या नहीं है।
चेन्नेर

1
कमांड के परिणाम के लिए परीक्षण के बजाय, आप सीधे कमांड का परीक्षण कर सकते हैं: 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

नीचे OS वितरण की जांच करने और उपयोगकर्ता बनाने के लिए स्क्रिप्ट मौजूद है और यदि मौजूद नहीं है तो कुछ भी नहीं करें।

#!/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_userयदि यह मौजूद नहीं है, तो सिस्टम उपयोगकर्ता बनाएँ

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

0

मुझे यह अच्छा एक लाइन समाधान पसंद है

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

और स्क्रिप्ट में:

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

उपयोग:

[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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.