Domanda

Sto cercando di stabilire una connessione SSH interattivo a un server remoto utilizzando PHP tramite la riga di comando in Mac OS X 10.6. Attualmente sto usando la funzione proc_open di PHP per eseguire il seguente comando:

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

Questo funziona quasi. Le opzioni -t -t dovrebbero forzare un pseudo terminale che quasi fanno. Sono in grado di inserire la password SSH e premere invio. Tuttavia, dopo aver premuto inserire i terminali appare semplicemente appendere. Nessuna uscita, niente di niente - è come se la sessione SSH è riuscito. Non è possibile eseguire comandi o nulla e uccidere il tutto usando Ctrl + C. So che l'accesso riesce perché posso eseguire un comando come ssh -t -t -p 22 user@server.com "ls -la" e ottenere l'output corretto.

Ho pensato che il problema deve essere legato al fatto che stavo usando tubi standard nei mia chiamata proc_open, così li ho sostituito con PTY. Ottengo il seguente errore: "pseudo terminale Pty non supportato su questo sistema ..."

non Mac OS X semplicemente non supporta i terminali PTY o pseudo? (Sono abbastanza nuovo a utilizzare tutta questa terminologia shell).

Ecco il codice 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;  
    }  
} 

(Sorry - non posso per la vita di me capire le istruzioni in modo sta formattazione ...)

Che cosa sto facendo di sbagliato? Perché non posso usare Pty? Questo è solo impossibile su Mac OS X? Grazie per il vostro aiuto!

È stato utile?

Soluzione

Si consiglia di utilizzare l'autenticazione a chiave pubblica, piuttosto che cercare di programmazione bypass autenticazione della password interattivo.

La richiesta di password dovrebbe essere usato da un terminale e credo che è stato fatto intenzionalmente difficile da usare in altro modo. Anche l'argomento -t -t ha effetto solo una volta che si è connessi a un host remoto. E non credo che la funzione PHP proc_open() possibile eseguire un comando all'interno di un terminale virtuale.

Per impostare l'autenticazione a chiave pubblica:

# 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


In alternativa, è possibile utilizzare plink (parte di stucco per Linux), invece di OpenSSH come si può prendere la password sulla riga di comando plink -pw password example.com. Ma così facendo presenta un rischio per la sicurezza da chi gestisce ps aux sul server può vedere la password nella lista dei processi.

C'è anche un programma chiamato sshpass che prende la parola d'accesso da una variabile d'ambiente o argomento di comando e lo passa al ssh.

Altri suggerimenti

Sembra che il problema è meglio risolto utilizzando la funzione di PHP passthru (). Dopo molto di più (piuttosto doloroso) di ricerca sono stato in grado di emettere un comando tramite questa funzione e potrebbe interagire con il server remoto attraverso il terminale come se avessi eseguito ssh e l'esportazione svn a mano (entrambi richiedono password, quindi erano buoni test) . Quello che sto andando a fare è costruire una (potenzialmente molto lunga) stringa di comandi separati da && e allegare al fine del comando ssh: ssh -t -t -p 22 hostname command1 && command2 ... L'output sarà inviato a mio terminale in Mac OS X, anche se il comandi vengono eseguiti sul server remoto. Sembra che questo è la soluzione che stavo cercando per tutto il tempo - piuttosto semplice, in realtà! Grazie a tutti coloro che mi hanno aiutato in questo. Ho dato Alexandre il "segno di spunta verde" perché era l'unico che continuava a rispondere ed è stato molto utile per dedurre la risposta finale al problema. Grazie Alexandre!

Questa è vecchio, ma per tutti i Googler là fuori, qui è una soluzione reale utilizzando proc_open:

descrittori Pty sono disponibili in PHP, ma devono essere configurati durante la compilazione (vedi questo 10yr vecchio bug report https://bugs.php.net/bug.php?id=33147 )

Ma in python tuttavia, non abbiamo questo problema. Così, invece di eseguire direttamente il comando ssh, eseguire questo script python:

import sys
import pty

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

A proposito di pty.spawn da docs pitone:

  

Spawn un processo, e collegare il suo terminale di controllo con la corrente   io serie di processo. Questo è spesso usato per i programmi che deflettore   insistere sulla lettura dal terminale di controllo.

Hai provato la PHP SSH2 estensione ?

Hai provato phpseclib, un puro PHP SSH implementazione :?

<?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:~$');
?>

Ho scritto un client ssh su PHP con l'estensione ssh2, si può dare un'occhiata al codice sorgente della pagina GitHub https://github.com/roke22/PHP-SSH2-Web-Client

Si prega di inviare un feedback.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top