Ubuntu และ Debian จะจัดการ $ HOME สำหรับผู้ใช้ด้วยสิทธิ์ sudo ได้อย่างไร


39

ฉันมีสคริปต์ทุบตีmyhome.shที่มีเพียงหนึ่งบรรทัด:

echo $HOME

เจ้าของสคริปต์เป็นผู้ใช้:

$ ls -l myhome.sh
-rw-rw-r-- 1 user user <date> <time> myhome.sh

ในUbuntu 16.04 และ 17.10ฉันได้รับ:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ sudo bash myhome.sh
/home/user

ในDebian Buster / การทดสอบฉันได้รับ:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ sudo bash myhome.sh
/root

ผมไม่เข้าใจว่าทำไมภายในสคริปต์ใน Debian ถ้ามันดำเนินการด้วย sudo ผมมักจะได้รับในขณะที่อูบุนตูที่ฉันได้รับ$HOME=/root $HOME=/home/userไม่มีใครรู้ว่านักพัฒนา Ubuntu มีการเปลี่ยนแปลงอย่างไรบ้าง

คำตอบ:


68

ทั้ง Debian และ Ubuntu จัดส่ง/etc/sudoersไฟล์ที่มีDefaults env_resetซึ่งจะรีเซ็ตตัวแปรสภาพแวดล้อม

อย่างไรก็ตามพฤติกรรมของenv_resetถูกเปลี่ยนจากการไม่แตะ $ HOME เพื่อรีเซ็ตเป็นโฮมของผู้ใช้เป้าหมาย

Ubuntu ตัดสินใจที่จะแก้ไขเวอร์ชันของพวกเขาsudoเพื่อให้พฤติกรรมก่อนหน้านี้: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140

ใน Ubuntu เพื่อที่จะตั้งค่าตัวแปร $ สภาพแวดล้อมที่บ้านให้กับผู้ใช้เป้าหมายหนึ่งที่มีการตั้งค่าอย่างใดอย่างหนึ่งDefaults always_set_homeหรือDefaults set_home(ซึ่งในกรณีนี้เท่านั้นsudo -sจะได้รับบ้านปรับปรุง) /etc/sudoersในของพวกเขา

ข้อผิดพลาดที่ตัวติดตาม Ubuntu นี้มีเหตุผลเพิ่มเติมบางประการที่ไม่ได้ตั้งค่า $ HOME ใน sudo: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495

ดูความคิดเห็น # 4:

หาก HOME ถูกลบออกไปเช่น vim, bash เป็นต้นจะใช้ /root/.vimrc, /root/.bashrc เป็นต้นแทนที่จะเป็นผู้ใช้ ~ / .vimrc, ~ / .bashrc เป็นต้นในขณะที่มันเป็นความคิดที่ไม่ดี ในการเรียกใช้ไคลเอนต์ X ผ่าน sudo พวกเขาอาจจะมองในตำแหน่งที่ไม่ถูกต้องสำหรับไฟล์การกำหนดค่าและมีโอกาสที่ไคลเอนต์ X11 อาจไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ X11 ได้หากพวกเขามุ่งไปที่ไฟล์. Xauthority ผิด

เป็นการตัดสินใจอย่างมีสติของนักพัฒนา Ubuntu

คำตอบนี้มีรายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือก sudoers เช่นalways_set_home: https://unix.stackexchange.com/a/91572/281844


มีคำถามที่สองในคำถามของคุณsudo echo $HOMEซึ่งยังแสดงถึงบ้านของผู้ใช้แม้ใน Debian

สิ่งนี้เกิดขึ้นเพราะเชลล์กำลังขยายตัว$HOME ก่อนรันsudoคำสั่ง

ดังนั้นนี่คือ:

$ sudo echo $HOME

ถูกขยายโดยเชลล์เป็นครั้งแรก:

$ sudo echo /home/user

จากนั้น sudo จะเรียกใช้งานecho /home/userเป็นรูท ...

สิ่งนี้ควรแสดงให้เห็นถึงความแตกต่างเช่นกัน:

$ sudo bash -c 'echo $HOME'
/root

หรือรับรูทเชลล์แบบเต็มและดูตัวแปรสภาพแวดล้อมที่นั่น:

$ sudo -s
# echo $HOME
/root
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.