Ik heb een code gehad wat in het verleden werkte en een loop maar nu niet meer:



echo 'mv -T -f /home/admin/domains/domein.nl/private_html/images/products/'.$catid_oud.'/'.$ean.' /home/admin/domains/domein.nl/private_html/images/products/'.$_GET['category'].'/'.$ean;

exec('mv -T -f /home/admin/domains/domein.nl/private_html/images/products/'.$catid_oud.'/'.$ean.' /home/admin/domains/domein.nl/private_html/images/products/'.$_GET['category'].'/'.$ean);



De $ean, $catid_oud en $_GET['category'] en zijn niet leeg.
Alle folders hebben 777 rechten en ook alle bestanden erin.

De folders worden verplaatst dus alle ean code foldesr, maar de plaatjes in dit geval die daarin zijn worden niet verplaatst maar blijven opde oude locatie.

Wat is heir verkeerd aan?
In geval van twijfel, raadpleeg de handleiding.

-t, --target-directory=destination Move all sources into the directory destination.
-T, --no-target-directory	Treat destination as a normal file, not as a directory.


https://www.computerhope.com/unix/umv.htm
Het is dus een folder met plaatjes erin wat meegekopieerd moet worden.
met kleine t kopieerd hij niet de folder.

Ik heb net getest met root in shell en daar kopieerd hij de plaatjes wel, maar met een PHP exec niet, dus dat zal ermee te maken hebben, maar ze hebben allemaal 777 rechten dus snap niet waarom dit kan.
Is exec wel toegestaan? Probeer eens een uiterst simpel commando zoals uptime.
Op mijn Mac doet 'mv' het niet. Een 'ls -al' doet het wel.

Op mijn NAS werkt het wel.

Uit dit atikel met voorbeelden :

https://stackoverflow.com/questions/18472659/php-exec-command-works-in-shell-and-php-command-line-but-not-on-website

"This is probably because php is being run under a different user on the system, and that that user does not have the rights to do that action on those files. You could look into sudo to perform this"

Hier mijn houtje-touwtje code :

<?php

$command = 'mv map map_oud';
//$command = "ls -al map*";
exec( $command , $output , $return_var );
echo '<pre>' . print_r( $command, TRUE ) . '</pre>';
echo '<pre>' . print_r( $output, TRUE ) . '</pre>';
echo '<pre>' . print_r( $return_var, TRUE ) . '</pre>';
?>
$output en $return_value zijn nergens gedefinieerd en zijn dus ook leeg.

Ik denk dat ik het weet, nu zie ik dat de folder in bepaalde gevallen aangemaakt was met de eigenaar 0 0 . Dat is de root.

Hoe kan ik in PHP dus root mappen rechten geven?
wat zit er voor waarde in $_GET['category']?

Staan daar nog bijzondere tekens en/of spaties in?

NB: 777 voor een plaatje is te veel. Ooit een plaatje gezien dat uitgevoerd moet kunnen worden?

---
bestaat de doelmap $_GET['category'] al?
als niet: mag er door PHP in de map products geschreven worden?

evt. kun je $ean aan het einde van de regel nog weg laten.
De waarde van een superglobal (ogenschijnlijk) rechtstreeks in een exec() gooien lijkt mij sowieso niet zo'n strak plan. Ergens zou deze waarde geïnspecteerd moeten worden, en dan zou ik op zijn minst verwachten dat je deze kopieert naar een "gevalideerde" variabele. Misschien gebeurt dit wel, maar dit kunnen we totaal niet afleiden uit het bovenstaande codefragment.

Daarnaast, dit is dus een snippet, misschien moet er gewoon wat meer huiswerk gedaan worden? Controleren of de omstandigheden voor zo'n kopieer/verplaatsactie goed zijn, m.a.w., waar controleer je of de brondirectory leesbaar en de doeldirectory schrijfbaar is?

Als je dit soort controles inbouwt kun je ook veel sneller constateren waar het precies misgaat. Uit het feit dat je dit niet direct kunt afleiden maak ik op dat deze controles waarschijnlijk niet bestaan...
is het trouwens niet mogelijk om het verplaatsen met PHP te doen?

https://www.php.net/manual/en/function.rename.php

Je rename-t dan de oude dir naar de nieuwe dir, en dat zou genoeg moeten zijn.
Dat hoeft toch niet uitbesteed te worden via exec() ?
Dat ook, en als dit een reguliere operatie is, of een grote eenmalige conversie, dan zou ik toch een soort van schil hieromheen schrijven met een hoop (verbose) logging, zodat je in een vroeg stadium (dryrun of prechecks) moeilijkheden kunt detecteren zodat je deze stront niet hebt tijdens het daadwerkelijke verplaatsen zelf...
Alles bestaat, maar de eigenaars vanuit de root dus 0 0 was het probleem
Ik heb nu via de root alle plaatjes de juiste rechten gegevene n nu werkt het wel.

Reageren