実行しようとする./script.sh
と、私は得たPermission denied
が、実行するとbash script.sh
すべてがうまくいく。
私は何を間違えましたか?
実行しようとする./script.sh
と、私は得たPermission denied
が、実行するとbash script.sh
すべてがうまくいく。
私は何を間違えましたか?
回答:
これは、実行許可ビットがに設定されていないことを意味します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
オプションでマウントされているためです。このオプションはPOSIX許可をオーバーライドして、そのファイルシステム上のファイルが実行されるのを防ぎます。
これを実行mount
すると、マウントされているすべてのファイルシステムを一覧表示できます。マウントオプションは、ファイルシステムに対応するエントリの括弧内にリストされています。例えば
/dev/sda3 on /tmp type ext3 (rw,noexec)
スクリプトを別のマウントされたファイルシステムに移動するか、ファイルシステムを再マウントして実行することができます。
sudo mount -o remount,exec /dev/sda3 /tmp
注:/tmp
ここでは、オプションのセットをマウントしたままにするセキュリティ上の理由があるため、ここで例を使用しました。/tmp
noexec,nodev,nosuid
試して
chmod 755 script.sh
これにより、ファイルが実行可能になります。その後、試して、
./script.sh
これがうまくいくことを願っています。
管理者がcmdを実行しているwin7で。cygwin64 / bin / bashに関連付けられた.shファイルがありますが、cmdによってブロックされました。上記の提案はいずれも役に立ちませんでした(chmod、setfacl、mount)。
以下の解決策は機能しました。win7で管理者がフォルダ/ファイルにアクセスできなくなるたびに、それはadmin sledge-hammer acl-fixerです。
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
getfacl script.sh
か?