답변:
권한이 거부되었습니다
스크립트를 실행하려면 파일 에 실행 권한 비트가 설정되어 있어야합니다 .
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
사용자의 같은?
지금까지 본 다른 솔루션은 일부 시스템 정의를 기반으로하지만 실제로는 올바르게 호출 sudo
하여 현재 PATH
( env
명령 사용) 및 / 또는 나머지 환경 ( -E
옵션 사용)을 사용할 수 있습니다. :
sudo -E env "PATH=$PATH" <command> [arguments]
실제로 별명을 만들 수 있습니다.
alias mysudo='sudo -E env "PATH=$PATH"'
( sudo
원본을 대체하여 별명 자체의 이름을 지정할 수도 있습니다 sudo
.)
command not found
Ubuntu 배포판에서 직면 한 문제에 대한 정확하고 가장 표준화 된 솔루션이라고 생각합니다 . 고마워요
./bashrc
세션 사이에 저장하기 위해 별칭을 추가 할 수 있습니다.
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
파일 경로를 명시 적으로 지정하더라도 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를 추가 할 때 명시 적이어야합니다.
위의 가이드에 문제가있는 경우 chmod u+x foo.sh
대신 시도하십시오 chmod +x foo.sh
. 다른 솔루션으로는 효과가 없었습니다.