2011-12-26 36 views
295

Khi tôi sử dụng bất kỳ lệnh nào với sudo thì các biến môi trường không có. Ví dụ: sau khi đặt HTTP_PROXY, lệnh wget hoạt động tốt mà không cần sudo. Tuy nhiên, nếu tôi gõ sudo wget nó nói nó không thể bỏ qua cài đặt proxy.Làm thế nào để giữ biến môi trường khi sử dụng SUDO

+0

http://superuser.com/questions/232231/how-do-i-make-sudo-preserve-my-environment-variables –

+1

liên quan: [Tại sao là các biến PATH khác nhau khi chạy qua sudo và su ?] (http://unix.stackexchange.com/q/8646/21471) tại Unix SE – kenorb

Trả lời

242

Bí quyết là để thêm biến môi trường để sudoers tập tin qua sudo visudo lệnh và thêm những dòng này:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy" 

được lấy từ ArchLinux wiki.

Đối với Ubuntu 14, bạn cần phải xác định trong dòng riêng biệt vì nó sẽ trả về lỗi cho dòng đa biến:

Defaults env_keep += "http_proxy" 
Defaults env_keep += "https_proxy" 
Defaults env_keep += "HTTP_PROXY" 
Defaults env_keep += "HTTPS_PROXY" 
+10

Điều này được cho là lựa chọn tốt nhất, để tránh rò rỉ thông tin và các lỗ hổng bảo mật. 'sudo -E' là cách chắc chắn để adhoc nhận được cùng một hiệu ứng cho một lần, mặc dù – sehe

+0

Tôi gặp phải vấn đề của một quá trình là một trong những người gọi sudo (jhbuild) và tôi không thể nói nó vượt qua cờ -E để sudo, vì vậy đây là giải pháp của tôi. – jgomo3

+42

Lưu ý rằng bạn không nên * chỉnh sửa trực tiếp 'etc/sudoers'. Thay vào đó, sử dụng lệnh 'visudo', cú pháp kiểm tra các chỉnh sửa của bạn trước khi ghi đè lên tập tin' sudoers'. Bằng cách đó, bạn không tự khóa mình nếu bạn mắc lỗi trong khi chỉnh sửa. – Henning

322

Trước tiên, bạn cần phải export HTTP_PROXY. Thứ hai, bạn cần đọc kỹ số man sudo và chú ý đến cờ -E. Đây hoạt động:

$ export HTTP_PROXY=foof 
$ sudo -E bash -c 'echo $HTTP_PROXY' 

Dưới đây là trích dẫn từ trang người đàn ông:

-E, --preserve-env 
      Indicates to the security policy that the user wishes to reserve their 
      existing environment variables. The security policy may eturn an error 
      if the user does not have permission to preserve the environment. 
+0

tuyệt vời vấn đề duy nhất đó là sửa đổi một số tập tin cấu hình ví dụ pacman cho vòm để làm cho -E được thông qua –

+4

Để cho phép -E (bảo vệ môi trường) cho wget, bạn cần phải chỉ định thẻ SETENV trên quy tắc sudo cho phép chạy wget - Ví dụ: ALL = (root) NOPASSWD: SETENV:

+30

"-E" này không không hoạt động nếu biến là PATH hoặc PYTHONPATH. – apporc

18

Bạn cũng có thể kết hợp hai env_keep tuyên bố trong câu trả lời Ahmed Aswani thành một tuyên bố duy nhất như này:

Defaults env_keep += "http_proxy https_proxy"

Bạn cũng nên xem xét quy định cụ thể env_keep cho chỉ một lệnh duy nhất như thế này:

Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"

34

Đối với các biến riêng lẻ bạn muốn cung cấp trên cơ sở một lần, bạn có thể biến nó thành một phần của lệnh.

sudo http_proxy=$http_proxy wget "http://stackoverflow.com" 
+0

Tôi đã thử nghiệm câu trả lời này cho một 'gói' dưới một số myPath được thêm vào' PATH' trong tệp '.bashrc' (với câu lệnh' export'). Sau đó 'sudo PATH = $ PATH mà gói' tìm câu trả lời đúng, không giống' sudo mà gói'. Tuy nhiên, 'sudo PATH = $ PATH gói' không đi xa hơn' sudo package' (không tìm thấy tập tin). Mặt khác, khởi chạy một 'gói' đơn giản từ một trình bao được gọi với' sudo bash' duy trì đường dẫn mở rộng và cung cấp cho quyền 'sudo' gói (hai chim bồ câu với một viên đá). Vì vậy, phản ứng thực sự phụ thuộc vào các lệnh bạn đang khởi chạy – XavierStuvw

+1

Độ phân giải PATH cho sudo là một vấn đề khác - nếu có ai tìm thấy bài đăng này để tìm kiếm vấn đề đó, tôi khuyên bạn nên xem http://unix.stackexchange.com/questions/83191/how-to -make-sudo-preserve-path – jpj

Các vấn đề liên quan