sudo เป็นผู้ใช้รายอื่นที่มีสภาพแวดล้อม


56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

เหตุใดจึงไม่$HOMEถูกตั้งค่าเป็น/home/otheruserแม้ว่า bash จะถูกเรียกใช้เป็นเชลล์การเข้าสู่ระบบ

โดยเฉพาะ/home/otheruser/.bashrcไม่ได้มีที่มา นอกจากนี้ยัง/home/otheruser/.profileไม่ได้รับที่มา - ( /home/otheruser/.bash_profileไม่มีอยู่)

แก้ไข: ปัญหาจริงคือhttps://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails


วิธีแก้ปัญหาสำหรับคำถามนี้จะแก้ไขคำถามอื่นด้วยเช่นกันคุณอาจต้องการลบคำถามอื่นในสถานการณ์นี้
Pavel Šimerda

คำตอบ:


83

เพื่อเรียกเปลือกเข้าสู่ระบบโดยใช้เพียงแค่ใช้sudo -iเมื่อไม่ได้ระบุคำสั่งคุณจะได้รับพรอมต์เชลล์การเข้าสู่ระบบมิฉะนั้นคุณจะได้ผลลัพธ์ของคำสั่ง

ตัวอย่าง (ล็อกอินเชลล์):

sudo -i

ตัวอย่าง (กับผู้ใช้ที่ระบุ):

sudo -i -u user

ตัวอย่าง (พร้อมคำสั่ง):

sudo -i -u user whoami

ตัวอย่าง (ผู้ใช้งานพิมพ์$HOME):

sudo -i -u user echo \$HOME

หมายเหตุ: อักขระเครื่องหมายทับขวาช่วยให้มั่นใจได้ว่าเครื่องหมายดอลลาร์เข้าถึงเชลล์ผู้ใช้เป้าหมายและไม่ตีความในเชลล์ผู้ใช้ที่โทรมา

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

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...

ฉันสังเกตเห็นว่าคุณกำลังใช้-Sและฉันไม่คิดว่าโดยทั่วไปจะเป็นเทคนิคที่ดี หากคุณต้องการเรียกใช้คำสั่งในฐานะผู้ใช้อื่นโดยไม่ต้องดำเนินการตรวจสอบสิทธิ์จากแป้นพิมพ์คุณอาจต้องการใช้ SSH แทน มันทำงานได้localhostดีเช่นเดียวกับโฮสต์อื่น ๆ และให้การรับรองความถูกต้องของรหัสสาธารณะที่ทำงานได้โดยไม่ต้องป้อนข้อมูลแบบโต้ตอบใด ๆ

ssh user@localhost echo \$HOME

หมายเหตุ: คุณไม่จำเป็นต้องมีตัวเลือกพิเศษด้วย SSH เนื่องจากเซิร์ฟเวอร์ SSH จะสร้างเชลล์การเข้าสู่ระบบเพื่อให้เข้าถึงได้โดยไคลเอนต์ SSH


2
sudo -i -u user echo \$HOMEไม่ได้ผลสำหรับฉัน ผลลัพธ์: $HOME. strace ให้ผลลัพธ์เช่นเดียวกับของคุณ มีปัญหาอะไร
John_West

ไม่มีความคิดมันยังใช้ได้กับฉันฉันต้องเห็นมันหรืออาจจะแตะระบบ
Pavel Šimerda

10

คุณให้เครดิตมากเกินไปกับ Bash "login shell" ทั้งหมดหมายถึง Bash คือไฟล์ที่มีแหล่งที่มาเมื่อเริ่มต้นและปิดระบบ $HOMEตัวแปรไม่ได้คิดเป็นมัน

Bash docs อธิบายเพิ่มเติมว่าเชลล์ล็อกอินหมายถึงอะไร: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

ในความเป็นจริงทุบตีไม่ได้ทำอะไรในการตั้งค่า$HOMEที่ทุกคน $HOMEถูกกำหนดโดยสิ่งใดก็ตามที่เรียกใช้เชลล์ (ล็อกอิน, ssh, ฯลฯ ) และเชลล์สืบทอด สิ่งที่เริ่มต้นเปลือกของคุณเป็นชุดดูแลระบบ$HOMEแล้ว exec-ED bash, sudoโดยการออกแบบไม่เปลี่ยนแปลงสภาพแวดล้อมเว้นแต่ถามหรือการกำหนดค่าให้ทำเช่นนั้นเพื่อให้bashเป็น otheruser สืบทอดมาจากเปลือกของคุณ

หากคุณต้องการsudoจัดการกับสภาพแวดล้อมในแบบที่คุณคาดหวังมากขึ้นดู-iสวิตช์สำหรับ sudo ลอง:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

หน้า man สำหรับ sudo อธิบายรายละเอียดเพิ่มเติมแม้ว่าจะไม่ค่อยดีนักฉันคิดว่า: http://linux.die.net/man/8/sudo


4
$ HOME ไม่ได้ถูกกำหนดโดย bash - ขอบคุณฉันไม่รู้เหมือนกัน
user80551

มองหาstraceในคำตอบของฉัน มันแสดงให้เห็นว่าคุณไม่จำเป็นต้องสร้างบรรทัดคำสั่งตัวเองเมื่อใช้/bin/bash -l -c 'echo $HOME' -i
Pavel Šimerda

1
sudoไวยากรณ์นั้นมีข้อผิดพลาดในเครื่องของฉัน ( suใช้-cตัวเลือก แต่ฉันไม่คิดว่าsudoจะเป็นเช่นนั้น) ฉันโชคดีกว่าด้วย:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim

ใช่ @palswim ถูกต้อง ไม่แน่ใจเกี่ยวกับ-S(ฉันไม่ต้องการมันดังนั้นฉันจึงทิ้งมันไว้) แต่-cไม่ทำงานที่นี่คุณต้องการ-sแทน
polynomial_donut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.