2014-03-28 4 views
6

Ich muss eine Reihe von Befehlen auf dem Remote-Server über SSH ausführen, mit sshj-Bibliothek.Ausführung Sequenz von Befehlen in sshj

ich

 Session session = ssh.startSession(); 
     Session.Command cmd = session.exec("ls -l"); 
     System.out.println(IOUtils.readFully(cmd.getInputStream()).toString()); 
     cmd.join(10, TimeUnit.SECONDS); 
     Session.Command cmd2 = session.exec("ls -a"); 
     System.out.println(IOUtils.readFully(cmd2.getInputStream()).toString()); 

und es wirft mich

net.schmizz.sshj.common.SSHRuntimeException: In dieser Sitzung Kanal alle bis

verwendet wird, aber ich kann Wiederholen Sie die Sitzung nicht für jeden einzelnen Befehl, da in diesem Beispiel die Home-Verzeichnis-Liste angezeigt wird, nicht jedoch die Liste/some/dir.

+0

sein kann u lesen müssen, um Daten von 'cmd.getInputStream()' vor dem nächsten Befehl ... –

Antwort

4

Sie betrachten können eine Expect-like mit Third-Party-Bibliothek, die die Arbeit mit Remote-Services und die Erfassung von Ausgaben vereinfacht. Diese Bibliotheken sind so ausgelegt, dass sie eine Befehlsfolge ausführen. Hier ist ein guter Satz von Optionen können Sie versuchen:

jedoch, als ich ungefähr ähnliches Problem zu lösen, fand ich diese Bibliotheken sind ziemlich alt. Sie führen auch viele unerwünschte Abhängigkeiten ein. Also habe ich mein eigenes erschaffen und es für andere verfügbar gemacht. Es heißt ExpectIt. Die Vorteile meiner Bibliothek finden Sie auf der Projekthomepage. Du kannst es versuchen. Hier

ist ein Beispiel mit einem öffentlichen Fern SSH-Dienst der Interaktion sshj mit:

SSHClient ssh = new SSHClient(); 
    ... 
    ssh.connect("sdf.org"); 
    ssh.authPassword("new", ""); 
    Session session = ssh.startSession(); 
    session.allocateDefaultPTY(); 
    Shell shell = session.startShell(); 
    Expect expect = new ExpectBuilder() 
      .withOutput(shell.getOutputStream()) 
      .withInputs(shell.getInputStream(), shell.getErrorStream()) 
      .build(); 
    try { 
     expect.expect(contains("[RETURN]")); 
     expect.sendLine(); 
     String ipAddress = expect.expect(regexp("Trying (.*)\\.\\.\\.")).group(1); 
     System.out.println("Captured IP: " + ipAddress); 
     expect.expect(contains("login:")); 
     expect.sendLine("new"); 
     expect.expect(contains("(Y/N)")); 
     expect.send("N"); 
     expect.expect(regexp(": $")); 
     expect.send("\b"); 
     expect.expect(regexp("\\(y\\/n\\)")); 
     expect.sendLine("y"); 
     expect.expect(contains("Would you like to sign the guestbook?")); 
     expect.send("n"); 
     expect.expect(contains("[RETURN]")); 
     expect.sendLine(); 
    } finally { 
     session.close(); 
     ssh.close(); 
     expect.close(); 
    } 

Hier ist der Link zum vollständigen bearbeitbar example.

18

So seltsam es ist, session kann nur einmal verwendet werden. Sie müssen die Sitzung also jedes Mal zurücksetzen.

Session session = ssh.startSession(); 
    Session.Command cmd = session.exec("ls -l"); 
    System.out.println(IOUtils.readFully(cmd.getInputStream()).toString()); 
    cmd.join(10, TimeUnit.SECONDS); 

    session = ssh.startSession(); 
    Session.Command cmd2 = session.exec("ls -a"); 
    System.out.println(IOUtils.readFully(cmd2.getInputStream()).toString()); 

Oder wenn die Schale Sie auf Träger verbinden Befehle begrenzt (und die Situation es erlaubt), können Sie diese (bash Beispiel) tun:

session.exec("ls -l; <command 2>; <command 3>");

+0

Does startSession Ausführung() wieder mit dem Server verbinden? Nur um sicher zu gehen, dass ich den Server nicht hämmere – golimar

1

Diese Frage ist alt, aber nur zu klären, unter Angabe aus dem Wiki https://github.com/hierynomus/sshj/wiki

Session Objekte nicht wiederverwendbar sind, so dass Sie nur einen Befehl/Shell/Subsystem über exec haben können(), Startshell() oder startSubsystem() jeweils. Sie können jedoch mehrere Sitzungen über eine einzelne Verbindung starten.

In unserem Fall haben wir gemacht haben, steckte es in eine Funktion

public String runCmd(SSHClient sshClient, String command) throws IOException { 
    String response = ""; 

    try (Session session = sshClient.startSession()) { 
     final Command cmd = session.exec(command); 
     response = (IOUtils.readFully(cmd.getInputStream()).toString()); 
     cmd.join(5, TimeUnit.SECONDS); 
     // System.out.println("\n** exit status: " + cmd.getExitStatus()); 
    } 
    return response; 
} 
Verwandte Themen