Führen Sie ./script.sh vs bash script.sh aus - Berechtigung verweigert

43

Wenn ich versuche zu rennen, habe ./script.shich, Permission deniedaber wenn ich bash script.shrenne, ist alles in Ordnung.

Was habe ich falsch gemacht?

Piotr Stapp
quelle
Können Sie die Frage so bearbeiten, dass sie den Inhalt der Shebang-Zeile und auch die Ausgabe von enthält getfacl script.sh?
Anthony G - Gerechtigkeit für Monica

Antworten:

49

Falsche POSIX-Berechtigungen

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.

Zugriffssteuerungslisten

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:

Dateisystem gemountet mit noexec Option

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.

Anthony G - Gerechtigkeit für Monica
quelle
2
Ich setze chmod 777 und habe immer noch diesen Fehler.
Piotr Stapp
2
Ich hatte keine Exec auf Partition.
Piotr Stapp
Also habe ich verdammt keinen Exec auf und es ist nicht in Fstab aufgeführt. Warum zum Teufel macht es das mit meinen Nicht-TMP-Partitionen, die ich habe?
Deryck
1
Es war diese noexec-Option in / etc / fstab.
user208145
Ich möchte hinzufügen, dass es auch ratsam ist, zu überprüfen, ob der Ordner, der das Skript enthält, "ausführbar" ist oder nicht (es hat also das X-Flag oder nicht). Ist dies nicht der Fall, kann das Skript nur vom Root-Benutzer ausgeführt werden.
Letokteren
30

Versuchen

chmod 755 script.sh

Dadurch wird die Datei ausführbar. Dann versuche es,

./script.sh

Hoffe das wird funktionieren.

ranga.sl
quelle
2
Ich komme zu U & L, ich formatiere mich gemäß der Konvention neu, aber dies fügt der vorherigen Antwort kaum etwas hinzu.
Archemar
8
Manchmal ist die kürzeste Antwort die beste :)
Sameera Kumarasingha
1

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
mosh
quelle