[linux] sudo를 사용할 때 명령을 찾을 수 없습니다

foo.sh내 홈 폴더에 스크립트가 있습니다 .

이 폴더로 이동하여를 입력 ./foo.sh하면

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

사용 sudo ./foo.sh하면

sudo: foo.sh: command not found.

왜 이런 일이 발생하며 어떻게 해결할 수 있습니까?



답변

권한이 거부되었습니다

스크립트를 실행하려면 파일 에 실행 권한 비트가 설정되어 있어야합니다 .

Linux 파일 권한 을 완전히 이해하기 위해 chmod명령에 대한 문서를 연구 할 수 있습니다 . change mode 의 약어 인 chmod 는 파일의 권한 설정을 변경하는 데 사용되는 명령입니다.

로컬 시스템에 대한 chmod 문서를 읽으려면 man chmod또는 info chmod명령 행에서 실행 하십시오. 일단 읽고 이해하면 실행 결과를 이해할 수 있어야합니다 …

ls -l foo.sh

… 파일 소유자, 그룹 소유자 및 파일 소유자가 아닌 파일 소유자 또는 파일이 속한 그룹의 구성원에 대한 READ, WRITE 및 EXECUTE 권한을 나열합니다 (마지막 권한 그룹은 때때로 참조 됨). “세계”또는 “기타”로)

다음 은 귀하의 경우에 권한 거부 오류 문제를 해결하는 방법에 대한 요약입니다 .

$ 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 

소유자가 읽기 및 쓰기 권한 rw를 가지고 있지만-는 실행 권한이 없음을 나타냅니다.

chmod명령 수정있다. (그룹 및 기타는 파일에 대해 읽기 권한이 설정되어 있으므로 파일에 쓰거나 실행할 수 없습니다)

$ 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는 이제 Linux와 관련하여 실행 가능합니다.

명령을 찾을 수없는 sudo 결과 사용

sudo 를 사용하여 명령을 실행하면 효과적으로 수퍼 유저 또는 루트로 실행됩니다.

루트 사용자가 명령을 찾지 못하는 이유는 root에 대한 PATH환경 변수에 찾은 디렉토리가foo.sh 포함되어 있지 않기 때문 입니다 . 따라서 명령을 찾을 수 없습니다.

PATH 환경 변수에는 명령을 검색하는 디렉토리 목록이 포함되어 있습니다. 각 사용자는 필요에 따라 고유 한 PATH 변수를 설정합니다. 실행 설정을 확인하려면

env | grep ^PATH

다음은 위 env명령을 먼저 일반 사용자로 실행 한 다음 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

비슷하지만이 경우 PATH에 포함 된 권한이없는 사용자 (rkielty)와 수퍼 유저는 동일하지 않습니다 .

foo.sh상주 하는 디렉토리가 루트 사용자의 PATH 변수에 없으므로 명령을 찾을 수 없습니다.


답변

지금까지 본 다른 솔루션은 일부 시스템 정의를 기반으로하지만 실제로는 올바르게 호출 sudo하여 현재 PATH( env명령 사용) 및 / 또는 나머지 환경 ( -E옵션 사용)을 사용할 수 있습니다. :

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

실제로 별명을 만들 수 있습니다.

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

( sudo원본을 대체하여 별명 자체의 이름을 지정할 수도 있습니다 sudo.)


답변

sudo 에서 secure_path 를 확인하십시오.

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

$PATH재정의되는 경우 사용 visudo및 편집/etc/sudoers

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


답변

  1. 스크립트에 대한 실행 권한이 있는지 확인하십시오. 즉chmod +x foo.sh
  2. 해당 스크립트의 첫 줄이 그런지 확인하십시오 #!/bin/sh.
  3. sudo의 경우 잘못된 디렉토리에 있습니다. 확인하다sudo pwd

답변

또한 /usr/local/bin수퍼 유저 PATH 의 디렉토리 중 하나에서 스크립트에 대한 소프트 링크를 작성할 수도 있습니다 . 그런 다음 sudo에서 사용할 수 있습니다.

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

소프트 링크를 넣을 디렉토리를 알기 위해이 답변 을 살펴보십시오 .


답변

파일 경로를 명시 적으로 지정하더라도 Linux에서 “명령을 찾을 수 없음”이라고 표시하는 것 같습니다.

[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

다소 오해의 소지가 있지만 기술적으로 정확할 수 있습니다. 파일은 실행 파일까지 명령이 아니므로 찾을 수 없습니다.


답변

좋아, 이것은 내 해결책이다 : ~ / .bash_aliases에서 다음을 추가하십시오.

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

짜잔! 이제 항상 PATH = $ PATH : / home / your_user / bin 내보내기를 수행하지 않고도 sudo를 사용하여 자체 스크립트를 실행하거나 ROOT로 설정할 수 있습니다.

수퍼 유저 용 HOME이 / root이므로 PATH를 추가 할 때 명시 적이어야합니다.