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


145

Tôi có một kịch bản gọi là foo.sh trong thư mục nhà của tôi.

Khi tôi điều hướng đến thư mục này và nhập ./foo.sh, tôi nhận được

-bash: ./foo.sh: Permission denied.

Khi tôi sử dụng sudo ./foo.sh, tôi nhận được

sudo: foo.sh: command not found.

Tại sao điều này xảy ra và làm thế nào tôi có thể sửa chữa nó?

Câu trả lời:


151

Quyền bị từ chối

Để chạy tập lệnh, tập tin phải có tập quyền bit thực thi .

Để hiểu đầy đủ các quyền của tệp Linux, bạn có thể nghiên cứu tài liệu cho chmodlệnh. chmod , viết tắt của chế độ thay đổi , là lệnh được sử dụng để thay đổi cài đặt quyền của tệp.

Để đọc tài liệu chmod cho hệ thống cục bộ của bạn, hãy chạy man chmodhoặc info chmodtừ dòng lệnh. Sau khi đọc và hiểu, bạn sẽ có thể hiểu đầu ra của việc chạy ...

ls -l foo.sh

... sẽ liệt kê các quyền READ, WRITE và EXECUTE cho chủ sở hữu tệp, chủ sở hữu nhóm và những người khác không phải là chủ sở hữu tệp hoặc thành viên của nhóm mà tệp thuộc về (nhóm quyền cuối cùng đôi khi được đề cập đến là "thế giới" hoặc "khác")

Dưới đây là tóm tắt về cách khắc phục lỗi Lỗi từ chối cấp phép trong trường hợp của bạn.

$ ls -l foo.sh                    # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh 
    ^^^ 
 ^^^ | ^^^   ^^^^^^^ ^^^^^
  |  |  |       |       | 
Owner| World    |       |
     |          |    Name of
   Group        |     Group
             Name of 
              Owner 

Chủ sở hữu đã đọc và ghi quyền truy cập rw nhưng - chỉ ra rằng quyền thực thi bị thiếu

Các chmodsửa lệnh đó. (Nhóm và những người khác chỉ có quyền đọc được thiết lập trên tệp, họ không thể ghi vào tệp hoặc thực thi nó)

$ chmod +x foo.sh               # The owner can set the executable permission on foo.sh
$ ls -l foo.sh                  # Now we see an x after the rw 
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
   ^  ^  ^

foo.sh hiện có thể thực thi được khi có liên quan đến Linux.

Sử dụng kết quả sudo trong Lệnh không tìm thấy

Khi bạn chạy một lệnh bằng sudo bạn đang chạy nó một cách hiệu quả như là siêu người dùng hoặc root.

Lý do người dùng root không tìm thấy lệnh của bạn có khả năng là PATHbiến môi trường cho root không bao gồm thư mục foo.shnằm ở đâu . Do đó lệnh không được tìm thấy.

Biến môi trường PATH chứa danh sách các thư mục được tìm kiếm các lệnh. Mỗi người dùng đặt biến PATH của riêng họ theo nhu cầu của họ. Để xem những gì nó được thiết lập để chạy

env | grep ^PATH

Đây là một số đầu ra mẫu của việc chạy envlệnh trên trước tiên với tư cách là người dùng thông thường và sau đó là người dùng root sử dụng sudo

rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty: 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Lưu ý rằng, mặc dù tương tự nhau, trong trường hợp này, các thư mục chứa trong PATH, người dùng không có đặc quyền (rki ERIC) và siêu người dùng không giống nhau .

Thư mục nơi foo.shcư trú không có trong biến PATH của người dùng root, do đó lệnh không tìm thấy lỗi.


1
@Nakilon nếu bạn đặt câu hỏi đó với đầy đủ thông tin chi tiết tôi sẽ có thể khắc phục sự cố cho bạn thêm. Vấn đề có thể là shell nào (shell lệnh đầu tiên của bạn hoặc shell được khởi chạy bởi sudo) đã đánh giá $ PWD
Rob Ki ERIC

6
@ Rob: vì vậy làm thế nào để làm cho sudoPATHgiống như người sử dụng không?
Tom

