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 $sourcemais pas $output_dirqui 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