Pregunta

Estoy tratando de establecer una conexión SSH interactiva a un servidor remoto usando PHP a través de la línea de comandos en Mac OS X 10.6. Actualmente estoy usando la función proc_open de PHP que ejecute el comando siguiente:

ssh -t -t -p 22 user@server.com

Esto casi funciona. Se supone que las opciones -t -t para forzar una pseudo terminal que casi lo hacen. Soy capaz de introducir la contraseña SSH y presione intro. Sin embargo, después de pulsar entrar en los terminales aparece simplemente colgar. No hay salida, no hay nada - es como si la sesión SSH ha fallado. No puedo ejecutar órdenes o nada y tienen que matar a todo el asunto usando Ctrl + C. Sé que el inicio de sesión tiene éxito porque puedo ejecutar un comando como ssh -t -t -p 22 user@server.com "ls -la" y obtener la salida correcta.

pensé que el problema debe estar relacionado con el hecho de que yo estaba usando tubos estándar en mi llamada proc_open, por lo que los reemplazó con Pty. Me sale el siguiente error: "seudo Pty terminal no compatible en este sistema ..."

¿El Mac OS X, simplemente no soporta terminales pty o seudo? (Soy bastante nuevo en el uso de toda esta terminología cáscara).

Este es el código PHP:

$descriptorspec = array(0 => array("pty"), 1 => array("pty"), 2 => array("pty"));  
$cwd = getcwd();  
$process = proc_open('ssh -t -t -p 22 user@server.com', $descriptorspec, $pipes, $cwd);  
if (is_resource($process))  
{  
    while (true)  
    {  
        echo(stream_get_contents($pipes[1]));  
        $status = proc_get_status($process);  
        if (! $status["running"])  
            break;  
    }  
} 

(Lo sentimos - no puedo por la vida de a averiguar las instrucciones de formato SO está ...)

¿Qué estoy haciendo mal? ¿Por qué no puedo usar Pty? Es esto simplemente imposible en Mac OS X? Gracias por su ayuda!

¿Fue útil?

Solución

Se debe utilizar la autenticación de clave pública en lugar de tratar de programación por omisión de autenticación de contraseña interactiva.

Se supone que la solicitud de contraseña para ser utilizado desde una tty y creo que fue hecha intencionalmente difícil de usar de otra manera. También el argumento -t -t no es efectivo hasta que usted está conectado con el host remoto. Y yo no creo que el proc_open() función de PHP puede ejecutar un comando en un terminal virtual.

Para la autenticación de clave pública de instalación:

# Generate keypair
ssh-keygen -t rsa

# Copy public key to server
scp ~/.ssh/id_rsa.pub example.com:.ssh/authorized_keys

# Now you shouldn't be prompted for a password when connecting to example.com
# from this host and user account.
ssh example.com

# Since the web server (and thus PHP) probably has its own user account...
# Copy the ~/.ssh/id_rsa file somewhere else
cp ~/.ssh/id_rsa /some_path/id_rsa

# Change ownership of the file to the web server account
chown www-data:www-data /some_path/id_rsa

# Fix the file permissions (ssh ignore the keyfile if it is world readable)
chown 600 /some_path/id_rsa

# Try connecting to the server through the web server account
su -c "ssh -i /some_path/id_rsa -o UserKnownHostsFile=/some_path/known_hosts example.com" www-data

# Add the host to the known hosts file when prompted


Alternativamente, usted podría utilizar plink (parte de la masilla para Linux) en lugar de OpenSSH ya que puede tomar la contraseña en la línea de comandos plink -pw password example.com. Pero hacerlo presenta un riesgo de seguridad como cualquier persona que se ejecuta en el servidor ps aux puede ver la contraseña en la lista de procesos.

También hay un programa llamado sshpass que tiene la contraseña de una variable de entorno o argumento de comando y lo pasa al ssh.

Otros consejos

Parece que el problema se resuelve mejor utilizando la función de PHP de tránsito (). Después de mucho más (bastante doloroso) Investigación pude emitir un comando a través de esta función y podría interactuar con el servidor remoto a través del terminal como si hubiera ejecutar ssh y exportación de SVN con la mano (ambos requieren contraseñas, por lo tanto, eran buenas pruebas) . Lo que voy a tener que hacer es construir una (potencialmente muy larga) cadena de comandos separados por && y las incluirá en el final del comando ssh: ssh -t -t -p 22 hostname command1 && command2 ... La salida será enviada a mi terminal en Mac OS X, aunque la los comandos se ejecutan en el servidor remoto. Parece que este es la solución que estaba buscando todo el tiempo - bastante simple en realidad! Gracias a todos los que me han ayudado con esto. Le di Alexandre la "marca verde" porque era el único que mantenía responder y fue muy útil para deducir la respuesta final al problema. Gracias Alexandre!

Esto es viejo, pero para cualquier Googlers por ahí, aquí es una solución real usando proc_open:

descriptores Pty están disponibles en PHP, pero tienen que ser configurado durante la compilación (véase este a 10 años de edad informe de error https://bugs.php.net/bug.php?id=33147 )

Pero en Python sin embargo, no tenemos ese problema. Así que en lugar de ejecutar el comando ssh directamente, ejecute este script en Python:

import sys
import pty

args = " ".join(sys.argv[1:])
pty.spawn(['/usr/bin/ssh', args])

Sobre pty.spawn de documentación de Python:

  

generar un proceso, y conectar su terminal de control con la corriente   io estándar del proceso. Esto se utiliza a menudo para programas deflectores los cuales   insistir en la lectura desde la terminal de control.

¿Usted ha intentado el PHP SSH2 extensión ?

¿Usted ha intentado phpseclib, una aplicación PHP puro SSH :?

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->read('username@username:~$');
$ssh->write("ls -la\n");
echo $ssh->read('username@username:~$');
?>

Me escribió un cliente ssh en PHP con la extensión ssh2, se puede echar un vistazo al código fuente de la página GitHub https://github.com/roke22/PHP-SSH2-Web-Client

Por favor enviar alguna información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top