Làm cách nào để Ubuntu và Debian quản lý $ HOME cho người dùng có quyền sudo?


39

Tôi có một tập lệnh bash myhome.shchỉ chứa một dòng:

echo $HOME

Chủ sở hữu của tập lệnh là người dùng:

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

Trong Ubuntu 16.04 và 17.10 tôi nhận được:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ sudo bash myhome.sh
/home/user

Trong Debian Buster / Kiểm tra tôi nhận được:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ sudo bash myhome.sh
/root

Tôi không hiểu tại sao bên trong tập lệnh trong Debian, nếu nó được thực thi bằng sudo, tôi luôn nhận được $HOME=/roottrong Ubuntu tôi nhận được $HOME=/home/user. Có ai biết những gì các nhà phát triển Ubuntu đã thay đổi?

Câu trả lời:


68

Cả Debian và Ubuntu đều gửi một /etc/sudoerstệp có chứa Defaults env_resetcác biến môi trường.

Tuy nhiên, hành vi của env_resetđã được thay đổi từ việc không chạm vào $ HOME để đặt lại nó về nhà của người dùng mục tiêu.

Ubuntu đã quyết định vá phiên bản của họ sudođể giữ hành vi trước đó: https://bugs.launchpad.net/ubfox/+source/sudo/+orms/760140

Trong Ubuntu, để thiết lập lại $ biến môi trường HOME để người dùng mục tiêu, người ta phải thiết lập một trong hai Defaults always_set_homehoặc Defaults set_home(trong trường hợp này chỉ sudo -ssẽ được cập nhật HOME) trong họ /etc/sudoers.

Lỗi này tại trình theo dõi Ubuntu có thêm một số lý do về việc không đặt $ HOME trong sudo: https://bugs.launchpad.net/ubfox/+source/sudo/+orms/1373495

Xem bình luận # 4:

Nếu HOME bị xóa, ví dụ: vim, bash, v.v., sẽ sử dụng /root/.vimrc, /root/.bashrc, v.v. chứ không phải là người dùng ~ / .vimrc, ~ / .bashrc, v.v. để chạy các máy khách X thông qua sudo, rất có thể chúng sẽ tìm sai vị trí cho các tệp cấu hình và có khả năng các máy khách X11 thậm chí không thể kết nối với máy chủ X11 nếu chúng nhắm vào tệp .Xmasterity sai.

Đó là một quyết định có ý thức của các nhà phát triển Ubuntu.

Câu trả lời này có nhiều chi tiết hơn về các tùy chọn sudoers như always_set_home: https://unix.stackexchange.com/a/91572/281844


Có một vấn đề thứ hai trong câu hỏi của bạn, đó là vấn đề sudo echo $HOMEvẫn hiển thị nhà của người dùng ngay cả trong Debian.

Điều đó xảy ra vì shell đang mở rộng $HOME trước khi chạy sudolệnh.

Vậy đây:

$ sudo echo $HOME

Lần đầu tiên được mở rộng bởi shell thành:

$ sudo echo /home/user

Và sau đó sudo thực thi echo /home/usernhư root ...

Điều này cũng sẽ chứng minh sự khác biệt:

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

Hoặc lấy một vỏ gốc đầy đủ và xem biến môi trường ở đó:

$ sudo -s
# echo $HOME
/root
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.