# Java Secure Channel



## oschli (7. Mrz 2006)

Hi,

hat jemand von euch Erfahrung mit Java Secure Channel? 
Ich möchte über einen scp-Befehl eine Datei oder Order von einem Linuxrechner auf meinen lokalen Pc kopieren.

www.jcraft.com/jsch/index.html


----------



## oschli (7. Mrz 2006)

Hab mir mal die Beispiel unter www.jcraft.com/jsch/examples/ angeschaut.

Dort hab ich versucht das Beispiel ScpFrom.java zum laufen zu bringen. Nachdem ersten anmelden kommt die Abfrage ob ich wirklich mit dem Server eine Verbindung aufbauen will. 

"The authenticity of host '****' can't be established.
  RSA key fingerprint is *****
  Are you sure you want to continue connecting?"

Wenn ich dort mit ja antworte gibt er mir diefolgende Fehlermeldung aus

```
com.jcraft.jsch.JSchException: Auth fail
```

Woran könnte das liegen?


----------



## oschli (4. Apr 2006)

Hi,

hab es hinbekommen dass mir eine Datei kopiert wird! 

Was muss ich ändern damit der Inhalt eines Verzeichnisses kopiert wird.

Danke



```
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.io.OutputStream;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;


import com.jcraft.jsch.*;


public class Connect {

	public static class WrongPassword extends Exception{};
	
	public Connect (){
		
		hostname="hostname";
		user="user";
		source="/home/mksadmin/XML/log.xml";
		path = System.getProperty("user.dir");
		destination=path+"//logs";
	
	}
	
    public void copyLogfile () throws WrongPassword {

	    FileOutputStream fos=null;
	    try{
	    	String prefix=null;
		      if(new File(destination).isDirectory()){
		        prefix=destination+File.separator;
		      }

		      JSch jsch=new JSch();
		      Session session=jsch.getSession(user, hostname, 22);

		      UserInfo ui=new MyUserInfo();
		     
		      session.setUserInfo(ui);
		     
		      session.connect();

		      String command="scp -f "+source;
		      Channel channel=session.openChannel("exec");
		      ((ChannelExec)channel).setCommand(command);

		      // get I/O streams for remote scp
		      OutputStream out=channel.getOutputStream();
		      InputStream in=channel.getInputStream();

		      channel.connect();

		      byte[] buf=new byte[1024];

		      // send '\0'
		      buf[0]=0; out.write(buf, 0, 1); out.flush();

		      while(true){
		    	  int c=checkAck(in);
		    	  if(c!='C'){
		    		  break;
		    	  }
		    	  // read '0644 '
		    	  in.read(buf, 0, 5);
		    	  long filesize=0L;
		    	  while(true){
		    		  if(in.read(buf, 0, 1)<0){
		    			  // error
		    			  break; 
		    		  }
		    		  if(buf[0]==' '){
		    			  break;
		    		  }
		    		  filesize=filesize*10L+(long)(buf[0]-'0');
		    	  }
		    	  String file=null;
		    	  for(int i=0;;i++){
		    		  in.read(buf, i, 1);
		    		  if(buf[i]==(byte)0x0a){
		    			  file=new String(buf, 0, i);
		    			  break;
		    		  }
		    	  }

		    	  System.out.println("filesize="+filesize+", file="+file);

		    	  // send '\0'
		    	  buf[0]=0; out.write(buf, 0, 1); out.flush();

		    	  // read a content of lfile
		    	  fos=new FileOutputStream(prefix==null ? destination : prefix+file);
		    	  int foo;
		    	  while(true){
		    		  if(buf.length<filesize) {
		    			  foo=buf.length;
		    		  }
		    		  else{
		    			  foo=(int)filesize;
		    		  }
		    		  foo=in.read(buf, 0, foo);
		    		  if(foo<0){
		    			  // error 
		    			  break;
		    		  }
		    		  fos.write(buf, 0, foo);
		    		  filesize-=foo;
		    		  if(filesize==0L){
		    			  break;
		    		  }
		    	  }
		    	  fos.close();
		    	  fos=null;

		    	  byte[] tmp=new byte[1];

		    	  if(checkAck(in)!=0){
		    		  System.err.println("Error and End");
		    		  System.exit(0);
		    	  }

		    	  // send '\0'
		    	  buf[0]=0; out.write(buf, 0, 1); out.flush();
		      }

		      session.disconnect();
	    }
		catch(Exception e){
			System.out.println(e);
		    try{
		    	if(fos!=null){
		    		fos.close();
		    	}
		    }
		    catch(Exception ee){
		    	
		    }
		}
    }
    
    static int checkAck(InputStream in) throws IOException{
	    int b=in.read();
	    // b may be 0 for success,
	    //          1 for error,
	    //          2 for fatal error,
	    //          -1
	    if(b==0) return b;
	    if(b==-1) return b;

	    if(b==1 || b==2){
	      StringBuffer sb=new StringBuffer();
	      int c;
	      do {
		c=in.read();
		sb.append((char)c);
	      }
	      while(c!='\n');
	      if(b==1){ // error
		System.out.print(sb.toString());
	      }
	      if(b==2){ // fatal error
		System.out.print(sb.toString());
	      }
	    }
	    return b;
	  }
	
	private String hostname;
	private String user;
	private String password;
	private String source;
	private String destination;
	private String path;
	private String command;
	
	public static void main(String[] args) {
		Connect test = new Connect();
		try {
			test.copyLogfile();
		} catch (WrongPassword e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("ferdisch");
		
	}
	
	public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{
	    public String getPassword(){ return passwd; }
	    public boolean promptYesNo(String str){
	      
	       return true;
	    }

	    String passwd;
	    JTextField passwordField=(JTextField)new JPasswordField(20);
	  
	    public String getPassphrase(){ return null; }
	    public boolean promptPassphrase(String message){ return false; }
	    public boolean promptPassword(String message){
	      Object[] ob={passwordField}; 
	      int result=
	        JOptionPane.showConfirmDialog(null, ob, message,
	                                      JOptionPane.OK_CANCEL_OPTION);
	      if(result==JOptionPane.OK_OPTION){
	        passwd=passwordField.getText();
	        return true;
	      }
	      else{ 
	        return false; 
	      }
	    }
	    public void showMessage(String message){
	      JOptionPane.showMessageDialog(null, message);
	    }

	    final GridBagConstraints gbc = 
	      new GridBagConstraints(0,0,1,1,1,1,
	                             GridBagConstraints.NORTHWEST,
	                             GridBagConstraints.NONE,
	                             new Insets(0,0,0,0),0,0);
	    private Container panel;
	    public String[] promptKeyboardInteractive(String destination,
	                                              String name,
	                                              String instruction,
	                                              String[] prompt,
	                                              boolean[] echo){
	      panel = new JPanel();
	      panel.setLayout(new GridBagLayout());

	      gbc.weightx = 1.0;
	      gbc.gridwidth = GridBagConstraints.REMAINDER;
	      gbc.gridx = 0;
	      panel.add(new JLabel(instruction), gbc);
	      gbc.gridy++;

	      gbc.gridwidth = GridBagConstraints.RELATIVE;

	      JTextField[] texts=new JTextField[prompt.length];
	      for(int i=0; i<prompt.length; i++){
	        gbc.fill = GridBagConstraints.NONE;
	        gbc.gridx = 0;
	        gbc.weightx = 1;
	        panel.add(new JLabel(prompt[i]),gbc);

	        gbc.gridx = 1;
	        gbc.fill = GridBagConstraints.HORIZONTAL;
	        gbc.weighty = 1;
	        if(echo[i]){
	          texts[i]=new JTextField(20);
	        }
	        else{
	          texts[i]=new JPasswordField(20);
	        }
	        panel.add(texts[i], gbc);
	        gbc.gridy++;
	      }

	      if(JOptionPane.showConfirmDialog(null, panel, 
	                                       destination+": "+name,
	                                       JOptionPane.OK_CANCEL_OPTION,
	                                       JOptionPane.QUESTION_MESSAGE)
	         ==JOptionPane.OK_OPTION){
	        String[] response=new String[prompt.length];
	        for(int i=0; i<prompt.length; i++){
	          response[i]=texts[i].getText();
	        }
		return response;
	      }
	      else{
	        return null;  // cancel
	      }
	    }
	  }
}
```


----------

