./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 +rx script.sh
これにより、ファイルが実行可能になります。次に、
./script.sh
これがうまくいくことを願っています。
管理者がcmdを実行している私のwin7で。 cygwin64/bin/bashに関連付けられた.shファイルがありますが、cmdによってブロックされました。上記の提案はどれも役に立ちませんでした(chmod、setfacl、mount)。
以下の解決策はうまくいきました、それはwin7で管理者がフォルダ/ファイルにアクセスできなくなったときはいつでも、管理スレッジハンマー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