sudo ถูกตั้งค่าอย่างไรให้ไม่เปลี่ยน $ HOME ใน Ubuntu และจะปิดการทำงานนี้ได้อย่างไร?


38

บน Ubuntu 12.04 เมื่อฉันsudo -sตัวแปร $ HOME ไม่เปลี่ยนแปลงดังนั้นหากผู้ใช้ปกติของฉันregularuserสถานการณ์จะเป็นดังนี้:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

ฉันเลิกใช้ Ubuntu ไปนานแล้วดังนั้นฉันจึงไม่แน่ใจ แต่ฉันคิดว่านี่เป็นพฤติกรรมเริ่มต้น ดังนั้นคำถามของฉันคือ:

ไตรมาสที่ 1 สิ่งนี้ทำได้อย่างไร การกำหนดค่าอยู่ที่ไหน

ไตรมาสที่ 2 ฉันจะปิดการใช้งานได้อย่างไร

แก้ไข: ขอบคุณสำหรับคำตอบซึ่งชี้แจงสิ่งเล็กน้อย แต่ฉันคิดว่าฉันต้องเพิ่มคำถามสองสามข้อเพื่อให้ได้คำตอบที่ฉันกำลังมองหา

ไตรมาสที่ 3 ใน Debian sudo -sเปลี่ยนแปลงตัวแปร $ HOME /rootเพื่อ จากสิ่งที่ฉันได้รับจากคำตอบและman sudoกระสุนที่วิ่งไปsudo -sนั้นเป็นที่ได้รับ/etc/passwdใช่ไหม?

ไตรมาสที่ 4 อย่างไรก็ตามทั้ง Ubuntu และ Debian เปลือกที่กำหนดในรากเป็น/etc/passwd /bin/bashในทั้งสองระบบฉันไม่สามารถค้นหาได้ว่ามีความแตกต่าง.profileหรือ.bashrcไฟล์อยู่ที่ใดที่ $ HOME เกี่ยวข้องดังนั้นพฤติกรรมของsudo -sความแตกต่าง ความช่วยเหลือเกี่ยวกับเรื่องนี้?


คุณตอบคำถามของคุณเองบางส่วนในความคิดเห็นในคำตอบของฉัน แต่ฉันคิดว่าฉันใส่ลิงค์unix.stackexchange.com/questions/38175/…ที่นี่ ฉันคิดว่าการอ้างสิทธิ์ของคุณในไตรมาสที่ 3เป็นเพราะบางคนตั้งค่าโปรไฟล์และไฟล์ rc ให้ทำแบบเดียวกันโดยไม่คำนึงว่าพวกเขาอยู่ในเปลือกเข้าสู่ระบบหรือไม่ ฉันคิดว่ามันไม่น่าsudoจะมีพฤติกรรมที่แตกต่างกันระหว่าง Debian และ Ubuntu
msw

@msw ตราบใดที่ความแตกต่างระหว่าง Debian's และ Ubuntu (12.04) เป็นsudoไปฉันคิดว่าแท้จริงแล้วมีความแตกต่างตามค่าเริ่มต้น อย่างไรก็ตามฉันไม่ได้เดิมพันเพราะฉันอยู่ในกล่องที่ถูกตั้งค่าโดยคนอื่นและทำงานมาระยะหนึ่งแล้ว ในกรณีใด ๆ สำหรับทุกคนที่สนใจผมพบsecurity.stackexchange.com/questions/18369/...และbugs.launchpad.net/ubuntu/+source/sudo/+bug/760140
alxs

คำตอบ:


50

Sudo มีตัวเลือกการกำหนดค่าเวลารวบรวมจำนวนมาก sudo -Vคุณสามารถแสดงรายการการตั้งค่าในรุ่นของคุณด้วย หนึ่งในความแตกต่างระหว่างการกำหนดค่าใน Debian wheezy และใน Ubuntu 12.04 คือHOMEตัวแปรสภาพแวดล้อมถูกเก็บรักษาไว้ใน Ubuntu แต่ไม่ได้อยู่ใน Debian การแจกแจงทั้งสองลบตัวแปรสภาพแวดล้อมทั้งหมดยกเว้นบางอย่างที่ทำเครื่องหมายไว้อย่างชัดเจนว่าปลอดภัย ดังนั้นจะsudo -sเก็บรักษาไว้HOMEบน Ubuntu ในขณะที่ Debian HOMEถูกลบsudoแล้วตั้งค่าเป็นโฮมไดเร็กทอรีของผู้ใช้เป้าหมาย

คุณสามารถลบล้างพฤติกรรมนี้ได้ในsudoersไฟล์ เรียกใช้visudoเพื่อแก้ไขsudoersไฟล์ มีตัวเลือกที่เกี่ยวข้องหลายตัว:

  • env_keepกำหนดตัวแปรสภาพแวดล้อมที่จะถูกเก็บรักษาไว้ ใช้Defaults env_keep += "HOME"เพื่อรักษาHOMEตัวแปรสภาพแวดล้อมของผู้โทรหรือDefaults env_keep -= "HOME"เพื่อลบ (และแทนที่โดยโฮมไดเร็กทอรีของผู้ใช้เป้าหมาย)
  • env_resetกำหนดว่าตัวแปรสภาพแวดล้อมจะถูกรีเซ็ตเลย การรีเซ็ตตัวแปรสภาพแวดล้อมมักจำเป็นสำหรับกฎที่อนุญาตให้เรียกใช้คำสั่งเฉพาะ แต่ไม่ได้รับประโยชน์ด้านความปลอดภัยโดยตรงสำหรับกฎที่อนุญาตให้เรียกใช้คำสั่งโดยพลการอย่างไรก็ตาม
  • always_set_homeหากตั้งค่าHOMEจะทำให้ถูกเขียนทับแม้ว่าจะถูกเก็บรักษาไว้เนื่องจากenv_resetถูกปิดใช้งานหรือHOMEอยู่ในenv_keepรายการ ตัวเลือกนี้จะไม่มีผลหากHOMEไม่ได้รับการสงวนไว้
  • set_homeเป็นเหมือนalways_set_homeแต่ใช้ได้กับเท่านั้นsudo -sไม่ใช่เมื่อโทรsudoด้วยคำสั่งที่ชัดเจน

