วิธีรับ HOME ให้ USER


41

ฉันมีUSERตัวแปรในสคริปต์ของฉันและฉันต้องการดูHOMEเส้นทางของเขาตามUSERตัวแปร ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


72

มียูทิลิตี้ที่จะค้นหาข้อมูลผู้ใช้โดยไม่คำนึงว่าข้อมูลนั้นถูกเก็บไว้ในไฟล์ในเครื่องเช่น/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

getent เป็นคำตอบที่ดีกว่าโดยเฉพาะกับผู้ใช้ระยะไกล ในระบบที่ง่ายกว่าผู้ใช้ ~ ควรจะเพียงพอ Modded you up
Rui F Ribeiro

@RuiFRibeiro คุณไม่สามารถใช้กับตัวแปรใน~foo bashไม่โดยตรง
muru

1
@muru - เป็นจริง - และเป็นพฤติกรรมที่ต้องการ ~ดูเหมือนจะแท็บขยายแม้ว่าและอีกพฤติกรรม spec'd ของหนอนคำนำหน้าจะถูกแทนที่ด้วยชื่อพา ธ ของไดเรกทอรีการทำงานเริ่มต้นเชื่อมโยงกับชื่อเข้าสู่ระบบที่ได้รับการใช้getpwnam()ฟังก์ชั่นและอื่น ๆ อาจจะเป็นที่การค้นหาเป็นรักที่ดี ฉันไม่ชอบการขยายแท็บแม้ว่า - ฉันชอบที่จะพิมพ์แท็บ
mikeserv

1
โปรดทราบว่านี่จะทำให้คุณได้รับค่าเริ่มต้นของ $ HOME เท่านั้น สคริปต์การเข้าสู่ระบบของผู้ใช้มีสิทธิ์อย่างสมบูรณ์ในการเปลี่ยนเป็นอย่างอื่น นี่เป็นสิ่งที่ผิดปกติที่ต้องทำ แต่ฉันสามารถนึกถึงสถานการณ์ที่มันจะสมเหตุสมผลเช่นการเลือกระหว่างท้องถิ่นและบ้านที่ติดกับ NFS
zwol

1
@HagenvonEitzen Colons เป็นสิ่งต้องห้ามอย่างแม่นยำเพราะพวกมันถูกใช้เพื่อแยกฟิลด์
เจนนี่ D

9

คุณสามารถใช้evalเพื่อรับไดเรกทอรีบ้านของใครบางคน

eval echo "~$USER"

อย่างน้อยสำหรับผู้ใช้ในท้องถิ่นสิ่งนี้ใช้ได้อย่างแน่นอน ฉันไม่ทราบว่าผู้ใช้ระยะไกลเช่น LDAP ได้รับการจัดการด้วยevalหรือไม่


1
ไม่จำเป็นต้องทำ eval ตรงนั้น ระวังภาษาอังกฤษของคุณ
Rui F Ribeiro

4
@nwk evalจำเป็นต้องมี Bash ไม่ได้ดำเนินการ~fooหลังจากการขยายตัวของตัวแปร
muru

1
น่าสนใจขอบคุณอย่างไรก็ตามสิ่งนี้จะได้รับเฉพาะไดเรกทอรีของผู้ใช้ปัจจุบันไม่ใช่ผู้ใช้รายอื่น ฉันคิดว่าผู้ใช้ LDAP ไม่ได้รับการจัดการแม้ว่าฉันผิด
Rui F Ribeiro

3
@RuiFRibeiro มันจะทำงานได้ดีกับ LDAP เพียงใช้สิ่งที่มีตัวแปรชื่อผู้ใช้ LDAP USERของคุณแทน
muru

3
อย่าใช้นี้โดยไม่มีการตรวจสอบว่า$USERขยายไปเพียงสายเดียวของตัวอักษร
chepner

4

สถานที่ปกติคือ/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

จะให้ข้อมูลที่เทียบเท่า (ถ้ามี)


2
คุณมีผู้ใช้ ~ สำหรับสิ่งนั้นและโซลูชันของคุณจะไม่พิจารณาผู้ใช้ในระบบที่ซับซ้อนมากขึ้นเช่นผู้ใช้ที่มาจาก LDAP ซึ่งคุณต้องใช้ getent
Rui F Ribeiro

2

หากไม่มีผู้ใช้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'"

1

หากคุณเข้าสู่ระบบในฐานะรูทหากคุณรู้USERรหัสผ่านหรือหากUSERไม่มีรหัสผ่านต่อไปนี้เป็นอีกตัวเลือกหนึ่ง:

    su -c 'echo ~' ${USER}

ภายใต้suพฤติกรรมมาตรฐานหากUSERไม่ได้กำหนดหรือว่างเปล่าจากนั้นsuจะพยายามเรียกใช้คำสั่งในฐานะรูท

ถ้าค่าของการไม่ใช้ชื่อผู้ใช้ที่ถูกต้องแล้วเกิดข้อผิดพลาดที่เหมาะสมจะได้รับการเลี้ยงดู:USERsu: user <user> does not exist

มีคำตอบที่ดีมากมายอยู่ที่นี่แล้ว แต่นี่อาจช่วยคนอื่นได้


สิ่งนี้ไม่ปลอดภัยขึ้นอยู่กับการกำหนดค่าระบบ มันรันกระบวนการ (เชลล์รัน echo) ในฐานะผู้ใช้นั้นดังนั้นผู้ใช้สามารถ (ตัวอย่าง) ptrace เชลล์และให้เอาต์พุตโดยพลการ มันยังทำงานอยู่ในการตั้งค่าของผู้ใช้ดังนั้นจึงเป็นไปได้ว่าไฟล์การกำหนดค่าผู้ใช้เชลล์กำลังทำงานอยู่ (ซึ่งอาจให้ผลลัพธ์โดยพลการ) หรือสภาพแวดล้อมโหลดผ่านแพม เป็นต้นหรือเพียงแค่ทำอะไรง่ายๆเพียงส่ง SIGSTOP เพื่อให้มันใช้งานได้ตลอดไปดอสโจมตีสคริปต์ของคุณอย่างมีประสิทธิภาพ
Derobert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.