Wenn ich versuche zu rennen, habe ./script.sh
ich, Permission denied
aber wenn ich bash script.sh
renne, ist alles in Ordnung.
Was habe ich falsch gemacht?
Wenn ich versuche zu rennen, habe ./script.sh
ich, Permission denied
aber wenn ich bash script.sh
renne, ist alles in Ordnung.
Was habe ich falsch gemacht?
Antworten:
Dies bedeutet, dass Sie nicht über das gesetzte Ausführungsberechtigungsbit verfügen script.sh
. Beim Laufen bash script.sh
benötigen Sie nur Leserechte für script.sh
. Siehe Was ist der Unterschied zwischen dem Ausführen von "bash script.sh" und "./script.sh"? Für mehr Information.
Sie können dies überprüfen, indem Sie ausführen ls -l script.sh
.
Möglicherweise müssen Sie nicht einmal einen neuen Bash-Prozess starten. In vielen Fällen können Sie die Skriptbefehle einfach in Ihrer aktuellen interaktiven Shell ausführen source script.sh
oder . script.sh
ausführen. Sie möchten wahrscheinlich einen neuen Bash-Prozess starten, wenn das Skript das aktuelle Verzeichnis ändert oder auf andere Weise die Umgebung des aktuellen Prozesses ändert.
Wenn die POSIX-Berechtigungsbits korrekt gesetzt sind, wurde die Zugriffssteuerungsliste (Access Control List, ACL) möglicherweise so konfiguriert, dass Sie oder Ihre Gruppe die Datei nicht ausführen können. Beispielsweise würden die POSIX-Berechtigungen anzeigen, dass das Test-Shell-Skript ausführbar ist.
$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh
Der Versuch, die Datei auszuführen, führt jedoch zu folgenden Ergebnissen:
$ ./t.sh
bash: ./t.sh: Permission denied
Der getfacl
Befehl zeigt den Grund warum:
$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx
In diesem Fall handelt es sich bei meiner primären Gruppe um eine Gruppe, domain users
der Ausführungsberechtigungen entzogen wurden, indem die ACL mit eingeschränkt wurde sudo setfacl -m 'g:domain\040users:rw-' t.sh
. Diese Einschränkung kann durch einen der folgenden Befehle aufgehoben werden:
sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh
Sehen:
In diesem speziellen Fall kann das Skript nicht ausgeführt werden, da das Dateisystem, auf dem sich das Skript befindet, mit der noexec
Option bereitgestellt wurde. Diese Option überschreibt POSIX-Berechtigungen, um zu verhindern, dass Dateien auf diesem Dateisystem ausgeführt werden.
Dies kann durch Ausführen mount
von überprüft werden, um alle bereitgestellten Dateisysteme aufzulisten. Die Mount-Optionen sind in Klammern in dem dem Dateisystem entsprechenden Eintrag aufgeführt, z
/dev/sda3 on /tmp type ext3 (rw,noexec)
Sie können das Skript entweder in ein anderes bereitgestelltes Dateisystem verschieben oder das Dateisystem erneut bereitstellen, um die Ausführung zu ermöglichen:
sudo mount -o remount,exec /dev/sda3 /tmp
Hinweis: Ich habe verwendet /tmp
hier als Beispiel , da es gut aus Sicherheitsgründen für Haltung /tmp
mit montiertem noexec,nodev,nosuid
Reihe von Optionen.
Versuchen
chmod 755 script.sh
Dadurch wird die Datei ausführbar. Dann versuche es,
./script.sh
Hoffe das wird funktionieren.
Auf meinem win7 mit Admin läuft cmd; Ich habe .sh-Dateien im Zusammenhang mit cygwin64 / bin / bash, aber es wurde von cmd blockiert. Keiner der obigen Vorschläge hat geholfen (chmod, setfacl, mount).
Die folgende Lösung hat funktioniert, es ist ein Admin-Sledge-Hammer-Acl-Fixer, wenn Ordner / Dateien auf win7 nicht mehr für Administratoren zugänglich sind (was häufig der Fall ist):
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
?