# SSH Client



## danja95 (10. Jun 2014)

Hallo Leute,
ich bin relativ ungeübt in Java und möchte mal auch damit anfangen 

Und zwar wollte ich einen SSH Client mir selber erstellen, so als Übung.


```
/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
/**
 * This program enables you to connect to sshd server and get the shell prompt.
 *   $ CLASSPATH=.:../build javac Shell.java 
 *   $ CLASSPATH=.:../build java Shell
 * You will be asked username, hostname and passwd. 
 * If everything works fine, you will get the shell prompt. Output may
 * be ugly because of lacks of terminal-emulation, but you can issue commands.
 *
 */
import com.jcraft.jsch.*;
import com.jcraft.jsch.jce.*;
import com.jcraft.jsch.jcraft.*;
import com.jcraft.jsch.jgss.*;
import com.jcraft.jsch.DHG1;
import com.jcraft.jsch.jce.DH;
import com.jcraft.jsch.jce.SHA1;
import com.jcraft.jsch.jce.SignatureRSA;
import com.jcraft.jsch.jce.MD5;
import com.jcraft.jsch.jce.TripleDESCBC;
import com.jcraft.jsch.jce.HMACMD5;
import java.awt.*;
import javax.swing.*;

public class Shell{
  public static void main(String[] arg){
    
    try{
      JSch jsch=new JSch();
      
      //jsch.setKnownHosts("/home/foo/.ssh/known_hosts");
      
      String host=null;
      if(arg.length>0){
        host=arg[0];
      }
      else{
        //System.getProperty("user.name")
        host=JOptionPane.showInputDialog("Enter username@hostname",
        "root" + "@10.10.7.1"); 
      }
      String user=host.substring(0, host.indexOf('@'));
      host=host.substring(host.indexOf('@')+1);
      
      Session session=jsch.getSession(user, host, 22);
      
      String passwd = JOptionPane.showInputDialog("Enter password");
      session.setPassword(passwd);
      
      UserInfo ui = new MyUserInfo(){
        public void showMessage(String message){
          JOptionPane.showMessageDialog(null, message);
        }
        public boolean promptYesNo(String message){
          Object[] options={ "yes", "no" };
          int foo=JOptionPane.showOptionDialog(null, 
          message,
          "Warning", 
          JOptionPane.DEFAULT_OPTION, 
          JOptionPane.WARNING_MESSAGE,
          null, options, options[0]);
          return foo==0;
        }
        
        // If password is not given before the invocation of Session#connect(),
        // implement also following methods,
        //   * UserInfo#getPassword(),
        //   * UserInfo#promptPassword(String message) and
        //   * UIKeyboardInteractive#promptKeyboardInteractive()
        
      };
      
      session.setUserInfo(ui);
      
      // It must not be recommended, but if you want to skip host-key check,
      // invoke following,
      // session.setConfig("StrictHostKeyChecking", "no");
      
      //session.connect();
      session.connect(30000);   // making a connection with timeout.
      
      Channel channel=session.openChannel("shell");
      
      // Enable agent-forwarding.
      //((ChannelShell)channel).setAgentForwarding(true);
      
      channel.setInputStream(System.in);
      /*
      // a hack for MS-DOS prompt on Windows.
      channel.setInputStream(new FilterInputStream(System.in){
      public int read(byte[] b, int off, int len)throws IOException{
      return in.read(b, off, (len>1024?1024:len));
      }
      });
      */
      
      channel.setOutputStream(System.out);
      
      /*
      // Choose the pty-type "vt102".
      ((ChannelShell)channel).setPtyType("vt102");
      */
      
      /*
      // Set environment variable "LANG" as "ja_JP.eucJP".
      ((ChannelShell)channel).setEnv("LANG", "ja_JP.eucJP");
      */
      
      //channel.connect();
      channel.connect(3*1000);
    }
    catch(Exception e){
      System.out.println(e);
    }
  }
  
  public static abstract class MyUserInfo
  implements UserInfo, UIKeyboardInteractive{
    public String getPassword(){ return null; }
    public boolean promptYesNo(String str){ return false; }
    public String getPassphrase(){ return null; }
    public boolean promptPassphrase(String message){ return false; }
    public boolean promptPassword(String message){ return false; }
    public void showMessage(String message){ }
    public String[] promptKeyboardInteractive(String destination,
    String name,
    String instruction,
    String[] prompt,
    boolean[] echo){
      return null;
    }
  }
}
```

