2009-02-20 30 views
10

Scenerio: Mi piacerebbe eseguire comandi su macchine remote da un programma Java su ssh (sto usando OpenSSH sul mio computer di sviluppo). Mi piacerebbe anche fare la connessione ssh passando la password piuttosto che impostare le chiavi come farei con 'expect'.
Problema: quando si tenta di eseguire l'accesso "come previsto" come password, il processo creato con ProcessBuilder non sembra visualizzare la richiesta della password. Quando si eseguono normali comandi non-ssh (ad es. 'Ls') posso ottenere gli stream e interagire con loro semplicemente bene. Sto combinando errore standard e standard in un flusso con redirectErrorStream(true); quindi non mi manca in errore standard ... Quando eseguo ssh con l'opzione '-v', vedo tutto il logging nello stream ma non lo faccio vedere il prompt. Questa è la prima volta che cerco di utilizzare ProcessBuilder per qualcosa di simile. So che sarebbe più semplice usare Python, Perl o il buon vecchio, ma il mio capo vuole utilizzare ciò che stiamo cercando di ottenere (file di log remoti e script in esecuzione) all'interno di un programma Java esistente, quindi sono piuttosto bloccato.Esecuzione di comandi su ssh con Java

Grazie in anticipo per l'aiuto!

risposta

11

Il prompt può essere visualizzato solo quando ssh è connesso a un TTY, che non è nel caso di Java.

Probabilmente esiste un modo per fornire la password sulla riga di comando nell'applicazione ssh. Questo sarà il modo per superare il prompt.

In alternativa, è consigliabile connettersi direttamente al server host dal codice Java nativo piuttosto che eseguire un'applicazione esterna. C'è lo a million libraries che lo farà.

+2

+2 per In alternativa, -1 per non andare prima lì (chiamandolo "alternativamente". Net è ancora un +1 :) –

+0

Consiglierei paramiko per java, abilmente chiamato jaramiko - http://www.lag.net/jaramiko/. originariamente in Python, è stato portato su Java. renderà più semplice l'uso della versione python quando il boss lascia perdere :) – popcnt

2

La maggior parte dei programmi di sicurezza non utilizzano lo stdin/stdout per l'acquisizione di password, ma acquisiscono il TTY o un metodo equivalente.

7

Invece di utilizzare un programma ssh esterna, perché non utilizzare una libreria Java ssh:

sono due che ho trovato con Google - che eviterete il problema che openssh lavorerà molto duramente per impedire l'inserimento della password su stdin - aprirà il terminale direttamente. aspettarsi deve lavorare molto duramente per simulare un tty per poter funzionare.

4

Perché non utilizzare un client ssh Java? This uno è concesso in licenza BSD e ci sono più clienti elencati here.

1

Ho usato il client ssh della Trilead con molto successo. Ho anche provato jsch (un altro client java ssh) e il tunneling verso il client ssh nativo sotto linux. Trilead era di gran lunga il migliore.

+0

non più supportato –

0

È possibile eseguire comandi utilizzando edtFTPj/PRO, nonché eseguire trasferimenti di file tramite SFTP. È Java.

1

Dai uno sguardo al recentissimo, che si basa sul progetto Apache MINA.

6

spina: vedi this esempio di esecuzione di un comando tramite ssh usando sshj

1

Riprendendo il suggerimento altrui di utilizzare una libreria Java SSH. Ma voleva commentare la risposta di Cohen.L'invio della password tramite la riga di comando quando si stabilisce la connessione non è sicuro e non è consentito da molti server sshd (in base alla configurazione).

Si potrebbe voler esaminare le chiavi di impostazione per questo, in modo da poter eseguire comandi ssh tra le macchine senza password.

Procedure essenziali - uso OpenSSH per creare una coppia di chiavi (che ho fatto RSA, ma so che c'è un metodo migliore ora) - creare una directory .ssh nella vostra cartella home sul computer di origine - creare un directory .ssh nella vostra cartella home sul computer di destinazione - tenere la chiave privata nella cartella .ssh della macchina fonte - copiare la chiave pubblica in un file chiamato authorized_keys nella cartella .ssh del bersaglio

Alcune istruzioni possono essere trovati here