ตัวเลือกเหล่านี้สามารถตั้งค่าสำหรับผู้ใช้แหล่งที่มาที่กำหนดผู้ใช้เป้าหมายที่กำหนดหรือคำสั่งที่กำหนด; ดูsudoersคู่มือสำหรับรายละเอียด

คุณสามารถเลือกที่จะแทนที่HOMEสำหรับการโทรที่กำหนดให้โดยผ่านตัวเลือกsudo-H

HOMEเปลือกจะไม่แทนที่ค่าของ (มันจะตั้งค่าHOMEหากไม่ได้ตั้งค่า แต่sudoจะตั้งค่าHOMEทางเดียวหรืออื่น ๆ เสมอ)

หากคุณทำงานsudo -i, sudoจำลองเข้าสู่ระบบครั้งแรก ซึ่งรวมถึงการตั้งค่าHOMEไปยังไดเรกทอรีบ้านของผู้ใช้เป้าหมายและตื่นตาตื่นใจเปลือกเข้าสู่ระบบ


17

ใช้sudo -H -iแทนsudo -sเพื่อรับเชลล์รูทการเข้าสู่ระบบแบบโต้ตอบ:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

จากman sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).

5

สิ่งนี้มีส่วนเกี่ยวข้องกับพฤติกรรมของsudoสิ่งต่าง ๆ ที่ทำกับความแตกต่างระหว่าง "login shell" และ "non-login shell" เท่านั้น การแก้ไขอย่างรวดเร็วคือ

$ sudo -i

ที่สามารถเห็นได้ด้วย:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

ตามที่ระบุไว้ในคู่มือ sudo:

อ็อพชัน -i (จำลองการล็อกอินเริ่มต้น) รันเชลล์ที่ระบุโดยรายการฐานข้อมูลรหัสผ่านของผู้ใช้เป้าหมายเป็นเชลล์ล็อกอิน ซึ่งหมายความว่าไฟล์ทรัพยากรเฉพาะการเข้าสู่ระบบเช่น. profile หรือ .login จะอ่านโดยเชลล์ หากระบุคำสั่งคำสั่งจะถูกส่งไปยังเชลล์เพื่อดำเนินการผ่านตัวเลือกเชลล์ของ -c หากไม่ได้ระบุคำสั่งเชลล์เชิงโต้ตอบจะถูกดำเนินการ


ขอบคุณสำหรับรายละเอียดเพิ่มเติมพวกเขาชี้แจงสิ่งต่าง ๆ เพิ่มเติมเล็กน้อยสำหรับฉัน เดาว่าฉันต้องตรวจสอบความแตกต่างระหว่างเปลือกหอย สำหรับทุกคนที่อ่านข้อความนี้ในสถานการณ์เดียวกันกับฉันให้ตรวจสอบสิ่งนี้: unix.stackexchange.com/questions/38175/…
อัลกอส

1
ไม่ไม่ว่า sudo จะเปลี่ยนแปลงHOMEหรือไม่มีทุกสิ่งที่เกี่ยวข้องกับวิธีการกำหนดค่า sudo
Gilles 'หยุดความชั่วร้าย'

@Gilles: ดังนั้นวิธี sudo กำหนดค่าอย่างไร ใน/etc/sudoersไม่มีอะไรแตกต่างระหว่าง Debian และ Ubuntu จนถึง $ HOME ที่เกี่ยวข้อง
alxs

1
@alxs IIRC Debian และ Ubuntu มีค่าเริ่มต้นเวลาคอมไพล์ที่แตกต่างกัน คุณสามารถแทนที่พวกเขามีตัวเลือกalways_set_homeและในset_home sudoers
Gilles 'หยุดความชั่วร้าย'

@Gilles: ขอบคุณ นั่นคือคำตอบที่ฉันกำลังมองหาทั้งในสิ่งที่เกิดขึ้นและวิธีการเปลี่ยนกลับ หากคุณไม่รังเกียจที่จะโพสต์มันฉันจะยอมรับมันเป็นคำตอบ ฉันทำได้ด้วยตัวเอง แต่ฉันไม่ต้องการรับเครดิต
alxs

2

วิธีการที่นิยมใช้รูทเชลล์ก็ค่อนข้างใช้เช่นกัน:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root

ฉันใช้งานsudo -i -Hแต่ก็ล้มเหลวในการติดตั้งแพ็กเกจ npm ทั่วโลกจาก git ด้วยsudo su -มันใช้งานได้! ขอขอบคุณ.
Laurent

0

ในการกำจัดพฤติกรรมที่แตกต่างของsudo -sบน Ubuntu และ Debian ตามลำดับคุณสามารถใช้sudowrapper (ตอบคำถามที่ 4):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.