habe JSCH benutzt aber egal wie oft ich das richtige Passwort benutze ich bekomme nur noch stumpf: 
com.jcraft.jsch.JSchException: Auth fail

Habe die selben daten mal in Putty getestet jedoch ohne erfolg.


Optional: Wüsste jemand wie man die Ausgaben in einer GUI form halten kann und nicht im CMD fenster?


Gruß Daniel


----------



## Joose (10. Jun 2014)

danja95 hat gesagt.:


> Und zwar wollte ich einen SSH Client mir selber erstellen, so als Übung.
> 
> habe JSCH benutzt aber egal wie oft ich das richtige Passwort benutze ich bekomme nur noch stumpf:
> com.jcraft.jsch.JSchException: Auth fail
> ...



Wenn du es üben willst dann solltest du auch passende Logindaten verwenden.
Schau dass der Login über Putty funktioniert, wenn ja dann probiere es bei deinem Client!
Wenn es schon bei Putty fehlschlägt warum glaubst du sollte es dann bei deinem funktionieren?




danja95 hat gesagt.:


> Optional: Wüsste jemand wie man die Ausgaben in einer GUI form halten kann und nicht im CMD fenster?



Ich würde anfangs einfach alles über die Konsole eingeben (bzw. ausgeben) lassen. GUI kann man immer noch einfügen sobald mal ein Grundgerüst der Logik steht. Außerdem ist dadurch die Trennung von Logik und GUI einfacher realisierbar


----------



## danja95 (10. Jun 2014)

Joose hat gesagt.:


> Wenn du es üben willst dann solltest du auch passende Logindaten verwenden.
> Schau dass der Login über Putty funktioniert, wenn ja dann probiere es bei deinem Client!
> Wenn es schon bei Putty fehlschlägt warum glaubst du sollte es dann bei deinem funktionieren?
> 
> ...



Ich muss mich entschuldigen!  habe mich vertippt und meinte MIT erfolg. Habe dieses Problem beheben können ich dem ich mir statt der ZIP die JAR geladen habe und richtig eingebunden habe im Java Editor.

Ok, habe das mal so hinbekommen, aber der gibt mir die Ausgabem im Javaeditor fester raus. Möchte ein seperates fenster das Input auch verarbeiten kann und Tastenkombinationen. Wäre sowas möglich?


----------



## Joose (11. Jun 2014)

Ja so etwas wäre möglich, für den Anfang aber einfach zuviel. 

Arbeite mit der Konsole des Java Editors (wenn diese wie bei Eclipse funktioniert), dort kannst du den Output ebenfalls selbst darstellen lassen (Textform) und auch Eingaben tätigen.
Danach kann man sich langsam an eine GUI rantasten.


----------



## danja95 (11. Jun 2014)

Kann mir wenigstens einer sagen oder machen wie ich den Output in ein Konsolen fenster bekomme und auch eingaben machen kann?


----------



## Joose (11. Jun 2014)

Auf die Konsole schreiben:

```
public void printToConsole(String text){
   System.out.println(text);
}
```

Von der Konsole lesen:


```
public class ReadConsoleScanner {
  public static void main(String[] args) {
    System.out.println("Enter something here : ");
    String whatever;
    Scanner scanIn = new Scanner(System.in);
    Whatever = scanIn.nextLine();
    scanIn.close();            
    System.out.println(Whatever);
  }
}
```


----------



## danja95 (11. Jun 2014)

Einfach unten dran fügen?


----------



## Joose (11. Jun 2014)

danja95 hat gesagt.:


> Einfach unten dran fügen?



Was, wie, wo unten anfügen?
Den Code von oben? Ja den kann man eig fast direkt so verwenden. Ein paar Anpassungen vornehmen und du kannst Sachen von der Konsole einlesen und auf dieser Ausgeben.


----------

