Làm thế nào để sudo được thiết lập để không thay đổi $ HOME trong Ubuntu và làm thế nào để vô hiệu hóa hành vi này?


39

Trên Ubuntu 12.04, khi tôi sudo -sbiến $ HOME không thay đổi, vì vậy nếu người dùng thông thường của tôi là regularuser, tình huống sẽ diễn ra như sau:

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

Tôi đã từ bỏ Ubuntu từ lâu, vì vậy tôi không thể chắc chắn, nhưng tôi nghĩ đây là hành vi mặc định. Vì vậy, câu hỏi của tôi là:

Q1. Làm thế nào được thực hiện? Cấu hình ở đâu?

Quý 2 Làm thế nào để tôi vô hiệu hóa nó?

Chỉnh sửa: Cảm ơn câu trả lời, đã làm rõ mọi thứ một chút, nhưng tôi đoán tôi phải thêm một vài câu hỏi, để có được câu trả lời tôi đang tìm kiếm.

H3 Trong Debian sudo -s, thay đổi biến $ HOME thành /root. Từ những gì tôi nhận được từ các câu trả lời và man sudocái vỏ chạy theo sudo -slà cái được đưa vào /etc/passwd, phải không?

Q4. Tuy nhiên, trên cả Ubuntu và Debian, shell được cung cấp /etc/passwdcho root là /bin/bash. Trong cả hai hệ thống, tôi cũng không thể tìm thấy sự khác biệt trong .profilehoặc .bashrccác tệp, liên quan đến $ HOME, do đó hành vi của các sudo -skhác nhau. Bất kỳ trợ giúp về điều này?


Bạn đã trả lời một phần câu hỏi của riêng bạn trong một nhận xét về câu trả lời của tôi, nhưng tôi nghĩ rằng tôi đã đặt liên kết unix.stackexchange.com/questions/38175/ vào đây. Tôi nghĩ rằng yêu cầu của bạn trong quý 3 là do một số người đặt hồ sơ và các tệp RC của họ hoạt động giống nhau bất kể họ có ở trong vỏ đăng nhập hay không. Tôi nghĩ thật khó có thể sudohành xử khác nhau giữa Debian và Ubuntu.
msw

@msw Theo như sự khác biệt giữa Debian và Ubuntu (12.04) sudo, tôi nghĩ rằng thực sự có một sự khác biệt theo mặc định. Tuy nhiên, tôi không đặt cược vào nó, vì tôi đang ở trong một hộp được thiết lập bởi người khác và đã chạy được một thời gian. Trong mọi trường hợp, đối với bất kỳ ai quan tâm, tôi đã tìm thấy security.stackexchange.com/questions/18369/lỗi.launchpad.net / ubfox / + source / sudo / + bug / 760140 .
alxs

Câu trả lời:


51

Sudo có nhiều tùy chọn cấu hình thời gian biên dịch. Bạn có thể liệt kê các cài đặt trong phiên bản của bạn với sudo -V. Một trong những khác biệt giữa cấu hình trong Debian wheezy và trong Ubuntu 12.04 là HOMEbiến môi trường được bảo toàn trong Ubuntu chứ không phải trong Debian; cả hai bản phân phối đều xóa tất cả các biến môi trường ngoại trừ một số biến được đánh dấu rõ ràng là an toàn để bảo tồn. Do đó sudo -sbảo tồn HOMEtrên Ubuntu, trong khi trên Debian HOMEbị xóa và sudosau đó đặt nó vào thư mục chính của người dùng đích.

Bạn có thể ghi đè hành vi này trong sudoerstệp. Chạy visudođể chỉnh sửa sudoerstập tin. Có một số tùy chọn liên quan:

  • env_keepxác định các biến môi trường được bảo tồn. Sử dụng Defaults env_keep += "HOME"để giữ lại HOMEbiến môi trường của người gọi hoặc Defaults env_keep -= "HOME"xóa nó (và thay thế nó bằng thư mục chính của người dùng đích).
  • env_resetxác định xem các biến môi trường có được thiết lập lại hay không. Đặt lại các biến môi trường thường là cần thiết cho các quy tắc cho phép chạy một lệnh cụ thể, nhưng không có lợi ích bảo mật trực tiếp cho các quy tắc cho phép chạy các lệnh tùy ý.
  • always_set_home, nếu được đặt, các nguyên nhân HOMEsẽ bị ghi đè ngay cả khi nó được bảo tồn do env_resetbị vô hiệu hóa hoặc HOMEnằm trong env_keepdanh sách. Tùy chọn này không có hiệu lực nếu HOMEkhông được bảo tồn.
  • set_homegiống như always_set_home, nhưng chỉ áp dụng cho sudo -s, không phải khi gọi sudobằng lệnh rõ ràng.

