ฉันมีUSER
ตัวแปรในสคริปต์ของฉันและฉันต้องการดูHOME
เส้นทางของเขาตามUSER
ตัวแปร ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันมีUSER
ตัวแปรในสคริปต์ของฉันและฉันต้องการดูHOME
เส้นทางของเขาตามUSER
ตัวแปร ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
มียูทิลิตี้ที่จะค้นหาข้อมูลผู้ใช้โดยไม่คำนึงว่าข้อมูลนั้นถูกเก็บไว้ในไฟล์ในเครื่องเช่น/etc/passwd
หรือใน LDAP หรือวิธีการอื่น getent
มันเรียกว่า
getent passwd $USER
เพื่อให้ได้รับข้อมูลของผู้ใช้ออกจากมันที่คุณเรียก คุณจะได้รับบรรทัดย้อนกลับที่มีลักษณะดังนี้:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
ตอนนี้คุณสามารถตัดออก dir บ้านจากมันเช่นโดยใช้การตัดเช่น:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
bash
ไม่โดยตรง
~
ดูเหมือนจะแท็บขยายแม้ว่าและอีกพฤติกรรม spec'd ของหนอนคำนำหน้าจะถูกแทนที่ด้วยชื่อพา ธ ของไดเรกทอรีการทำงานเริ่มต้นเชื่อมโยงกับชื่อเข้าสู่ระบบที่ได้รับการใช้getpwnam()
ฟังก์ชั่นและอื่น ๆ อาจจะเป็นที่การค้นหาเป็นรักที่ดี ฉันไม่ชอบการขยายแท็บแม้ว่า - ฉันชอบที่จะพิมพ์แท็บ
คุณสามารถใช้eval
เพื่อรับไดเรกทอรีบ้านของใครบางคน
eval echo "~$USER"
อย่างน้อยสำหรับผู้ใช้ในท้องถิ่นสิ่งนี้ใช้ได้อย่างแน่นอน ฉันไม่ทราบว่าผู้ใช้ระยะไกลเช่น LDAP ได้รับการจัดการด้วยeval
หรือไม่
eval
จำเป็นต้องมี Bash ไม่ได้ดำเนินการ~foo
หลังจากการขยายตัวของตัวแปร
USER
ของคุณแทน
$USER
ขยายไปเพียงสายเดียวของตัวอักษร
สถานที่ปกติคือ/home/$USER
แต่ไม่จำเป็นต้องเป็นสากล /etc/passwd
สถานที่ที่ชัดเจนในการค้นหาข้อมูลดังกล่าวอยู่ภายในแฟ้ม
ไฟล์นั้นสามารถอ่านได้ทั่วโลก (ทุกคนสามารถอ่านได้) ดังนั้นผู้ใช้ทุกคนสามารถเข้าถึงเนื้อหาของมันได้
ถ้า $ USER มีอยู่ในไฟล์รายการก่อนหน้านี้ล่าสุดคือไดเร็กทอรี HOME ของผู้ใช้
สิ่งนี้จะเลือกรายการและพิมพ์ไดเรกทอรี HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
สำหรับระบบที่ซับซ้อน (ระยะไกล) มากขึ้น getent เป็นคำสั่งปกติเพื่อรับข้อมูลผู้ใช้จากระบบ NSS (ไลบรารีชื่อบริการสวิตช์)
คำสั่งของ
echo $(getent passwd $USER )| cut -d : -f 6
จะให้ข้อมูลที่เทียบเท่า (ถ้ามี)
หากไม่มีผู้ใช้getent
จะส่งคืนข้อผิดพลาด
นี่คือฟังก์ชั่นเชลล์ขนาดเล็กที่ไม่สนใจรหัสทางออกของgetent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
นี่คือตัวอย่างการใช้งาน:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
หากคุณเข้าสู่ระบบในฐานะรูทหากคุณรู้USER
รหัสผ่านหรือหากUSER
ไม่มีรหัสผ่านต่อไปนี้เป็นอีกตัวเลือกหนึ่ง:
su -c 'echo ~' ${USER}
ภายใต้su
พฤติกรรมมาตรฐานหากUSER
ไม่ได้กำหนดหรือว่างเปล่าจากนั้นsu
จะพยายามเรียกใช้คำสั่งในฐานะรูท
ถ้าค่าของการไม่ใช้ชื่อผู้ใช้ที่ถูกต้องแล้วเกิดข้อผิดพลาดที่เหมาะสมจะได้รับการเลี้ยงดู:USER
su: user <user> does not exist
มีคำตอบที่ดีมากมายอยู่ที่นี่แล้ว แต่นี่อาจช่วยคนอื่นได้