Actualizado: PHP exec, system o passthru todos eliminan comillas simples o dobles

Cada vez que bash ejecutar un comando para el shell a través de las funciones de exec / passthru / system de php, parece eliminar las comillas del comando.

$str_file = '1323988284_700.csv'; exec("/usr/bin/lftp -e 'set ftp:passive-mode true; set ftp:ssl-protect-data yes; put /web/files/{$str_file}; bye;' -u user,pass ftp://ftp.site.com/uploaddir/"); 

Aquí está el resultado de verificar el proceso

 ps faxxx | grep lftp 4486 ? S 0:00 | \_ /usr/bin/lftp -e set ftp:passive-mode true; set ftp:ssl-protect-data yes; put /web/files/1323988284_700.csv; bye; -u user,pass ftp://ftp.site.com/uploaddir/ 

Como puede ver, muestra el proceso sin las comillas simples. Esto causa lftp al error.

Ahora solo cuelga hasta que lo mato, creo que esto se debe a que si escribo lo que se muestra en la lista de procesos en el comando, se producirá un error y lo dejaré en el shell de lftp.

PHP Safemode está desactivado

He intentado lo siguiente para la cita

 \' \\' \\\' \\\\' '' ''' '''' 

Por favor ayuda, esto me está volviendo loco. El extenso googleing no tiene nada.

¡Gracias!


ACTUALIZAR


Me gustaría añadir eso al realizar más pruebas … si creo un script de shell (run_ftp.sh) y lo ejecuto a través de php, también elimina las comillas del archivo run_ftp.sh … así que esto me hace pensar que NO es php lo que causa el problema.

SELinux está apagado … ¿Hay alguna otra medida de seguridad que tenga linux / bash que pueda causar esto?

Algunas ideas ?

Solutions Collecting From Web of "Actualizado: PHP exec, system o passthru todos eliminan comillas simples o dobles"

exec() comandos exec() y system() en PHP se pasan por el shell. El shell analiza la línea de comandos y elimina las comillas. Sin embargo, mantiene toda la cadena como un parámetro y la traslada a la llamada del sistema real execve() , etc.

La aplicación recibirá su cadena que estaba entre comillas simples como un parámetro . Sin embargo, la herramienta ps solo puede listarlos tal como están.

Sin embargo, podría ser que la herramienta lftp haga algunos análisis propios (la bandera -e suena así). En cuyo caso, dos niveles de comillas podrían ayudar:

 exec("lftp -e '\'multiple; commands; for the lftp thingy\''"); 

¿Alguien ha leído la página man de lftp?

Dice en “OPCIONES”:

-e comandos ejecuta comandos dados y no sale

-c comandos ejecuta los comandos dados y salidas

Entonces su lftp se bloquea porque está usando -e en lugar de -c.

No tiene nada que ver con PHP o con el shell que elimina las comillas. El caparazón siempre hace esto, así es como funciona. La salida de PS no está destinada a copiar y pegar.

Encontré una solución usando la función PHP proc_open . Es más complejo, pero funciona bien para mí.

 $command = "lftp -u $USER,$PASSWORD -e 'get /tmp/backup-2012-08-15.zip; bye' sftp://$HOST"; $io = array(); $p = proc_open($command, array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $io); /* Read output sent to stdout. */ while (!feof($io[1])) { echo "STDOUT: ".fgets($io[1]); } /* Read output sent to stderr. */ while (!feof($io[2])) { echo "STDERR: ".fgets($io[2]); } fclose($io[1]); fclose($io[2]); proc_close($p); 

Este código fue inspirado en la herramienta PHP SHELL . PDT: Lo siento por mi inglés

Hay un tutorial UNIX SHELL Quote auto-explicativo, ¡pruébalo!