PHP und SCP
am 08.11.2006 19:40:32 von Thomas Barth
Hallo,
ich möchte über eine Website eine im Webverzeichnis angelegte Datei auf
einen Remote-Recher kopieren.
system("scp -i keyfile filetocopy user@ip:/path/", $retvalue);
Die Datei mit dem notwendigen SSH-Schlüssel befindet sich im selben
Verzeichnis wie das PHP-Skript, welches den Befehl ausführt.
Die zu kopierende Datei wird leider nicht kopiert. Die Funktion system
selbst liefert den Rückgabewert 127. Wenn ich den Befehl in der Bash
eingebe, wird er ausgeführt.
Jemand eine Idee, was das schief laufen könnte?
Thomas B
Re: PHP und SCP
am 08.11.2006 21:07:51 von Peter Schmidt
Thomas Barth schrieb:
> Jemand eine Idee, was das schief laufen könnte?
Hast du den Befehl auf der Konsole als User des Webservers (meist
wwwrun) mal probiert? Ich kämpfe mich auch regelmäßig per SSH von Server
zu Server und meist scheitert es an irgendwelchen Rechten, die wwwrun
nicht hat.
Sonst fällt mir dazu leider spontan nichts anderes ein :(
Gruß
Pta
Re: PHP und SCP
am 08.11.2006 22:03:08 von Andreas Born
Thomas Barth wrote:
> system("scp -i keyfile filetocopy user@ip:/path/", $retvalue);
>
> Die Datei mit dem notwendigen SSH-Schlüssel befindet sich im selben
> Verzeichnis wie das PHP-Skript, welches den Befehl ausführt.
>
> Die zu kopierende Datei wird leider nicht kopiert. Die Funktion system
> selbst liefert den Rückgabewert 127. Wenn ich den Befehl in der Bash
> eingebe, wird er ausgeführt.
>
> Jemand eine Idee, was das schief laufen könnte?
Verwende mal testweise eine absolute Pfadangabe für scp und keyfile. Da
Du mit system() keine Login-Shell hast stehen Dir einige
Umgebungsvariablen wie path etc. evtl. nicht im gewohnten Umfang zur
Verfügung.
Wenn Du nicht weißt wo genau scp liegt:
passthru("/bin/find /usr /bin -name scp");
Viele Grüße,
Andreas
Re: PHP und SCP
am 08.11.2006 22:57:49 von Thomas Barth
Andreas Born schrieb:
> Thomas Barth wrote:
>
>> system("scp -i keyfile filetocopy user@ip:/path/", $retvalue);
>>
>> Die Datei mit dem notwendigen SSH-Schlüssel befindet sich im selben
>> Verzeichnis wie das PHP-Skript, welches den Befehl ausführt.
>>
>> Die zu kopierende Datei wird leider nicht kopiert. Die Funktion system
>> selbst liefert den Rückgabewert 127. Wenn ich den Befehl in der Bash
>> eingebe, wird er ausgeführt.
>>
>> Jemand eine Idee, was das schief laufen könnte?
>
> Verwende mal testweise eine absolute Pfadangabe für scp und keyfile. Da
> Du mit system() keine Login-Shell hast stehen Dir einige
> Umgebungsvariablen wie path etc. evtl. nicht im gewohnten Umfang zur
> Verfügung.
>
Der Befehl liefert mit absoluten Pfadangaben ebenfalls den Fehlercode
127. In der Bash hingegen funktioniert es als Apache-User, also mit den
gleichen Rechten, wie das Skript läuft.
Dann muss ich mir wohl etwas anderes überlegen.
Thomas B
Re: PHP und SCP
am 08.11.2006 22:58:59 von Thomas Barth
Peter Schmidt schrieb:
> Thomas Barth schrieb:
>> Jemand eine Idee, was das schief laufen könnte?
>
> Hast du den Befehl auf der Konsole als User des Webservers (meist
> wwwrun) mal probiert? Ich kämpfe mich auch regelmäßig per SSH von Server
> zu Server und meist scheitert es an irgendwelchen Rechten, die wwwrun
> nicht hat.
>
Ich hatte es mit den gleichen Rechten ausgeführt :-(
Thomas B
Re: PHP und SCP
am 08.11.2006 23:07:04 von Heiko Kuerschner
Thomas Barth schrieb:
> Der Befehl liefert mit absoluten Pfadangaben ebenfalls den Fehlercode
> 127. In der Bash hingegen funktioniert es als Apache-User, also mit
> den gleichen Rechten, wie das Skript läuft.
> Dann muss ich mir wohl etwas anderes überlegen.
Du könntest die stderr in einer Datei schreiben lassen. Evtl erfährst Du
dann mehr.
system("scp -i keyfile filetocopy user@ip:/path/ 2> $pfad/error.txt",
$retvalue);
--
Kürsche
Wenns 'ner net gwittern tun tut ;)
Linux/*BSD-Anleitungen, Newsgroup und Chat: www.newbie-net.de
Re: PHP und SCP
am 09.11.2006 01:03:01 von Andreas Born
Thomas Barth wrote:
> Der Befehl liefert mit absoluten Pfadangaben ebenfalls den Fehlercode
> 127. In der Bash hingegen funktioniert es als Apache-User, also mit
> den gleichen Rechten, wie das Skript läuft.
> Dann muss ich mir wohl etwas anderes überlegen.
Ok, dann noch ein paar andere Ansatzpunkte:
- um Ausgaben zu sehen erstmal passthru() statt system() verwenden
- Auch ich würde mir als erstes mal die Fehlermeldungen anzeigen lassen.
passthru('scp -v -i keyfile filetocopy user@ip:/path/ 2>&1');
- scp greift womöglich auf STDIN zu, was Prozessen außerhalb des
Kontextes einer login-shell möglicherweise verweigert wird. Das kann
evtl. mit dem Schalter -B unterdrückt werden.
passthru('scp B -v -i keyfile filetocopy user@ip:/path/ 2>&1');
- ein Workaround wäre vielleicht, scp über eine bash-shell aufzurufen:
passthru('bash -c "scp -B -i keyfile filetocopy user@ip:/path/" 2>&1');
- scp bzw. ssl akzeptiert mglweise nur keyfiles, deren Rechte nicht zu
offen sind. Das keyfile sollte daher nur für den Besitzer lesbar sein
und sonst keine weiteren Rechte bieten. In Deinem Fall wäre das jetzt
der Apache-prozess, das keyfile müsste also dem apache-user gehören
(Vorsicht, Sicherheitsrisiko!!)
Wenn Du root-rechte hast erzeuge einen dedizierten User für scp und eine
scp-kopie mit diesem User als Besitzer und entsprechenden sgid/suid
bits. Das keyfile hat dann auch diesen User als Besitzer mit den
exklusiven Leserechten. Das wäre auch ein Workaround für den Fall, daß
das problem mit den stark limitierten Rechten des Apache-Users
zusammenhängt.
- scp bzw ssl will evtl. den Host-Key überprüfen, was fehl schlägt. Ggf
(nur zu Testzwecken):
passthru('scp -i keyfile -o "StrictHostKeyChecking=no" filetocopy
user@ip:/path/ 2>&1');
Viele Grüße,
Andreas
Re: PHP und SCP
am 09.11.2006 11:40:32 von Thomas Barth
Andreas Born schrieb:
> Thomas Barth wrote:
>
>> Der Befehl liefert mit absoluten Pfadangaben ebenfalls den Fehlercode
>> 127. In der Bash hingegen funktioniert es als Apache-User, also mit
>> den gleichen Rechten, wie das Skript läuft.
>> Dann muss ich mir wohl etwas anderes überlegen.
>
> Ok, dann noch ein paar andere Ansatzpunkte:
>
> - um Ausgaben zu sehen erstmal passthru() statt system() verwenden
>
> - Auch ich würde mir als erstes mal die Fehlermeldungen anzeigen lassen.
> passthru('scp -v -i keyfile filetocopy user@ip:/path/ 2>&1');
>
> - scp greift womöglich auf STDIN zu, was Prozessen außerhalb des
> Kontextes einer login-shell möglicherweise verweigert wird. Das kann
> evtl. mit dem Schalter -B unterdrückt werden.
> passthru('scp B -v -i keyfile filetocopy user@ip:/path/ 2>&1');
>
> - ein Workaround wäre vielleicht, scp über eine bash-shell aufzurufen:
> passthru('bash -c "scp -B -i keyfile filetocopy user@ip:/path/" 2>&1');
>
Ich habe alle diese Befehle ausprobiert, ich erhalte immer den
Error-Code 127 und keine sonstigen Ausgaben.
> - scp bzw. ssl akzeptiert mglweise nur keyfiles, deren Rechte nicht zu
> offen sind. Das keyfile sollte daher nur für den Besitzer lesbar sein
> und sonst keine weiteren Rechte bieten. In Deinem Fall wäre das jetzt
> der Apache-prozess, das keyfile müsste also dem apache-user gehören
> (Vorsicht, Sicherheitsrisiko!!)
>
Dateirechte stehen auf 0400. Soll auch nur eine Übergangslösung sein.
> Wenn Du root-rechte hast erzeuge einen dedizierten User für scp und eine
> scp-kopie mit diesem User als Besitzer und entsprechenden sgid/suid
> bits. Das keyfile hat dann auch diesen User als Besitzer mit den
> exklusiven Leserechten. Das wäre auch ein Workaround für den Fall, daß
> das problem mit den stark limitierten Rechten des Apache-Users
> zusammenhängt.
Kann PHP Safemode denn bestimmte Befehle ausschließen?
Thomas B
Re: PHP und SCP
am 09.11.2006 12:08:39 von Andreas Born
Thomas Barth wrote:
> Kann PHP Safemode denn bestimmte Befehle ausschließen?
Ja, insbesondere systemaufrufe sind hiervon betroffen. Also gerade
system(), exec(), passthru() und popen(). shell_exec() gibt es z.B.
garnicht.
Wenn Du Safe Mode aktiviert hast, wird das in der Tat das Problem sein.
In der php.ini gibt es einen Eintrag safe_mode_exec_dir; nur Befehle,
die in dem dort angegebenen Verzeichnis liegen können durch einen
Systemaufruf ausgeführt werden. Alle anderen sind gesperrt.
Viele Grüße,
Andreas
Re: PHP und SCP
am 09.11.2006 18:52:49 von Thomas Barth
Andreas Born wrote:
> Thomas Barth wrote:
>
>> Kann PHP Safemode denn bestimmte Befehle ausschließen?
>
> Ja, insbesondere systemaufrufe sind hiervon betroffen. Also gerade
> system(), exec(), passthru() und popen(). shell_exec() gibt es z.B.
> garnicht.
>
> Wenn Du Safe Mode aktiviert hast, wird das in der Tat das Problem sein.
> In der php.ini gibt es einen Eintrag safe_mode_exec_dir; nur Befehle,
> die in dem dort angegebenen Verzeichnis liegen können durch einen
> Systemaufruf ausgeführt werden. Alle anderen sind gesperrt.
>
>
Und in welcher Form müssen die Befehle denn vorliegen? Die PHP-Safemode
Einstellungen wurden in den VirtualHost-Containern von Apache
vorgenommen. safe_mode_exec_dir könnte ich dann hinzufügen.
Thomas B
Re: PHP und SCP
am 09.11.2006 19:28:04 von Andreas Born
Thomas Barth wrote:
> Und in welcher Form müssen die Befehle denn vorliegen? Die
> PHP-Safemode Einstellungen wurden in den VirtualHost-Containern von
> Apache vorgenommen. safe_mode_exec_dir könnte ich dann hinzufügen.
Ich würde vermuten, daß einfache symlinks ausreichen, bin mir da aber
nicht sicher. Habe PHP-Safemode bisher immer vermieden, eben weil die
Einstellungen viel zu restriktiv sind.
Evtl. muß das Verzeichnis auch in open_basedir zusätzlich mit angegeben
werden.
Viele Grüße,
Andreas