ব্যবহারকারীর অস্তিত্ব আছে কিনা তা পরীক্ষা করুন


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

উপরের শর্তটি কেন সর্বদা সত্য বলে মূল্যায়ন করে এবং বলে যে ব্যবহারকারীর উপস্থিতি রয়েছে?

কোথায় আমি ভুল যাচ্ছি?

হালনাগাদ:

সমস্ত প্রতিক্রিয়া পড়ার পরে, আমি আমার স্ক্রিপ্টে সমস্যাটি পেয়েছি। সমস্যাটি ছিল আমি getentআউটপুটটিকে পুনর্নির্দেশের পথে । সুতরাং আমি সমস্ত পুনঃনির্দেশের জিনিসগুলি সরিয়ে এনে getentলাইনটিকে দেখতে এমন দেখাচ্ছে:

getent passwd $user  > /dev/null

এখন আমার স্ক্রিপ্ট ভাল কাজ করছে।


আমি মনে করি আপনি ব্যবহার $?করার সময় testকমান্ডের রিটার্ন কোড পাবেন get নীচে উত্তর দেখুন।
ব্যবহারকারী000001

আপনি যে সঠিক কোডটি চালাচ্ছেন এটি কি? কল getentএবং আপনার ifবিবৃতিটির মধ্যে কোনও "প্রতিধ্বনি" ডিবাগ বিবৃতি নেই ? এটি আপনার কল নয়, $?এর প্রস্থান স্থিতি পরীক্ষা করতে echoপারে getent
চিপনার

4
হ্যাঁ আমি মনে করি আপনি এর 2>&1পরিবর্তে বোঝাতে চাইছেন 2&>1
টিম লুডউইনস্কি

কোডটি খালি খালি ইনপুটটিতে কাজ করে, তবে যদি $1সেট না করা থাকে তবে যদি বিবৃতিটি সত্য হয়ে যায়। আমার পরীক্ষাকার্যের থেকে, সমাধান মোড়ানো হবে $1উদ্ধৃতি চিহ্ন মধ্যে: getent passwd "$1" > /dev/null 2&>1
ভিন্স

দয়া করে একটি উত্তর চিহ্নিত করুন
এফ্রেন

উত্তর:


292

আপনি idকমান্ড দ্বারা ব্যবহারকারী পরীক্ষা করতে পারেন ।

id -u nameআপনাকে সেই ব্যবহারকারীর আইডি দেয়। যদি ব্যবহারকারীর অস্তিত্ব না থাকে, আপনি কমান্ড রিটার্ন মান পেয়েছেন ( $?)1


3
এটাই আমি ব্যবহার করি। দেখুন superuser.com/questions/336275/find-out-if-user-name-exists
guettli

24
মহান উত্তর - শুধু একটি ছোটখাট খামচি যে চমত্কারভাবে কাজ করে ... user_exists = $ (ID -u ব্যবহারকারী>, / dev / নাল 2> & 1;? প্রতিধ্বনি $) user_exists = 0 "ব্যবহারকারী" বিদ্যমান, বা 1 যদি না যদি
পাঞ্চোতে

5
@ পাঞ্চো আমি মনে করি আপনার পরিবর্তনশীলটির নাম ব্যবহারকারীর নামকরণ করা উচিত_ডিজেন্ট_এক্সজিস্ট
উইল শেপার্ড

1
@ উইলশেপার্ড: সাধারণ স্তরে বাশে বুলিয়ান হ্যান্ডলিং আমার মতে সাফের চেয়ে কম এবং আমি সাধারণত আমার কোডে অন্তর্নিহিত বুলিয়ান সূচনাগুলি এড়িয়ে চলি। নিম্নলিখিত আকর্ষণীয় পাঠ্য এবং আকর্ষণীয়ভাবে উভয় পক্ষকে 0 = সত্য এবং <নয় 0> = বাশ উদ্দেশ্য হিসাবে মিথ্যা, এবং ডি ফ্যাক্টো না করার পরে, আমি বুলিয়ান দৃষ্টিকোণ থেকে যে পরিবর্তনশীল নামটি ব্যবহার করেছি তার সাথেও সামঞ্জস্য করুন: stackoverflow.com/a/5431932 / 3051627stackoverflow.com/questions/2933843/…
পঞ্চো

