Portál AbcLinuxu, 12. května 2025 11:42
Ahoj, mam problem, ktery se snazim rozlousknout a mozna uz se motam v kruhu, tak bych se chtel zeptat zde. Cil je PHP skriptem na webovem serveru vytvorit soubor v tmp a pomoci ftp ho stahnout do jineho adresare. Soubor vytvorim, ma prava 644, vlastnikem je wwwrun, ale ftp mi tvrdi, ze tam zadny takovy soubor neni. Pri testech jsem dosel zhruba k takovemu zapisu, abych si overil, kde je chyba:
shell_exec ("touch /tmp/aa.aa"); # je jedno, jakym zpusobem soubor pomoci PHP vytvorim
shell_exec ("ls -la /tmp"); #v poradku, soubor vidim s wwwrun:www 644
ftp_get ($conn_id,$local,$remote,FTP_BINARY); #FTP mi tvrdi, ze soubor neexistuje
shell_exec ("ls -la /tmp"); vse vidim, soubor je tam stale
FTP user ma pristup do /tmp. Co je ale uplne divoky a co mi hlava nebere je to, ze kdyz z bashe soubor v /tmp vytvorim a dam mu vlastnika wwwrun:www a 644, tak vse funguje. OS OpenSuse 13.1 x64, Apache standardni instalace. Kde je zakopanej pes?
Diky,L
$local,$remote
je skryto, dej víc i s výpisy.
OK, tady je ten skript, spoustim ho browserem:
<?php
$remote="/tmp/xx.xx";
$local="/dd/aa.aa"; $ftp_server="localhost";
$ftp_user="lpf";
$ftp_pass="lacko"; $conn_id=ftp_connect($ftp_server);
# Soubor $remote2 jsem vytvoril rucne v bashi, zmenil mu vlastnika na wwwrun:www a 644
$remote2="/tmp/yy.yy"; #vytvorim soubor $remote shell_exec("touch $remote"); $output=shell_exec("ls -la /tmp");
echo "<pre>ls -la /tmp $output</pre>"; if (ftp_login($conn_id,$ftp_user,$ftp_pass)) {
echo "login OK";
if (ftp_get($conn_id,$local,$remote,FTP_BINARY)) {
echo "YES";
}else{
echo "NO";
} }
$output=shell_exec("ls -la /tmp"); echo "<pre> ls -la /tmp $output</pre>";
ftp_close($conn_id);
?>
A jeho vystup:
ls -la /tmp total 8 drwxrwxrwt 2 root root 4096 Mar 22 12:51 . drwxr-xr-x 25 root root 4096 Mar 18 21:11 .. -rw-r--r-- 1 wwwrun www 0 Mar 22 12:53 xx.xx
login OK NO
ls -la /tmp total 8 drwxrwxrwt 2 root root 4096 Mar 22 12:51 . drwxr-xr-x 25 root root 4096 Mar 18 21:11 .. -rw-r--r-- 1 wwwrun www 0 Mar 22 12:53 xx.xx
Cilize soubor v tempu existuje minimalne do druheho ls. Nicmene ftp (resp. apache error log) tvrdi, ze nikoliv:
[php5:error] [pid 12253] [client ::1:38763] PHP Warning: ftp_get(): Failed to open file. in /srv/www/htdocs/test.php on line 18Vtipny je, ze celou dobu v /tmp existuje soubor remote2 /tmp/yy.yy:
-rw-r--r-- 1 wwwrun www 0 Mar 21 21:45 yy.yy
a prikazy ls ho nevypisi.
A kdyz vymenim v ftp_getu $remote za $remote2, tak vse funguje. Urcite to bude nejaka blbost, ale jsem v koncich :)
/tmp
není stejný /tmp
, není PHP chroot
-otavné?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.