Làm thế nào để thêm / sửa đổi PATH cho sudo?


0

Tôi đã cài đặt hai phiên bản Python.

  • Python 2.7,14 trong /usr/local/bin
  • Python 2.7.5 trong /usr/bin.

Khi tôi gõ # python, nó sử dụng phiên bản 2.7.14 nhưng khi tôi gõ sudo python, nó sử dụng phiên bản 2.7.5. Làm thế nào tôi có thể làm sudo python trỏ đến phiên bản 2.7.14?

Trong đầu ra của sudo env | grep PATH, /usr/local/bin xuất hiện trước /usr/bin nhưng nó vẫn đang nhặt Python từ /usr/bin.

PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Khi tôi gõ sudo su để vào vỏ gốc, nó cho tôi python 2.7.14 nhưng trong cùng một phiên nếu tôi gõ sudo python, nó đưa cho tôi python 2.7.5.

Tôi đã đi qua câu hỏi này nhưng câu trả lời được chấp nhận không trả lời làm thế nào để đảm bảo sudo sử dụng đúng đường dẫn.

Đây là cách đường dẫn an toàn trông như thế nào:

secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

1
Sản lượng của sudo type python? (Tôi nghi ngờ rằng bạn có bí danh python đến một cái gì đó khác, hoặc tạo ra một chức năng ở đâu đó.)
Franklin Yu

@Franklin không hoạt động với tôi. Nói sudo: type: command not found . Tôi đã tạo một bí danh nhưng tôi đã xóa nó vì nó không hoạt động cho sudo
Manoj

Được rồi, thế còn sudo bash -c 'type python'?
Franklin Yu

@Franklin nó xuất ra python is /bin/python
Manoj

Bạn đang sử dụng hệ điều hành nào? Là Bash vỏ đăng nhập cho root, hoặc một số shell khác?
Franklin Yu

Câu trả lời:


0

Đây chắc chắn là một sudoGNU/Linux câu hỏi, không thực sự là một Python câu hỏi Khi bạn chạy sudo foo arg1 arg2 đầu tiên hệ thống kích hoạt một shell (bộ được đặt cho root chứ không phải bạn) đang chạy như root và sau đó "chạy" foo arg1 arg2. Nó không chính xác giống như đăng nhập vào một root và gõ foo arg1 arg2 trên dòng lệnh, nhưng đóng. Có những tệp thực thi sẽ không cho phép người dùng sudo-ed chạy hoặc thực hiện một số điều và một số biến môi trường bổ sung được đặt cho bạn mà bạn có thể thấy nếu bạn chạy sudo env. Bạn sẽ thấy một cái gì đó như:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PS1=%%
PS2=cont>
MAIL=/var/mail/root
LOGNAME=root
USER=root
USERNAME=root
HOME=/root
SHELL=/bin/bash
SUDO_COMMAND=/usr/bin/env
SUDO_USER=my_user
SUDO_USER=spt
SUDO_UID=1000
SUDO_GID=1000
SUDO_COMMAND=/usr/bin/env

Và nếu shell bị bash, subshell có thể đã đọc trong nội dung của /root/.bashrc nếu nó tồn tại. Ngoài ra, my_user bash shell sẽ thực hiện mở rộng bí danh cho mục đầu tiên (nghĩa là, sudo trong sudo foo arg1 arg2 ) và không phải thứ hai ( foo ). Vì vậy nếu foo cũng là một bí danh, nó sẽ không được mở rộng và do đó, lớp con chạy như root sẽ cố gắng chạy foo như một nghĩa đen, và không foo như bí danh bạn đã tạo my_user. Có một vài cách để "khắc phục" vấn đề của bạn. Người ta định nghĩa một bí danh cho sudo với một không gian dấu:

alias='sudo '

Như đã giải thích đây , điều này sẽ gây ra những gì xảy ra sau sodo cũng được mở rộng bí danh trước gửi nó đến subshell để chạy.

Một tùy chọn khác là chỉnh sửa /root/.bashrc hoặc tệp tương đương và thực hiện một trong nhiều điều sau:

  1. Chuẩn bị vị trí của con trăn mong muốn $PATH biến bằng cách sử dụng một cái gì đó như export PATH=/path/to/foo:$PATH
  2. Xác định bí danh bạn muốn nó ở đó

Hoặc, bạn có thể làm điều gì đó (nhẹ nhàng) mạo hiểm và lười biếng nhưng hiệu quả cao và chỉ cần chạy sudo (cd /root && ln -s /home/my_user/.bashrc)root sẽ luôn luôn chỉ nguồn của bạn my_user/.bashrc tập tin.

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.