2
ধন্যবাদ @ পাঞ্চোতে মন্তব্য আমি যে অর্জন করতে পারে, শুধু শূন্যতা ত্রুটির পাঠানো এবং করে validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }। এটি, ব্যবহারকারীর উপস্থিতি থেকে 1, অথবা যদি তা না থাকে তবে 0 টিরও অনেক বেশি প্রদান করে।
lu1 গুলি

32

আপনি কেবল ব্যবহার করবেন না কেন

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

এটি ব্যবহারকারীর উপস্থিতি থাকলে 1 টি (যেহেতু ব্যবহারকারীর সর্বাধিক 1 এন্ট্রি রয়েছে) এবং 0 না থাকলে এটি ফিরে আসবে।


19
সার্ভার যদি NIS বা LDAP এর মতো ব্যবহার পরিচালনা করতে অন্য সিস্টেম ব্যবহার করে তবে এটি কাজ করে না। এই ক্ষেত্রে, আপনি ব্যবহার করতে পারেনgetent passwd | grep -c '^username:'
টবি জ্যাকসন

1
আপনার 1 টি ব্যবহারকারীর নাম থাকলে এটি 1 টি ফিরে আসবে, আসুন "test1" বলুন এবং "পরীক্ষা" নামে একটি নতুন ব্যবহারকারীর নাম তৈরি করতে চান।
মারিন নেডিয়া

2
@ মেরিননেডিয়া কোলনটি :ফিল্ড বিভাজকের সাথে মিল রেখে স্ট্রিং ম্যাচিং থেকে রক্ষা করে, তাই আপনার বর্ণিত প্রভাবটি ঘটবে না।
স্টাফেন গ্যারিচন

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

আমি আইডি কমান্ডটি ব্যবহার করার পরামর্শ দিচ্ছি কারণ এটি বৈধ ব্যবহারকারীর অস্তিত্ব আর্ট পাসডওডি ফাইল এন্ট্রি পরীক্ষা করে যা প্রয়োজনীয় নয় একই অর্থ:

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
অ্যালেক্সেক্স রোচে 13

হ্যাঁ আলেক্সেক্স রোচে, বিড়াল ব্যবহার করার দরকার নেই, আমার কাছে শিক্ষার জন্য ধারণাটি কল্পনা করার আরও ভাল উপায় থাকতে পারে।
বকুল গুপ্ত


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

ব্যবহারকারীর তথ্যাদি / ইত্যাদি / পাসডাব্লুতে সংরক্ষিত থাকে, তাই আপনি ব্যবহারকারীর নাম উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে "গ্রেপ 'ইউজারনেম' / ইত্যাদি / পাসডাব্লু 'ব্যবহার করতে পারেন। ইতিমধ্যে আপনি "আইডি" শেল কমান্ডটি ব্যবহার করতে পারেন, এটি ব্যবহারকারীর আইডি এবং গোষ্ঠী আইডি প্রিন্ট করবে, যদি ব্যবহারকারী উপস্থিত না থাকে তবে এটি "এই জাতীয় কোনও ব্যবহারকারী" বার্তা মুদ্রণ করবে না।


2

সার্ভারে লগইন করুন। grep "ব্যবহারকারীর নাম" / ইত্যাদি / passwd এটি উপস্থিত থাকলে ব্যবহারকারীর বিবরণ প্রদর্শন করবে।


3
এটি "ব্যবহারকারীর নাম" থাকা যে কোনও ব্যবহারকারীর সাথেও মিলবে। যেমন "কিছু_ ব্যবহারকারী নাম"। আপনি করতে চাইবেনif grep -q "^username:" /etc/passwd; then ...
maedox

2

সেড ব্যবহার:

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)
স্লেয়ডব্লিউসিফার

চেষ্টা করুন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

ওএস বিতরণ যাচাই করতে এবং উপস্থিত না থাকলে ব্যবহারকারী তৈরি করতে এবং ব্যবহারকারী উপস্থিত থাকলে কিছুই না করার জন্য স্ক্রিপ্টের নীচে is

#!/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না থাকলে এটি তৈরি করুন Create

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.