Các tùy chọn này có thể được đặt cho một người dùng nguồn nhất định, một người dùng đích cụ thể hoặc một lệnh đã cho; xem sudoershướng dẫn để biết chi tiết.

Bạn luôn có thể chọn ghi đè HOMEcho một cuộc gọi nhất định sudobằng cách chuyển tùy chọn -H.

Shell sẽ không bao giờ ghi đè giá trị của HOME. (Nó sẽ đặt HOMEnếu nó không được đặt, nhưng sudoluôn đặt HOMEcách này hay cách khác.)

Nếu bạn chạy sudo -i, sudomô phỏng đăng nhập ban đầu. Điều này bao gồm cài đặt HOMEvào thư mục chính của người dùng đích và gọi shell đăng nhập .


17

Sử dụng sudo -H -ithay vì sudo -sđể có được một vỏ gốc đăng nhập tương tác:

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

Từ 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)).

-ingụ ý -H.
x-yuri

5

Điều này ít liên quan đến hành vi sudovà nhiều việc phải làm với sự khác biệt giữa "vỏ đăng nhập" và "vỏ không đăng nhập". Cách khắc phục nhanh là

$ sudo -i

như có thể thấy vớ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

Như đã lưu ý trong hướng dẫn sudo:

Tùy chọn -i (mô phỏng đăng nhập ban đầu) chạy shell được chỉ định bởi mục nhập cơ sở dữ liệu mật khẩu của người dùng đích dưới dạng shell đăng nhập. Điều này có nghĩa là các tệp tài nguyên dành riêng cho đăng nhập như .profile hoặc .login sẽ được đọc bởi trình bao. Nếu một lệnh được chỉ định, nó được chuyển đến shell để thực thi thông qua tùy chọn -c của shell. Nếu không có lệnh nào được chỉ định, shell tương tác được thực thi.


Cảm ơn về các chi tiết bổ sung, họ đã làm rõ mọi thứ hơn một chút cho tôi. Đoán tôi phải kiểm tra sự khác biệt giữa các vỏ. Đối với bất kỳ ai đọc điều này, trong tình huống tương tự với tôi, hãy kiểm tra điều này: unix.stackexchange.com/questions/38175/ợi
alxs

1
Không, cho dù sudo thay đổi HOMEhay không có mọi thứ liên quan đến cách cấu hình sudo.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Vậy, sudo được cấu hình như thế nào? Trong /etc/sudoersđó, không có gì khác nhau giữa Debian và Ubuntu khi có liên quan đến $ HOME.
alxs

1
@alxs IIRC Debian và Ubuntu có các giá trị mặc định thời gian biên dịch khác nhau. Bạn có thể ghi đè chúng bằng các tùy chọn always_set_homeset_hometrong sudoers.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Cảm ơn bạn. Đó chính xác là câu trả lời tôi đang tìm kiếm, cả về lý do tại sao điều này xảy ra và làm thế nào để hoàn nguyên nó. Nếu bạn không phiền khi đăng nó, tôi sẽ chấp nhận nó là câu trả lời. Tôi có thể tự làm điều đó, nhưng tôi không muốn lấy tín dụng cho nó.
alxs

2

Cách khá phổ biến để lấy shell root cũng được sử dụng:

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

Tôi sử dụng để sử dụng sudo -i -H, nhưng không thành công với việc cài đặt gói npm toàn cầu từ git. Với sudo su -nó hoạt động! Cảm ơn bạn.
Laurent

0

Để loại bỏ các hành vi khác nhau sudo -strên Ubuntu và Debian tương ứng, bạn có thể sử dụng sudotrình bao bọc (câu trả lời cho Q4):

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"
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.