PHP exec () et espaces dans les chemins
Je suis en exécutant les commandes suivantes dans une application PHP:
$source = '/home/user/file.ext';
$output_dir = $this->setOutputString();
chdir('/home/ben/xc/phplib/bgwatcher-2011a/a01/');
exec('php bin/createjob.php $source $output_dir', $output);
return $output[0];
Le problème, c'est ceci: j'ai le contrôle sur $source
mais pas $output_dir
qui est un héritage système de fichiers Windows, et il y a des espaces dans le chemin. Un exemple $output_dir
est:
/home/vol1/district id/store id/this_is_the_file.html
Lors de l'insertion de la chaîne de sortie dans le exec()
fonction, j'ai essayé les deux:
addslashes($output_dir)
et '"' . $output_dir . '"'
pour échapper à l'ensemble de la chaîne de sortie. Dans le premier cas, le chemin devient concaténées:
/home/vol1/districtthis_is_the_file.html
... où tout entre le premier espace et le nom de fichier est perdu. Dans le second cas, exec()
semble jeter une chaussure et ne pas s'exécuter correctement - malheureusement, le message d'erreur est de se perdre dans les machines - je peux fournir si c'est absolument nécessaire, mais je suis aussi sous des contraintes de temps pour trouver une solution.
Quelle est la solution, ici? Dois-je sprintf()
l'ensemble de la chaîne de exec()
? Je suis très confus quant à pourquoi addslashes
ne fonctionne pas correctement pour échapper à la des espaces, et je suppose qu'il a quelque chose à voir avec désinfection avec exec(), mais je ne trouve pas de documentation à l'appui.
Mise à jour: j'ai essayé escapeshellarg() et preg_replace() sans succès. Penser à cette autre, ai-je besoin de double-échapper à la voie? Ou de s'échapper du chemin et de la commande? Si le chemin est sans échappement une fois par exec(), et une fois par PHP avant d'exécuter la commande, a-t-elle à la raison que j'ai besoin de compte pour les deux évasions? Ou n'est-ce pas, comment ça marche?
source d'informationauteur b. e. hollenbeck
Vous devez vous connecter pour publier un commentaire.
Selon la PHP docs
Dirait que vous aurez à preg_replace les espaces vous-même.
Edit:
Même si c'est le sujet d'une autre discussion, si la performance est un problème, alors lorsque l'on regarde un peu plus, il semble que
str_replace
est en fait un peu plus rapide quepreg_replace
:Référence trouvée ici.
Je ne crois pas
addslashes()
fait n'importe quoi avec des espaces.escapeshellarg()
peut-être ce que vous voulez à la place. Docs sur escapeshellargDe la doc PHP (ici),
Cela ne fait rien pour les espaces. Ce que vous devez faire est d'utiliser
str_replace()
pour ajouter des barres obliques, comme ceci:$new_string = str_replace(" ", "\\ ", $old_string);
J'ai utilisé
exec()
avec les chemins avec espaces avant, à la fois sur Windows et Linux hôtes, et dans les deux cas, citant le chemin a fonctionné parfaitement pour moi.Cela dit, si vous n'avez pas de contrôle sur la sécurité de shell argument, toujours le lancer à travers
escapeshellarg()
premier!Vous pouvez très bien utiliser shell guillemets, car c'est ce que toutes les commandes exec courir à travers:
Il btw fonctionne pas seulement pour les arguments, mais aussi pour la commande elle-même:
Utilisation
escapeshellcmd()
de toute façon.cela fonctionne pour moi lors de l'utilisation de exec() avec soffice(LibreOffice):