shell_exec() a2ensite wird nicht ausgeführt

Maniac

Erfahrenes Mitglied
Nabend,

Ich hab grad ein komisches Phänomen,ich möchte mit PHP und der Funktion "shell_exec()" den Befehl auf einem Debian-Webserver ausführen, was aber nicht klappt. Wenn ich es auf der Konsole per Hand ausführe, klappt es serwohl....

Als ausgabe erhalte ich:
Code:
Array
(
    [0] => 
    [1] => 
    [2] => sh: a2ensite: command not found
    [3] => mkdir: cannot create directory `/var/www/martina/sdasdasd': No such file or directory
    [4] => 
)

Auf das [3] bitte nicht achten, ich hab die extra mit reingenommen, damit man sieht das die Meldungen ausgegeben werden.
Braucht man für root-rechte?
 
Das kommt darauf an. Ich kenne das a2ensite nicht, aber liegt es evtl. in /sbin oder /usr/sbin? Hast du es schon mal mit dem absoluten Pfad zur ausführbaren Binary probiert?
 
Das ist ein tool um dem apachen die Virtuellen Hosts zu enablen (sites-available -> sites-enabled).
Ich habe es gerade getestet mit einem Standard-User, da funktioniert es auf der Konsole auch nicht.
Hab gelesen das es mit sudo möglich sein soll, root-rechte zu erlangen. Werde mal sehen ob ich das nachträglich noch so installieren und konfigurieren kann. Bin noch nicht so fit in sachen Unix.
 
Du könntest das mit sudo machen, aber bedenke: Gib dem Benutzer immer nur so viele Rechte, wie er wirklich braucht. Du müsstest in die /etc/sudoers eine Zeile einfügen, die ungefähr so aussieht:

Code:
www     ALL=(root) NOPASSWD: /usr/sbin/a2ensite

www ist der Benutzer, der es ausführen soll. Dann wäre natürlich noch der Pfad zum ausführbaren Binary. Die NOPASSWD-Direktive solltest du einfügen, denn sudo verlangt bei Eingabe von bspw.

Code:
sudo /usr/sbin/a2ensite

Das Passwort von Benutzer "www", wenn du mit dem eingeloggt bist. Im übrigen muss man auch mit der NOPASSWD-Direktive mindestens einmal den Befehl als Benutzer www ausführen und das Passwort eingeben. sudo merkt sich das dann.

Wenn Fragen - fragen :)
 
Von den rechten her wäre es kein Problem, ist nur hier in meinem kleinen Netzwerk und is von aussen nicht erreichbar. Ich glaub ich hab die rechte eh falsch eingestellt.
Das gehört aber dann doch eher ins Unix-Forum.

@Mod -> bitte verschieben

@saftmeister:

Ich hab mir mit meinem gefährlichen halbwissen ein Debian-Squeeze aufgesetzt und den Zend-Server CE installiert. Das alles natürlich als Benutzer "root". Dann noch Samba um mit Windows drauf zugreifen zu können. Jetzt denk ich das alles die falschen Rechte haben:
Wie müsste ich das umkonfigurieren damit es richtig ist?
Verzeichnise:
</var/www/> root:users
</var/www/benutzer1/> root:users
und das setzt sich dann immer weiter Rekursiv bis in den letzen Ordner.

Benutzer hab ich für den apachen auch nicht, der läuft unter root.
 
Wenn der Apache als root läuft, werden auch die PHP-Scripts als root ausgeführt. Das ist grundätzlich nicht sehr zu empfehlen, immer einen dedizierten Benutzer für den Indianer erstellen.

Das erklärt aber den Fehler überhaupt nicht. Zumindest sollte das Binary dann ausgeführt werden können. Versuch mal den kompletten Pfad zur Binary. Den findest du mit

Bash:
which a2ensite
 
...und verschoben.

Kleiner Tipp am Rande:
Ein Verschiebewunsch, der so im Beitrag "versteckt" ist, wird leicht übersehen.
Wenn man meint, dass das der Fall ist (oder auch gleich von Anfang an),
kann man auch den Melden-Button dafür nehmen.
So wirds sicher gesehen.

Gruß
 
Wenn der Apache als root läuft, werden auch die PHP-Scripts als root ausgeführt. Das ist grundätzlich nicht sehr zu empfehlen, immer einen dedizierten Benutzer für den Indianer erstellen.

Das erklärt aber den Fehler überhaupt nicht. Zumindest sollte das Binary dann ausgeführt werden können. Versuch mal den kompletten Pfad zur Binary. Den findest du mit

Bash:
which a2ensite

Code:
/usr/sbin/a2ensite
 
Und wenn du das an shell_exec() übergibst? Evtl. wäre es nicht verkehrt, mal die Rückgabe abzufangen:

PHP:
$out = exec('/usr/sbin/a2ensite', $out_array, $ret_val);
if($ret_val)
{
  echo "<pre>";
  var_dump($out_array);
  echo "</pre>";
}
else
{
  echo $out;
}

Falls du da noch irgendwelche Parameter an a2ensite übergeben musst, müssten die halt noch in den Command-String eingebaut werden.

Zu den Rechten:

Normalerweise erstellt man einen nicht-privilegierten Benutzer (also non-root) für den Apachen. Vielen verwenden als Benutzernamen "www" oder dergleichen. Außerdem ist es sinnvoll, eine Gruppe dafür zu erzeugen, und den Benutzer der Gruppe hinzuzufügen:

Bash:
groupadd wwwdata
useradd -g wwwdata -d /var/www -s /bin/false -c "Apache User" -k /dev/null www

Erklärung:

groupadd erstellt eine neue Gruppe. Es gibt da diverse Parameter, die man übergeben könnte. Im Normalfall benötigt man keine. Du kannst sehen, was es für Parameter gibt, wenn du [befehl] --help eingibst oder man [befehl].

useradd erstellt wie der Name vermuten lässt einen neuen Benutzer. -g [gruppenname] steuert die Haupt-Gruppen-Zugehörigkeit des neuen Benutzers. Ein Benutzer kann mehreren Gruppen angehören. In einigen Fällen ist das sinnvoll, hier jedoch nicht.
-d steuert das Home-Verzeichnis des Benutzers, /var/www ist sinnvoll, es macht keinen Sinn ein Home-Verzeichnis in /home/[benutzername] anzulegen, wenn es sich um ein Dienst-Konto handelt. Sollte das Homeverzeichnis noch nicht existieren, kann man es mit Parameter -m anlegen lassen. Die Rechte für das Verzeichnis würden gleich korrekt auf den Benutzer und seine Hauptgruppe eingestellt. Bei dir existiert das Verzeichnis bereits, also müssen die Rechte nachträglich korrigiert werden (kommt später).
Der Parameter -s stellt die Login-Shell ein. Da es sich um ein Dienst-Konto handelt stellen wir die Shell auf /bin/false, und deaktivieren somit den Login für das Konto. Solltest du wirklich eine Shell für den Benutzer www brauchen, kannst du das mit dem Befehl "su - www" erledigen, wenn du als root eingeloggt bist.
-c schreibt nur einen Kommentar in /etc/passwd für den Benutzer, nichts tragisches, nur für Protokollierungszwecke.
-k definiert das sog. Skeleton-Verzeichnis. Wenn das Home-Verzeichnis erzeugt werden soll (Parameter -m), wird eine Kopie des Standard-Skeleton-Verzeichnisses erzeugt, welches normalerweise /etc/skel ist. Das bedeutet, das bereits nach dem Anlegen eines Benutzers er schon gewisse Einstellungen in Form von Konfigurationsdateien (Desktop-Settings, Sound-Einstellungen und dergleichen) in seinem Home-Verzeichnis angelegt wird. Das hat den Vorteil, das man die Standard-Einstellungen mit vorkonfigurierten Settings überschreiben kann. Der neue Benutzer kann diese Einstellungen dann wiederum an seine Bedürfnisse anpassen. Es handelt sich um ein Dienst-Konto und benötigt keine besonderen Einstellungen, außerdem ist ein Login ohnehin nicht möglich, also verwenden wir zum Anlegen kein Skeleton-Verzeichnis.


Wenn du die Gruppe und den Benutzer angelegt hast, solltest du die Rechte an den Pfaden korrigieren. Das machst du am besten mit chown (Change-Owner) und funktioniert so:

Bash:
chown -R www:wwwdata /var/www

Der Parameter -R bedeutet hier "mach es rekursiv". www ist der Benutzer der den neuen Eigentümer darstellt, wwwdata die Gruppe. Man könnt die Gruppe weglassen, nicht aber den Eigentümer. Willst du nur die Gruppe ändern, verwende den Befehl "chgrp". /var/www ist dann natürlich der Pfad.

ACHTUNG! Man kann nur als Eigentümer oder Benutzer "root" den Eigentümer eines Verzeichnisses ändern. Im Falle von "Ordner gehört nicht-privilegierten Benutzer, soll nun aber root gehören" kann dies nur root erledigen.
 
Zuletzt bearbeitet:
Das nenn ich mal eine ausführliche Erklärung, vielen Dank erstmal. Ein bissl Unix is mir schon bekannt, wie deine Befehle useradd, chown -R, chgrp.... nur die kleinen Parameter kannte ich noch nicht wirklich.
Ich werde das heut Abend mal in Angriff nehmen und mich dann nochmal melden alls es noch eine Frage meinerseits gibt.

Nochmals vielen Dank :)

beste Grüße
Maniac
 

Neue Beiträge

Zurück