1
@Rob: Tôi đã tìm thấy một cách trong khi chờ đợi (xem câu trả lời của tôi dưới đây).
Tom

1
Tôi thích cách bạn giải thích! Cảm ơn :)
Kasparov92

1
@Tom bạn có thể thay đổi Secure_path trong / etc / sudoers
DennisLi

97

Các giải pháp khác mà tôi thấy ở đây cho đến nay dựa trên một số định nghĩa hệ thống, nhưng thực tế có thể sudosử dụng dòng điện PATH(với envlệnh) và / hoặc phần còn lại của môi trường (với -Etùy chọn) chỉ bằng cách gọi nó đúng :

sudo -E env "PATH=$PATH" <command> [arguments]

Trong thực tế, người ta có thể tạo ra một bí danh từ nó:

alias mysudo='sudo -E env "PATH=$PATH"'

(Cũng có thể đặt tên cho bí danh sudo, thay thế cho bản gốc sudo.)


3
Tôi thích giải pháp này, Tom, bởi vì bạn đang có ý thức làm việc với một lời mời sudo khác. Điều quan trọng là phải chú ý đến biến PATH được sử dụng ở mọi thời điểm bằng mọi cách (và có rất nhiều) nó được thiết lập.
Rob Ki ERIC

4
Tôi tin rằng đây là giải pháp chính xác và chuẩn hóa nhất cho sự cố command not foundgặp phải trong bản phân phối Ubuntu. Cảm ơn người đàn ông.
Omar Tariq

bạn có thể thêm bí danh vào ./bashrcđể lưu nó giữa các phiên
George

18

Kiểm tra safe_path trên sudo

[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

Nếu $PATHđang bị ghi đè sử dụng visudovà chỉnh sửa/etc/sudoers

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

Cảm ơn! Điều đó đã giúp giải quyết một bí ẩn về sudo không thể chạy các lệnh.
Evgeny Goldin

7
  1. Kiểm tra xem bạn có thực thi quyền trên tập lệnh không. I Echmod +x foo.sh
  2. Kiểm tra xem dòng đầu tiên của tập lệnh đó là #!/bin/shhoặc một số như vậy.
  3. Đối với sudo bạn đang ở trong thư mục sai. kiểm tra vớisudo pwd

5

Bạn cũng có thể tạo một liên kết mềm đến tập lệnh của mình trong một trong các thư mục ( /usr/local/binví dụ) trong siêu người dùng PATH. Sau đó nó sẽ có sẵn cho sudo.

chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo

Có một cái nhìn vào câu trả lời này để có một ý tưởng về thư mục nào để đặt liên kết mềm vào.


2

Có vẻ như linux sẽ nói "lệnh không tìm thấy" ngay cả khi bạn đưa ra đường dẫn đến tệp một cách rõ ràng.

[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0

Đó là một lỗi sai, tuy nhiên về mặt kỹ thuật có thể đúng. Một tập tin không phải là một lệnh cho đến khi nó có thể thực thi được và do đó không thể tìm thấy.


1

Ok đây là giải pháp của tôi: trong ~ / .bash_aliases chỉ cần thêm vào như sau:

# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
   export PATH=$PATH:/home/your_user/bin 
fi

Voila! Bây giờ bạn có thể thực thi các tập lệnh của riêng mình bằng sudo hoặc được đặt là ROOT mà không phải thực hiện xuất PATH = $ PATH: / home / your_user / bin mọi lúc.

Lưu ý rằng tôi cần phải rõ ràng khi thêm PATH của mình vì HOME cho siêu người dùng là / root


1

Hãy thử chmod u+x foo.shthay vì chmod +x foo.shnếu bạn gặp rắc rối với các hướng dẫn ở trên. Điều này làm việc cho tôi khi các giải pháp khác không.


1

Có câu trả lời tuyệt vời ở trên. Nếu, sau khi thử chúng, bạn vẫn nhận được command not foundthử lại với toàn bộ đường dẫn tệp:

sudo /home/user/path/to/foo.sh
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.