달리려고 하면 ./script.sh
알겠지만 Permission denied
달리면 bash script.sh
모든 것이 괜찮습니다.
내가 뭘 잘못했나요?
답변1
POSIX 권한이 잘못되었습니다.
이는 실행 권한 비트가 설정되어 있지 않음을 의미합니다 script.sh
. 실행 시에는 bash script.sh
읽기 권한만 필요합니다 script.sh
. 바라보다"bash script.sh"와 "./script.sh" 실행의 차이점은 무엇입니까?더 많은 정보를 알고 싶습니다.
를 실행하여 이를 확인할 수 있습니다 ls -l script.sh
.
새로운 Bash 프로세스를 시작할 필요조차 없을 수도 있습니다. 대부분의 경우 현재 대화형 셸 내에서 스크립트 명령을 간단히 실행 source script.sh
하거나 실행할 수 있습니다 . script.sh
. 스크립트가 현재 디렉터리를 변경하거나 현재 프로세스의 환경을 수정하는 경우 새 Bash 프로세스를 시작할 수 있습니다.
액세스 제어 목록
POSIX 권한 비트가 올바르게 설정된 경우 ACL(액세스 제어 목록)은 귀하 또는 귀하의 그룹이 파일을 실행하지 못하도록 구성될 수 있습니다. 예를 들어 POSIX 권한은 테스트 셸 스크립트가 실행 가능함을 나타냅니다.
$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh
그러나 파일을 실행하려고 하면 다음과 같은 결과가 발생합니다.
$ ./t.sh
bash: ./t.sh: Permission denied
이 getfacl
명령은 이유를 보여줍니다.
$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx
이 경우 내 기본 그룹은 domain users
제한적인 ACL을 사용하여 실행 권한을 취소하는 그룹 입니다 sudo setfacl -m 'g:domain\040users:rw-' t.sh
. 이 제한은 다음 명령 중 하나를 사용하여 해제할 수 있습니다.
sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh
바라보다:
noexec 옵션으로 마운트된 파일 시스템
마지막으로, 이 특정한 경우에 스크립트를 실행할 수 없는 이유는 스크립트가 있는 파일 시스템이 noexec
이 옵션으로 마운트되어 있기 때문입니다. 이 옵션은 POSIX 권한을 재정의하여 이 파일 시스템에서 파일이 실행되지 않도록 합니다.
이는 mount
마운트된 모든 파일 시스템 나열을 실행하여 확인할 수 있습니다. 마운트 옵션은 파일 시스템에 해당하는 항목과 함께 괄호 안에 나열됩니다.
/dev/sda3 on /tmp type ext3 (rw,noexec)
스크립트를 마운트된 다른 파일 시스템으로 이동하거나 파일 시스템을 다시 마운트하여 실행을 허용할 수 있습니다.
sudo mount -o remount,exec /dev/sda3 /tmp
참고: /tmp
여기에서는 이것을 예로 사용하고 있습니다.좋은 보안상의 이유/tmp
설치된 상태를 유지하는 옵션 세트입니다 noexec,nodev,nosuid
.
답변2
노력하다chmod +rx script.sh
, 이는 사용자, 그룹 및 기타 사용자에게 읽기 및 실행 권한을 부여합니다.
그런 다음 ./script.sh
.
답변3
내 win7에서는 관리자가 cmd를 실행합니다. cygwin64/bin/bash와 연결된 .sh 파일이 있지만 cmd에 의해 차단되었습니다. 위의 제안 중 어느 것도 도움이 되지 않았습니다(chmod, setfacl, mount).
아래 솔루션은 작동합니다. 이는 win7의 관리자가 폴더/파일에 액세스할 수 없을 때마다 일반적으로 발생하는 관리자 큰 망치 ACL 수정입니다.
Start > run cmd as Admin
c:\> script.sh
Access is denied.
cmd> chmod 0777 script.sh c:\cygwin64\bin\bash.exe
cmd> script.sh
Access is denied.
> assoc .sh
.sh=bash
> ftype bash
bash=C:\cygwin64\bin\bash.exe -- "%1" %*
> bash
$ FILE=c:/cygwin64/bin/bash.exe
$ FILE=${FILE////\\} # s,/,\,g
# Compare these permissions using accesschk by Mark Russinovich 2015
$ accesschk.exe -lq $FILE
$ accesschk.exe -lq c:/windows/system32/cmd.exe
# [large output not shown]
# === Solution: Change windows acl for bash ===
$ takeown /F $FILE /A > /dev/null
$ icacls $FILE /t /q /c /reset
$ icacls $FILE /t /q /c /grant :r Everyone:F
$ icacls $FILE /t /q /c /setowner Administrators
# ====
cmd> script.sh
OK .. invokes bash
답변4
Permission denied
Docker의 진입점에서 스크립트를 실행하려고 할 때 여전히 오류가 발생하는 경우 다음을 시도해 보십시오.원하지 않는다사용껍질 모양진입 지점:
대신에 다음
ENTRYPOINT ./bin/watcher
을 쓰세요 ENTRYPOINT ["./bin/watcher"]
:
https://docs.docker.com/engine/reference/builder/#entrypoint