Wenn ich versuche zu rennen, habe ./script.shich, Permission deniedaber wenn ich bash script.shrenne, ist alles in Ordnung.
Was habe ich falsch gemacht?
Wenn ich versuche zu rennen, habe ./script.shich, Permission deniedaber wenn ich bash script.shrenne, 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.shbenö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.shoder . script.shausfü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 getfaclBefehl 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 usersder 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 noexecOption bereitgestellt wurde. Diese Option überschreibt POSIX-Berechtigungen, um zu verhindern, dass Dateien auf diesem Dateisystem ausgeführt werden.
Dies kann durch Ausführen mountvon ü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 /tmphier als Beispiel , da es gut aus Sicherheitsgründen für Haltung /tmpmit montiertem noexec,nodev,nosuidReihe 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?