ฉันจะค้นหาคำสั่งในเชลล์สคริปต์ได้อย่างไรว่ามีชื่อผู้ใช้ที่ให้ไว้ในระบบปัจจุบันหรือไม่?
/etc/passwd
และ/etc/shadow
ไม่สมบูรณ์ พิจารณาบริการไดเรกทอรีของ OS X หรือ Linux ด้วยการรวม Active Directory ในทำนองเดียวกัน
ฉันจะค้นหาคำสั่งในเชลล์สคริปต์ได้อย่างไรว่ามีชื่อผู้ใช้ที่ให้ไว้ในระบบปัจจุบันหรือไม่?
/etc/passwd
และ/etc/shadow
ไม่สมบูรณ์ พิจารณาบริการไดเรกทอรีของ OS X หรือ Linux ด้วยการรวม Active Directory ในทำนองเดียวกัน
คำตอบ:
หนึ่งในเครื่องมือพื้นฐานที่สุดที่น่า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
if
ตัวตรวจสอบผลลัพธ์เชิงลบเท่านั้น
id -u $1 1>/dev/null 2>&1; echo $?
สามารถใช้สำหรับท่อ
getent
คำสั่งนี้ถูกออกแบบมาเพื่อรวบรวมรายการสำหรับฐานข้อมูลที่สามารถสำรองข้อมูลด้วยไฟล์ / etc และบริการระยะไกลต่างๆเช่น LDAP, AD, NIS / Yellow Pages, DNS และไลค์
หากต้องการทราบว่าชื่อผู้ใช้บริการการตั้งชื่อรหัสผ่านเป็นที่รู้จักหรือไม่ให้เรียกใช้:
getent passwd username
ใช้ได้กับกลุ่มโฮสต์และอื่น ๆ ขึ้นอยู่กับระบบปฏิบัติการและการใช้งาน
getent
แต่ไม่มีgetent
ใน Mac OS X
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
ไว้ล่วงหน้าเพื่อทำสิ่งนี้อย่างน่าเชื่อถือ
ฉันจะบอกว่าคุณต้องการที่จะพึ่งพา/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) และหากโฮมไดเร็กทอรีไม่ ทำจนกว่า / จนกว่าบุคคลจะเข้าสู่ระบบ
id
หรือgetent
ไม่ "ถูกต้อง" อยู่ในระบบโดยเฉพาะอย่างยิ่งเมื่อ OP ระบุบริการการตั้งชื่ออย่างชัดเจน ที่จะพิจารณา
if id -u "$1" >/dev/null 2>&1; then
...