2016-08-13 7 views
0

automatisieren Ich muss einen Weg finden, SSH-Befehle zu meinem Router zu automatisieren. Mein Ziel ist es, den Router neu zu starten, wenn ich das Skript von meinem Java-Programm aus starte. Ich habe jedoch einige Probleme.Müssen SSH-Befehle an Router

Zunächst einmal ist dies die Folge des Ausgangs ich von meinem Router ssh erhalten: Zuerst habe ich zu tun:

ssh [email protected] 

, die zurückgibt:

[email protected]'s password: 

ich das Passwort eingeben, „admin ". Es geht dann auf diese Aufforderung:

Welcome Visiting Huawei Home Gateway 
Copyright by Huawei Technologies Co., Ltd. 

Password is default value, please modify it! 
WAP> 

Nun, ich Eingang „Reset“ und startet den Router.

Ich habe versucht Tcl mit Expect und während ich es unter Windows arbeiten kann, funktioniert es nicht auf Linux. Hier ist mein Code für den Tcl-Skript:

#!/bin/sh 
# \ exec tclsh "$0" ${1+"[email protected]"} 
package require Expect 
spawn ssh [email protected] 
send "admin\r" 
send "reset\r" 
after 3000 
exit 

Jedes Mal, wenn ich versuche, es auszuführen, Tcl8.6 läuft hindurch und endet, ohne tatsächlich etwas zu tun. Allerdings, wenn ich manuell alle diese Befehle während der Ausführung von Tcl8.6 eingeben, funktioniert es gut

Ich habe auch versucht, die JSch Java-Bibliothek. Damit kann ich das Java-Programm dazu bringen, eine Verbindung herzustellen und die Shell des Routers auszugeben, aber jeder Befehl, den ich versuche zu senden, tut nichts. Hier ist der Code aus, dass:

... 
JSch jsch = new JSch(); 

     Session session = jsch.getSession("root", "192.168.100.1", 22); 

     Properties config = new Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 

     // Skip prompting for the password info and go direct... 
     session.setPassword("admin"); 
     session.connect(); 

     String command = "reset\r"; 

     Channel channel = session.openChannel("exec"); 
     ((ChannelExec) channel).setCommand(command); 

     ((ChannelExec) channel).setErrStream(System.err); 

     InputStream in = channel.getInputStream(); 

     System.out.println("Connect to session..."); 
     channel.connect(); 


     byte[] tmp = new byte[1024]; 
     while (true) { 
      while (in.available() > 0) { 
       int i = in.read(tmp, 0, 1024); 
       if (i < 0) { 
        break; 
       } 
       System.out.print(new String(tmp, 0, i)); 
      } 
      if (channel.isClosed()) { 
       System.out.println("exit-status: " + channel.getExitStatus()); 
       break; 
      } 
      try { 
       Thread.sleep(1000); 
      } catch (Exception ee) { 
      } 
     } 
     channel.disconnect(); 
     session.disconnect(); 
     System.out.println("disconnected"); 

Dies ist die Ausgabe, die ich bekomme:

Connect to session... 

Welcome Visiting Huawei Home Gateway 
Copyright by Huawei Technologies Co., Ltd. 

Password is default value, please modify it! 
WAP> 

Es bleibt nur hier, bis ich verlassen. Der Router wird nicht neu gestartet. Ich habe auch versucht:

String command = "reset"; 

aber es tut die gleiche Sache. Kennt jemand andere Möglichkeiten, wie ich das machen könnte?

+1

Ich habe gerade bemerkt, dass Ihr Befehl mit '\ r' endet. Probieren Sie stattdessen '\ n' aus und sehen Sie, ob es für Sie funktioniert. – vempo

Antwort

4

Versuchen Sie, mit dem Gerät zu interagieren, indem Sie shell anstelle von exec verwenden.

Hier ist ein schneller und unsauberer Code, den ich so zu tun pflegte, können Sie es anpassen können an Ihren Bedürfnissen anpassen:

private static final String PROMPT = ">"; 

public static void main(String[] args) throws Exception { 

    Session session = null; 
    ChannelShell channel = null; 

    try { 

     JSch jsch = new JSch(); 
     session = jsch.getSession("root", "192.168.100.1", 22); 
     session.setConfig("StrictHostKeyChecking", "no"); 
     session.setPassword("admin"); 
     session.connect(); 

     channel = (ChannelShell) session.openChannel("shell"); 

     PipedOutputStream reply = new PipedOutputStream(); 
     PipedInputStream input = new PipedInputStream(reply); 
     ByteArrayOutputStream output = new ByteArrayOutputStream(); 

     channel.setInputStream(input, true); 
     channel.setOutputStream(output, true); 

     channel.connect(); 

     getPrompt(channel, output); 
     writeCommand(reply, "reset"); 
     getPrompt(channel, output); 

    } finally { 

     if (channel != null) { 
      channel.disconnect(); 
     } 

     if (session != null) { 
      session.disconnect(); 
     } 
    } 
} 

private static void writeCommand(PipedOutputStream reply, String command) throws IOException { 
    System.out.println("Command: " + command); 
    reply.write(command.getBytes()); 
    reply.write("\n".getBytes()); 
} 

private static void getPrompt(ChannelShell channel, ByteArrayOutputStream output) 
     throws UnsupportedEncodingException, InterruptedException { 

    while (!channel.isClosed()) { 

     String response = new String(output.toByteArray(), "UTF-8"); 
     System.out.println(response); 
     if (response.trim().endsWith(PROMPT)) { 
      output.reset(); 
      return; 
     } 

     Thread.sleep(100); 
    } 
} 

UPDATE: Ich habe bemerkt, dass der Befehl, den Sie über SSH Ende senden mit \r. Versuchen Sie \n und sehen Sie, ob es für Sie funktioniert.

+0

Leider scheint es auch nicht mit diesem Code zu arbeiten. Es macht genau das Gleiche. Es gibt die Shell des Routers aus, tut aber nichts danach. Ich habe sowohl "\ n" als auch "\ r" ausprobiert. – seventy70

+0

Es scheint jetzt zu funktionieren. Dein Code ist in Ordnung, nur dass es eine kleine Änderung gab, die Probleme verursachte. Vielen Dank! – seventy70

+0

Großartig! Vielleicht möchten Sie diese Änderung in einem Update für Ihre Frage erklären, damit andere davon erfahren. Oder schreiben Sie hier und ich werde die Antwort aktualisieren. – vempo

Verwandte Themen