sudo như một người dùng khác với môi trường của họ


56

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

Tại sao không $HOMEđược đặt thành /home/otherusermặc dù bash được gọi là shell đăng nhập?

Cụ thể, /home/otheruser/.bashrckhông có nguồn gốc. Ngoài ra, /home/otheruser/.profilekhông có nguồn gốc. - ( /home/otheruser/.bash_profilekhông tồn tại)

EDIT: Vấn đề chính xác thực sự là https://stackoverflow.com/questions/27738224/mkvirtualenv-with-foven-as-another-user-fails


Một giải pháp cho câu hỏi này cũng sẽ giải quyết câu hỏi khác, bạn có thể muốn xóa câu hỏi khác trong tình huống này.
Pavel imerda

Câu trả lời:


83

Để gọi một vỏ đăng nhập bằng cách sử dụng sudochỉ cần sử dụng -i. Khi lệnh không được chỉ định, bạn sẽ nhận được lời nhắc shell đăng nhập, nếu không, bạn sẽ nhận được đầu ra của lệnh.

Ví dụ (vỏ đăng nhập):

sudo -i

Ví dụ (với một người dùng được chỉ định):

sudo -i -u user

Ví dụ (có lệnh):

sudo -i -u user whoami

Ví dụ (người dùng in $HOME):

sudo -i -u user echo \$HOME

Lưu ý: Ký tự dấu gạch chéo ngược đảm bảo rằng ký hiệu đô la chạm tới vỏ của người dùng đích và không được hiểu trong vỏ của người dùng đang gọi.

Tôi vừa kiểm tra ví dụ cuối cùng với strace cho bạn biết chính xác những gì đang xảy ra. Dưới đây cho thấy shell đang được gọi với --loginvà với lệnh được chỉ định, giống như trong lệnh gọi rõ ràng của bạn để bash, nhưng ngoài ra sudo có thể thực hiện công việc riêng của mình như cài đặt $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
...

Tôi nhận thấy rằng bạn đang sử dụng -Svà tôi không nghĩ rằng đó thường là một kỹ thuật tốt. Nếu bạn muốn chạy các lệnh như một người dùng khác mà không thực hiện xác thực từ bàn phím, bạn có thể muốn sử dụng SSH thay thế. Nó hoạt động localhostcũng như cho các máy chủ khác và cung cấp xác thực khóa chung hoạt động mà không cần bất kỳ đầu vào tương tác nào.

ssh user@localhost echo \$HOME

Lưu ý: Bạn không cần bất kỳ tùy chọn đặc biệt nào với SSH vì máy chủ SSH luôn tạo vỏ đăng nhập để máy khách SSH truy cập.


2
sudo -i -u user echo \$HOMEkhông làm việc cho tôi. Đầu ra : $HOME. strace cho cùng một đầu ra như của bạn. Vấn đề là gì?
John_West

Không có ý tưởng, nó vẫn hoạt động với tôi, tôi cần phải nhìn thấy nó hoặc thậm chí có thể chạm vào hệ thống.
Pavel imerda

10

Bạn đang cho Bash quá nhiều tín dụng. Tất cả "vỏ đăng nhập" có nghĩa là Bash là những tập tin có nguồn gốc khi khởi động và tắt máy. Các $HOMEbiến không tìm vào nó.

Các tài liệu Bash giải thích thêm một số ý nghĩa của shell đăng nhập: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

Thực tế, Bash không làm gì để thiết lập $HOMEcả. $HOMEđược thiết lập bởi bất cứ điều gì gọi shell (đăng nhập, ssh, v.v.) và shell kế thừa nó. Bất cứ điều gì bắt đầu trình bao của bạn khi quản trị viên thiết lập $HOMEvà sau đó thực thi bash, sudobởi thiết kế sẽ không thay đổi môi trường trừ khi được yêu cầu hoặc định cấu hình để làm như vậy, do người bashdùng khác thừa hưởng nó từ trình bao của bạn.

Nếu bạn muốn sudoxử lý nhiều môi trường hơn theo cách bạn mong đợi, hãy xem công -itắc cho sudo. Thử:

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

Trang man cho sudo mô tả chi tiết hơn, mặc dù không thực sự tốt, tôi nghĩ: http://linux.die.net/man/8/sudo


4
$ HOME không được đặt bởi bash - Cảm ơn, tôi không biết điều đó.
dùng80551

Hãy tìm strace trong câu trả lời của tôi. Nó cho thấy rằng bạn không cần phải tự xây dựng /bin/bash -l -c 'echo $HOME'dòng lệnh khi sử dụng -i.
Pavel imerda

1
sudoCú pháp đó đã gây ra lỗi trên máy của tôi. ( susử dụng -ctùy chọn, nhưng tôi không nghĩ sudovậy.) Tôi đã may mắn hơn với:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim

vâng, @palswim đúng Không chắc chắn về -S(tôi không cần nó, vì vậy tôi đã bỏ nó), nhưng -ckhông hoạt động ở đây, -sthay vào đó bạn cần .
đa thức_donut
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.