走ろうとすると./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