lệnh không tìm thấy khi sử dụng sudo


52

Có một vài câu hỏi trên trang web có vẻ liên quan đến vấn đề của tôi nhưng tôi không thể tìm thấy giải pháp trong bất kỳ câu hỏi nào.

Hệ điều hành của tôi là Ubuntu 12.04. Tôi đã mvncài đặt /tools/noarch/apache-maven-3.1.1và tôi đã thêm các dòng sau vào cuối /etc/profile:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

Sau đó tôi thi hành source /etc/profile.

Bây giờ vấn đề của tôi là: khi tôi chạy mvn --versionlệnh thành công và mvnthực thi được tìm thấy, trong khi nếu tôi thực thi: sudo mvn --versiontôi nhận được đầu ra : sudo: mvn: command not found. Tôi biết điều đó PATHcó thể khác khi tôi thực hiện một lệnh với sudovà đó là lý do tại sao tôi đã thử điều này:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

Một điều khác tôi đã cố gắng là thực hiện sudo su -và sau đó gõ mvn --version. Trong trường hợp mvnnày được tìm thấy thành công và lệnh thành công. Chuyện gì đang xảy ra ở đây?


Câu trả lời:


37

$PATH được đánh giá bởi vỏ của bạn, vì vậy séc của bạn không hoạt động như bạn mong đợi.

/etc/sudoersđược cấu hình để thay thế của bạn PATHvới một mặc định.

sudokhông tải môi trường shell đăng nhập trước khi thực hiện lệnh, do đó, mặc định PATHtừ /etc/sudoersđược sử dụng. su -không mở một vỏ đăng nhập, liên quan đến tải /etc/profile. Xem man bash, phần HÓA ĐƠN .

Chỉ cần loại bỏ PATHthiết lập lại trong /etc/sudoers. Đó có thể là một quy tắc được gọi là secure_path.


CentOS

Trong CentOS, bạn có thể thêm PATHvào Defaults env_keepphần:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"

Cảm ơn bạn đã trả lời. Nó không giải quyết được vấn đề, nhưng tôi thích đề xuất giải pháp trong hai câu trả lời khác vì nó chỉ thực hiện thay đổi cho maven, không phải cho tất cả các lệnh trong PATH của tôi.
izomorius

FYI: Xin lưu ý cập nhật câu trả lời của tôi.
kriegaex

Làm thế nào để sudo thực thi nhị phân trong thư mục hiện tại sudo: ./<some_binary>: command not found. Tôi đang sử dụng Arch Linux.
Necktwi

47

Cung cấp sudohiện tại của bạn PATHvới:

sudo env "PATH=$PATH" your_command

Một câu trả lời tuyệt vời, không yêu cầu sửa đổi bất kỳ cài đặt nào, cho phép người gọi thực hiện mọi thứ cần thiết. Tôi sẽ sử dụng -Etùy chọn ngoài ra, để bảo vệ phần còn lại của môi trường. Trong thực tế, điều này rất tiện dụng, nó có thể được đặt trong một tập lệnh / bí danh / chức năng để dễ sử dụng. Tôi sẽ thêm câu hỏi này dưới dạng câu trả lời riêng - nhưng danh tiếng cho @opyate!
Tom

Khi tôi cố gắng chạy lệnh này, tôi nhận được env: cmd: No such file or directory- Có ý tưởng nào tại sao lại như vậy không?
Andy

2
@Andy thay thế cmd bằng lệnh thực tế của bạn.
opyate

Làm thế nào để sudo thực thi nhị phân trong thư mục hiện tại sudo: ./<some_binary>: command not found. Tôi đang sử dụng Arch Linux.
Necktwi

12

Xây dựng câu trả lời của @ opyate, tôi đang sử dụng tập lệnh shell sau đây (có thể được đặt tên mysudochẳng hạn):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Enói sudođể bảo vệ môi trường.
  • env "PATH=$PATH"được mở rộng ra bên ngoài sudocuộc gọi, làm cho bên ngoài cũng PATHcó sẵn bên trong sudo(điều này là bắt buộc ngoài -Eviệc PATHthường được điều trị đặc biệt ngoài điều trị mà toàn bộ môi trường nhận được).
  • "$@"vượt qua các đối số mà kịch bản của chúng tôi nhận được cho sudodòng.

Lưu tập lệnh trong một tập tin trong một thư mục trong PATH, cho +xphép nó , et voilà.


Đây là một giải pháp tốt hơn nhiều cho những người không muốn chỉnh sửa bất kỳ tệp hiện có.
qaisjp

4

Vì các câu trả lời hiện tại hơi mơ hồ, nên cài đặt cụ thể trong /etc/sudoersviệc thay đổi đường dẫn của bạn là secure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Bạn có thể sửa đổi nó bằng sudo visudohoặc tốt hơn là thêm các thư mục bạn cần:

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

2

Tôi gặp vấn đề tương tự khi lần đầu tiên cài đặt Maven . Vấn đề đã được giải quyết sau khi tôi thêm hai dòng,

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

đến bốn tệp:

/root/.bashrc
/root/.profile

và cho người dùng hiện tại ( mehranlà tên người dùng Ubuntu của tôi):

/home/mehran/.bashrc
/home/mehran/.profile

1

Bạn phải sửa đổi biến PATH của root chính xác như bạn đã làm cho chính mình, tức là bằng cách thêm hai dòng đó trong hồ sơ của sudo, được đặt trong /root/.bashrc, sau đó lấy nguồn đó.


1
Tôi đã chỉnh sửa /root/.bashrc nhưng không thể tìm nguồn đó: sudo source /root/.bashrcđược: sudo: source: command not foundvà không có sự sudocho phép tôi bị từ chối (như mong đợi). Tôi tin rằng bắt đầu một thiết bị đầu cuối mới về lý thuyết sẽ làm giống như nguồn, nhưng sau khi bắt đầu một thiết bị đầu cuối mới, sudo mvn --versionvẫn không tìm thấy gì.
izomorphius

@izomorphius Bạn không thể sudo nguồn. Trước tiên, bạn phải chuyển sang sudo bằng lệnh sudo su , sau đó bạn có thể nguồn tệp được đề cập. Không có cách nào khác để làm điều đó.
MariusMatutiae
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.