it-swarm.com.de

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

Wenn ich versuche, ./script.sh Ich habe Permission denied aber wenn ich laufe bash script.sh alles ist gut.

Was habe ich falsch gemacht?

49
Piotr Stapp

Falsche POSIX-Berechtigungen

Dies bedeutet, dass das Ausführungsberechtigungsbit für script.sh Nicht gesetzt ist. Wenn Sie bash script.sh Ausführen, benötigen Sie nur die Leseberechtigung für script.sh. Weitere Informationen finden Sie unter Was ist der Unterschied zwischen dem Ausführen von "bash script.sh" und "./script.sh"? ?.

Sie können dies überprüfen, indem Sie ls -l script.sh Ausführen.

Möglicherweise müssen Sie nicht einmal einen neuen Bash-Prozess starten. In vielen Fällen können Sie einfach source script.sh Oder . script.sh Ausführen, um die Skriptbefehle in Ihrer aktuellen interaktiven Shell auszuführen. Sie möchten wahrscheinlich einen neuen Bash-Prozess starten, wenn das Skript das aktuelle Verzeichnis ändert oder die Umgebung des aktuellen Prozesses auf andere Weise ändert.

Zugriffssteuerungslisten

Wenn die POSIX-Berechtigungsbits richtig 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. Z.B. Die POSIX-Berechtigungen geben an, 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:

$ ./t.sh
bash: ./t.sh: Permission denied

Der Befehl getfacl zeigt den Grund dafür:

$ 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 ist meine primäre Gruppe domain users, Der Ausführungsberechtigungen entzogen wurden, indem die ACL mit Sudo setfacl -m 'g:domain\040users:rw-' t.sh Eingeschränkt wurde. 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 mit Noexec-Option gemountet

Der Grund dafür, dass das Skript in diesem speziellen Fall nicht ausgeführt werden kann, ist, dass das Dateisystem, auf dem sich das Skript befindet, mit der Option noexec bereitgestellt wurde. Diese Option überschreibt POSIX-Berechtigungen, um zu verhindern, dass Dateien auf diesem Dateisystem ausgeführt werden.

Dies kann überprüft werden, indem mount ausgeführt wird, um alle bereitgestellten Dateisysteme aufzulisten. Die Mount-Optionen sind in Klammern in dem Eintrag aufgeführt, der dem Dateisystem entspricht, 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 hier /tmp Als Beispiel verwendet, da es gute Sicherheitsgründe gibt, /tmp Mit dem noexec,nodev,nosuid Reihe von Optionen.

52

Versuchen

chmod +rx script.sh

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

./script.sh

Hoffe das wird funktionieren.

35
ranga.sl

Auf meinem win7 mit admin läuft cmd; Ich habe .sh-Dateien mit cygwin64/bin/bash verknüpft, aber es wurde von cmd blockiert. Keiner der oben genannten Vorschläge hat geholfen (chmod, setfacl, mount).

Die unten stehende Lösung hat funktioniert. Es handelt sich um einen Administrator-Vorschlaghammer-ACL-Fixer, wenn Ordner/Dateien unter Win7 für den Administrator nicht mehr 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
1
mosh