bloginista
Massimiliano Siddi
Home
  • Blog

Befehle in einer Subshell ausführen

11. November 2011 00:09 von madmax

Jeder, der einmal sudo in bash benutzt hat, kennt gewisse Einschränkungen. Befehle wie cd oder Streams mit > in Dateien umleiten funktioniert nicht. Das liegt daran, dass es sich um Befehle handelt, die in bash eingebaut sind. Mit einem einfachen Trick lassen sich diese Probleme allerdings umgehen: Subshells.

In der Regel führt man als nicht privilegierter Nutzer bestimmte Befehle auf Dateien und Verzeichnisse mittels sudo aus, sozusagen im Namen eines Nutzers, der die entsprechenden Zugriffsrechte besitzt. Beispiel:

sudo -u www-data mkdir /var/www/<Verzeichnis-Im-Webroot>

Das geht aber nicht:

sudo -u www-data cat /var/www/vhosts/<geheime-datei-ohne-leserechte>*.xml > /tmp/example.txt

Es kommt dann beispielsweise die Fehlermeldung, dass die Datei <geheime-datei-ohne-leserechte>*.xml nicht gefunden werden kann, da das * nicht aufgelöst wird.

Man kann das Problem umgehen, indem man eine so genannte Subshell aufmacht:

sudo -u www-data sh -c "cat /var/www/vhosts<geheime-datei-ohne-leserechte>*.xml > /tmp/example.txt"

Mit sh wird eine Subshell geöffnet. Eine Subshell ist eine Shell-Instanz, die der aktuellen Instanz untergeordnet ist (child process). Mit dem Parameter -c gebe ich an, dass ich den folgenden Befehl, der in Anführungszeichen gesetzt ist, in der Subshell ausführen möchte.

Da die Befehle in einer separaten Instanz ausgeführt werden, funktionieren alle Funktionen inklusive der genannten Wildcards so, als würden sie durch den im sudo genannten User ausgeführt werden. Die Einschränkungen von sudo kommen dabei also nicht in die Quere.

Posted in Unix, Linux

Keine Kommentare


(Kommentarbereich geschlossen)

← Ältere Einträge