2011-01-07 13 views
6

Tengo un problema con ssh_exec() negándose a ejecutar el comando "cd".ssh2_exec() no cambiará el directorio con "cd"

Si inicio sesión en el servidor directamente y ejecuto el comando, funciona bien, así que no creo que el problema sea con mi comando.

Mi código es el siguiente:

$str = ssh2_exec($sshStream, 'cp /var/www/compressed.tar.gz /var/www/vhosts/demo-domain1.com/httpdocs/'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

$str = ssh2_exec($sshStream, 'tar xzf c-class.tar.gz'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

estoy conectado como root.

El primer comando se ejecuta correctamente y copia el archivo a la ubicación. El segundo comando no se ejecuta, pero no produce errores. El tercer comando muestra un error (obviamente, ya que el comando cd anterior no funciona).

Sé que no ha cambiado los directorios, ya que cuando ejecuto el "pwd", regresa diciendo que todavía está en el directorio raíz.

Como mencioné antes, si ejecuto los comandos desde el shell, se ejecutan bien, entonces estoy 99.9% seguro de que mi sintaxis es correcta.

Este es un servidor dedicado proporcionado por 1 & 1, corriendo CentOS y Plesk 9.

+0

¿Qué ocurre cuando se cambia el comando para 'cd/var/www/vhosts/demo-domain1.com/httpdocs/|| echo "cd failed" '? –

Respuesta

14

Para ejecutar ssh2_exec() PHP comienza un proceso que llevará a cabo un ssh ejecutado en el servidor remoto.

El proceso de shell creado de forma remota tiene su propio entorno, incluido el directorio de trabajo actual.
El comando cd cambiará el directorio de trabajo de shell que inició su segundo comando.

Cuando termina ese segundo comando, el shell muere con él. Junto con la información del directorio de trabajo.

En otros términos, di n entorno de shell no será recordada durante la ejecución del comando n + 1.

Si desea que los comandos de shell a estar trabajando tiempo dependiendo el uno del otro en términos de medio ambiente, se debería poner varios comandos en una única ssh2_exec como

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/;' 
          . 'tar xzf c-class.tar.gz'); 

$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 
+0

Gracias ring0 Eso funciona perfectamente :) –

+0

Otras respuestas en la web fueron muy confusas, esta dejó en claro por qué no funciona. Tuve que poner todos mis comandos en un ssh2_exec en lugar de muchos ya que seguían uno al otro. –

Cuestiones relacionadas