Normalerweise muss zum Ausführen einer Datei unter Linux zuerst mit chmod das execute-flag gesetzt werden. Also z.B. chmod +x Dateiname, oder chmod 744 Dateiname. Damit wird die Datei für alle, oder nur dem Besitzer der Datei, ausführbar gemacht. Versucht man ein Skript  direkt auszuführen, für welches dieses Flag nicht gesetzt ist erhält man eine Fehlermeldung.

Möchte man ein Shellscript ausführen, für welches man das Execute-Flag aus Sicherheits- oder sonstigen Gründen nicht setzen möchte, so kann man dies tun indem das Script im Terminal mit dem Befehl sh aufgerufen wird.

sh skriptname.sh

Auf diese Weise lassen sich auch andere Skripte wie PHP oder Python Skripte im Terminal ausführen, sofern der entsprechende Interpreter installiert ist.

python skriptname.py

php skriptname.php

Dieser Text ist lizensiert unter einer Creative Commons Namensnennung 4.0 International Lizenz

4 Comments

  1. hallo,

    ich habe deinen beitrag gerade über ubuntuusers.de gesehen. aus reinem interesse: ist das nicht ein sicherheitsrisiko, wenn jederman/ jemand anders per „sh script.sh“ ein (php, perl, py…) skript ausführen lassen könnte…? wenn jener sich nur im userordner bewegen kann, währe das wohl weniger ein problem, als wenn das script per „sh script.py“ im z.b. /var/www/XXX bewegen kann und dabei evtl. unter www-run läuft… oder, habe ich hier einfach nur ein denkfehler und der nutzer muss mitglied der gruppe sh sein, damit das script ausgeführt wird..?

    wie wird hierbei die berechtigung geprüft…? das geht aus deinem beitrag leider nicht so klar hervor… vielen dank für deine aufklärung 🙂

    • Niko

      Hallo Ronny,
      das ist nichts was man direkt erlauben oder verbieten kann. Es ist halt eine Funktion der Shell.
      Allerdings sehe ich hier auch kein zusätzliches Sicherheitsrisiko, da ein Benutzer ein Skript ja immer nur mit den eigenen Rechten ausführen kann und nicht mit den Rechten von www-run ö.ä.
      Wenn ein User sich nach /var/www/XXX bewegen und dort Skriptdateien einsehen kann, dann kann er den Inhalt auch einfach nach /home/username kopieren und es mit chmod +x ausführbar machen.
      Das Ausführen wie im Beitrag beschrieben oder das Kopieren des Inhalts in ein neues Skript lässt sich nur verhindern indem man dem User die Leserechte entzieht oder den Zugriff auf bestimmte Ordner einschränkt.

    • Das Execute-Flag ist weniger eine Berechtigung des Benutzers (die er ja schließlich selbst ändern kann), sondern mehr eine an das System. Linux kann verschiedene Arten von Programmen ausführen. Eine Art sind die nativen Binaries, wie z.B. die Shells selbst. Eine andere Art sind die Skripte mit Shebang. Die Shebang ist die erste Zeile des Skript, beginnend mit „#!“, gefolgt von einem Pfad zu einem Programm. Der Linux-Kernel erkennt die Shebang, und anstatt das Programm direkt als Maschinencode auszuführen, wird das angegebene Programm gestartet und der Pfad zum Skript übergeben. Das alles erlaubt er aber nur, wenn das Execute-Flag gesetzt ist.

      Der obige Trick sollte also ergänzt werden um den Hinweis, dass man zunächst den richtigen Interpreter herausfinden muss. Ein PHP-Skript wird man nicht mit sh skript ausführen können. Welcher der richtige Interpreter ist, steht ja schließlich in der ersten Zeile, der Shebang.

      Mit Sicherheit hat das ganze nichts (oder fast nichts) zu tun. Ein Skript hat den gleichen Zugriff aufs System, egal ob es direkt mittels Shebang oder manuell mit Interpreter aufgerufen wird. Der einzige Unterschied ist: Dateien, die man aus dem Internet herunterlädt (Firefox, Chrome, wget, etc), haben zunächst das Flag nicht gesetzt.

  2. Wichtig zu erwähnen ist dabei noch, dass das Skript dann mit dem Interpreter aus dem Kommandozeile ausgeführt wird und nich mit dem Interpreter, der im Shebang angegeben ist. Das ist vor allem dann interessant, wenn man Bash-spezifische Befehle im Skript nutzt, es aber mit der sh oder der Dash ausführen will und sich dann über Fehlermeldungen wundert.