ค้นหาว่ามีชื่อผู้ใช้อยู่หรือไม่


68

ฉันจะค้นหาคำสั่งในเชลล์สคริปต์ได้อย่างไรว่ามีชื่อผู้ใช้ที่ให้ไว้ในระบบปัจจุบันหรือไม่?


/etc/passwdและ/etc/shadowไม่สมบูรณ์ พิจารณาบริการไดเรกทอรีของ OS X หรือ Linux ด้วยการรวม Active Directory ในทำนองเดียวกัน

คำตอบ:


103

หนึ่งในเครื่องมือพื้นฐานที่สุดที่น่าidใช้

#!/bin/bash
if id "$1" >/dev/null 2>&1; then
        echo "user exists"
else
        echo "user does not exist"
fi

ซึ่งผลิตผล

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist

2
คุณไม่ต้องการ backquotes ที่นี่แค่ใช้if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson

1
@Gordon ถูกต้องแน่นอน ขอบคุณ :)
barbaz

"-u" ก็ไม่จำเป็นเช่นกัน
palacsint

ถ้าฉันต้องการifตัวตรวจสอบผลลัพธ์เชิงลบเท่านั้น
Yura Shinkarev

id -u $1 1>/dev/null 2>&1; echo $?สามารถใช้สำหรับท่อ
JasonWayne

20

getent

คำสั่งนี้ถูกออกแบบมาเพื่อรวบรวมรายการสำหรับฐานข้อมูลที่สามารถสำรองข้อมูลด้วยไฟล์ / etc และบริการระยะไกลต่างๆเช่น LDAP, AD, NIS / Yellow Pages, DNS และไลค์

หากต้องการทราบว่าชื่อผู้ใช้บริการการตั้งชื่อรหัสผ่านเป็นที่รู้จักหรือไม่ให้เรียกใช้:

getent passwd username

ใช้ได้กับกลุ่มโฮสต์และอื่น ๆ ขึ้นอยู่กับระบบปฏิบัติการและการใช้งาน


1
ในขณะที่ Solaris และ Linux และอื่น ๆ อีกมากมาย BSDs ส่วนใหญ่มีgetentแต่ไม่มีgetentใน Mac OS X
barbaz

อันที่จริงฉันพลาด Mac OS / X ไปแล้ว
jlliagre

อย่างไรก็ตามมันค่อนข้างมีประโยชน์ในระบบที่รองรับ
Daniel Beck

1
getent นั้นดีเพราะคุณสามารถสืบค้นชื่อผู้ใช้หลายคนที่ id สนับสนุนชื่อผู้ใช้เดียวเท่านั้น
Nall

6

finger

finger -m <username>แยกการส่งออกของ ไม่มีรหัสข้อผิดพลาดหากไม่พบผู้ใช้โชคไม่ดี แต่ถ้าไม่พบจะแสดงข้อผิดพลาดออก ไม่มีข้อเสีย

finger -ms <username> 2>&1 1>/dev/null | wc -l

จะพิมพ์0หากพบผู้ใช้ (เนื่องจากไม่มีข้อผิดพลาดที่ส่งออก) จำนวนที่มากขึ้นเป็นอย่างอื่น

chown

เรียกใช้ (ในฐานะผู้ใช้ใด ๆ อย่างน่าประหลาดใจ):

T=$( mktemp -t foo.XXX ) ; chown <username> $T

หากไม่เป็นเช่นrootนั้นชื่อบัญชีจะไม่ถูกต้อง

ถ้ามันล้มเหลวในฐานะที่ไม่ใช่rootผู้ใช้ให้แยกวิเคราะห์เอาต์พุตที่แปลเป็นภาษาท้องถิ่นสำหรับการดำเนินการที่ไม่ได้รับอนุญาตหรือผู้ใช้ที่ไม่ถูกต้อง (หรือเทียบเท่า) ตั้งLANGไว้ล่วงหน้าเพื่อทำสิ่งนี้อย่างน่าเชื่อถือ


0

ฉันจะบอกว่าคุณต้องการที่จะพึ่งพา/etc/passwdและคล้ายกัน (เช่น/etc/shadowสำหรับระบบที่ใช้ Shadow-based; ในหัวข้อด้านนอก, ระบบที่คล้ายกันบางระบบอาจใช้/etc/master.passwdหรือไฟล์อื่น ๆ )

โดย/etc/passwdทั่วไปถือว่าเป็นการตัดสินใจที่มีสิทธิ์อย่างเด็ดขาดว่าผู้ใช้จะมีอยู่หรือไม่ หากคุณใช้วิธีอื่นใดที่อธิบายไว้ในหน้านี้และหากวิธีการอื่นนั้นชี้ไปที่ผู้ใช้ปัจจุบัน แต่/etc/passwdไม่ทำเช่นนั้นฉันก็จะบอกว่าผู้ใช้ไม่ได้อยู่ในระบบอย่างถูกต้องตามคำจำกัดความของมาตรฐานทั่วไปที่ ซอฟต์แวร์น่าจะพึ่งพา

ที่กล่าวว่าฉันจะใช้วิธีอื่นเพื่อเพิ่มการผสมผสานของตัวเลือกอื่น ๆ ที่สามารถใช้ได้

ls -l /home | grep ^customUserName$<BR> echo $?

ชัดเจนแทนที่ "customuserName" ด้วยชื่อของผู้ใช้ที่คุณต้องการตรวจสอบ แทนที่ / home ด้วย / users ถ้านั่นคือสิ่งที่ระบบของคุณใช้ สิ่งนี้อาจไม่พบผู้ใช้ทั้งหมดใน / etc / passwd หากไม่มีโฮมไดเร็กตอรี่สำหรับผู้ใช้เฉพาะซึ่งอาจเกิดขึ้นหากคุณเพียงนำเข้าผู้ใช้ (นั่นคือบรรทัดข้อความลงใน / etc / passwd) และหากโฮมไดเร็กทอรีไม่ ทำจนกว่า / จนกว่าบุคคลจะเข้าสู่ระบบ


ฉันไม่เข้าใจสาเหตุที่คุณระบุผู้ใช้ที่ไม่มีรายการในไฟล์ / etc / password แต่มีการรายงานว่าถูกต้องด้วยidหรือgetentไม่ "ถูกต้อง" อยู่ในระบบโดยเฉพาะอย่างยิ่งเมื่อ OP ระบุบริการการตั้งชื่ออย่างชัดเจน ที่จะพิจารณา
jlliagre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.