Lệnh sudo không nguồn /root/.bashrc


27

Tôi đã thêm một đường dẫn tùy chỉnh tới PATHbiến trong tệp /root/.bashrc của mình

Khi tôi làm sudo su; echo $PATH, nó hiển thị mục, '/ path / to / custom / bins'.

Nhưng tôi làm sudo sh -c 'echo $PATH', nó cho thấy, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Đường dẫn thư mục được thêm vào trong tệp .bashrc không hiển thị.

Lệnh sudo không có môi trường giống như người dùng root phải không?

sudo  bashrc 

Câu trả lời:


32

.bashrclà một tệp cấu hình của bash, chỉ khi nó được thực thi tương tác. Nó chỉ được tải khi bạn bắt đầu bash, không phải khi bạn chạy một số chương trình khác, chẳng hạn như sh(ngay cả khi bash được gọi thông qua tên sh). Và nó chỉ được tải khi bash tương tác, không phải khi nó thực thi tập lệnh hoặc lệnh -c.

sudo sh -c 'echo $PATH'hoặc sudo bash -c 'echo $PATH'không gọi vỏ tương tác, vì vậy .bashrckhông liên quan.

sudo su; echo $PATHchạy một ví dụ tương tác của shell root. Nếu đó là bash, sau đó ~root/.bashrcđược tải. Đoạn mã này thực thi echo $PATHmột khi lớp vỏ tương tác này chấm dứt, do đó, bất cứ điều gì xảy ra trong lớp vỏ tương tác đều không ảnh hưởng đến những gì đoạn trích được in ở cuối. Nhưng nếu bạn gõ echo $PATHtại dấu nhắc của trình vỏ tương tác được bắt đầu bởi sudo su, bạn sẽ thấy giá trị được đặt bởi ~root/.bashrc.

.bashrcđược gọi trong mỗi shell tương tác, không phải bởi shell đăng nhập (thậm chí không phải bởi shell đăng nhập tương tác, là lỗi thiết kế trong bash), nên đó là vị trí sai để xác định các biến môi trường. Sử dụng .bashrccho các cài đặt bash tương tác như các ràng buộc chính, bí danh và cài đặt hoàn thành. Đặt các biến môi trường trong các tệp được tải khi bạn đăng nhập: ~/.pam_environmenthoặc ~/.profile.

Vì vậy, thiết lập PATHtrong .profilethay vì .bashrc, và một trong hai chạy một shell đăng nhập với sudo -i 'echo $PATH', hoặc một cách rõ ràng nguồn .profilevới sudo sh -c '. ~/.profile; echo $PATH'.


1
đã giải quyết nhiều điểm liên quan về đạn pháo .... cảm ơn ....

1
Làm thế nào để tôi thêm nó vào .profile? Bạn có nghĩa là /root/.profilehay /home/user/.profile? Tôi đã cố gắng thêm export PATH=$PATH:/mydirvào cả hai. Không hoạt động. Tôi đã cố gắng mà không có export, nó cũng không hoạt động.
falsePockets

@falsePockets Không hoạt động để làm gì? Bạn nên hỏi một câu hỏi mới và giải thích chính xác những gì bạn đang làm.
Gilles 'SO- ngừng trở nên xấu xa'

Điều không hoạt động hoàn toàn giống với điều OP đang cố gắng thực hiện. Tôi đang cố gắng thêm một thư mục vào PATH của siêu người dùng của tôi. Tôi không nên hỏi một câu hỏi mới, vì câu hỏi đó sẽ là một bản sao của câu hỏi này.
falsePockets

@falsePockets Nhưng rõ ràng bạn không làm điều tương tự để truy cập tài khoản superuser. Và vì bạn đã không nói những gì bạn đang làm, tôi không thể giúp bạn ngoài việc lặp lại những gì đã có trong câu trả lời của tôi.
Gilles 'SO- ngừng trở nên xấu xa'

14

Nhìn vào -E-icác tùy chọn.

-E: Biểu thị chính sách bảo mật mà người dùng muốn duy trì các biến môi trường hiện có của họ. Chính sách bảo mật có thể trả về lỗi nếu người dùng không có quyền bảo vệ môi trường.

-i: 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 làm 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. sudo cố gắng thay đổi thư mục chính của người dùng đó trước khi chạy shell. Lệnh được chạy với môi trường tương tự như môi trường mà người dùng sẽ nhận được khi đăng nhập. Phần môi trường lệnh trong tài liệu thủ công sudoers (5) làm thế nào tùy chọn -i ảnh hưởng đến môi trường mà lệnh được chạy khi chính sách sudoers đang sử dụng.


3

Bạn có thể sudo bash, trong đó đọc các bashtệp khởi động như được ghi lại trong bashtrang / tài liệu hướng dẫn. Tuy nhiên, xin lưu ý rằng nó có thể không đặt HOMEbiến môi trường chính xác. Điều này có thể được sửa trong bashtệp khởi động trên toàn hệ thống ( /etcvị trí chính xác phụ thuộc vào bản phân phối) - kiểm tra xem có phải $uidlà 0 không.

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.