ฉันจะค้นหาคำสั่งในเชลล์สคริปต์ได้อย่างไรว่ามีชื่อผู้ใช้ที่ให้ไว้ในระบบปัจจุบันหรือไม่?
/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
fingerfinger -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...