# SCP und die Frage: Wie geh ich damit um?



## Kaladial (4. Dez 2008)

moin

ich ma wieder  
also folgendes problem: 
wir haben ne neue kamera und diese hat keinen FTP mehr als schnittstelle mit windows, 
sondern nutzt nun SCP... 

Nun will ich also dateien an die kamera senden dies aber mittels SCP

also hab ich n bissi gegooglet und bin auf die seite : http://www.jcraft.com/jsch/index.html
gestossen und hab mir da das entsprechende jar file runter geladen ... 

leider hab ich auf der seite null komma nix anleitung gefunden wie ich nun damit in meinem java programm umgehen muss.. 

dafür brauch ich nun euch  

also eingebunden ist das jar file... 
aber wie kann ich : 

- eine verbindung zu der kamera herstellen (ip is bekannt) ?
- wie kann ich verzeichnisse wechseln ?
- wie sind die befehle zum senden von dateien ?
- und wie schliesse ich die connection wieder?

also im groben per ftp sah das so aus: 


```
FTPClient client = new FTPClient();
		try{
			client.connect(camIP);
			client.login(GlobaleVariablen.cam_login_name, GlobaleVariablen.cam_login_pw);
			client.changeWorkingDirectory(GlobaleVariablen.cam_dir);
			client.setFileType(FTPClient.BINARY_FILE_TYPE); 
			client.storeFile(dateiname, new FileInputStream(new File(dateiname))); 
			client.disconnect();
		}catch(IOException iox){System.out.println(iox);}
```

^^ sowas brauch ich halt nun für SCP ... 

mfg Kala


----------



## foobar (4. Dez 2008)

Erstmal Doku lesen, Beispiele angucken und dann eine konkrete Frage stellen.

SCP-Beispiel:
http://www.jcraft.com/jsch/examples/ScpTo.java


----------



## Kaladial (4. Dez 2008)

so ok ich hab jetzt das gepostete beispiel ausprobiert ... 

das problem: in der funktion checkAck()

bekomm ich bei int b=in.read(); 

immer -1 raus ...


----------



## Kaladial (5. Dez 2008)

so also ich hab mal meinen code soweit angepasst wie ich ds brauche ... 
das problem wie gesagt ist das checkAck immer eine -1 zurück gibt... 
woran könnte das liegen ? 


```
package testapp;

import com.jcraft.jsch.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;

public class ScpTo{
	public static void main(String[] arg){
	    FileInputStream fis=null;
	    try{
			String lfile="test.txt";
			String user="root";
			String host="10.0.88.55";
			//String rfile="//mnt//nand//AVS3//test.txt";
			String rfile="//mnt//nand//AVS3//test.txt";
			//String rfile="test.txt";
			
			JSch jsch=new JSch();
			Session session=jsch.getSession(user, host, 22);
			
			// username and password will be given via UserInfo interface.
			UserInfo ui=new MyUserInfo();
			session.setUserInfo(ui);
			session.connect();
			
			System.out.println("session.isConnected:"+session.isConnected());
			
			// exec 'scp -t rfile' remotely
			String command="scp -p -t "+rfile;
			System.out.println("command:"+command);
			
			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();

			System.out.println("channel.isConnected:"+channel.isConnected());
			
			if(checkAck(in)!=0){
//				System.exit(0);
			}

			//send "C0644 filesize filename", where filename should not include '/'
			long filesize=(new File(lfile)).length();
			System.out.println("filesize:"+filesize);
			command="C0644 "+filesize+" ";
			if(lfile.lastIndexOf('/')>0){
				command+=lfile.substring(lfile.lastIndexOf('/')+1);
			}else{
				command+=lfile;
			}
			command+="\n";
			System.out.println("command:"+command);
			out.write(command.getBytes()); out.flush();
			if(checkAck(in)!=0){
	//			System.exit(0);
			}

			// send a content of lfile
			fis=new FileInputStream(lfile);
			byte[] buf=new byte[1024];
			while(true){
				int len=fis.read(buf, 0, buf.length);
				if(len<=0) break;
				out.write(buf, 0, len); //out.flush();
			}
			fis.close();
			fis=null;
			// send '\0'
			buf[0]=0; out.write(buf, 0, 1); out.flush();
			if(checkAck(in)!=0){
		//		System.exit(0);
			}
			out.close();

			channel.disconnect();
			session.disconnect();

			System.exit(0);
	    } catch(Exception e){
	    	System.out.println(e);
	    	try{if(fis!=null)fis.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
		
		System.out.println("b1:"+b);
		
		if(b==0) return b;
		if(b==-1) return 0;

		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());
			}
		}
		System.out.println("b:"+b);
		return b;
	}

	public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{
		String passwd="****";

		public String getPassword(){ return passwd; }
		public boolean promptYesNo(String str){	return true; }
		public String getPassphrase(){ return null; }
		public boolean promptPassphrase(String message){ return true; }
		public boolean promptPassword(String message){ return true; }
		public void showMessage(String message){}
		public String[] promptKeyboardInteractive(String destination,
                                              String name,
                                              String instruction,
                                              String[] prompt,
                                              boolean[] echo){
			String[] response=null;
			return response;
		}
	}
}
```

ausgabe:

session.isConnected:true
command:scp -p -t //mnt//nand//AVS3//test.txt
channel.isConnected:true
b1:-1
filesize:4
command:C0644 4 test.txt

pls help  
mfg Kala


----------



## foobar (5. Dez 2008)

Kannst du überhaupt per scp in der Shell ein File hochladen?


----------



## Kaladial (5. Dez 2008)

jaein ...

also auf der kamera läuft ein read only betriebssystem das ich aber per befehl in der shell (wenn ich mich per ubuntu -> ssh connecte remounten kann so das es RW rechte hat aber auch nur in dem verzeichnis: /mnt/nand/ 

daher hab ich ja bei dem rfile den pfad mit angegeben (ich weis aber nicht ob das so stimmt)


----------



## tuxedo (5. Dez 2008)

Ähm, Backslashes "\" musst du "Escapen". Aber normale "Slashes" musst du nicht doppelt schreiben.

Also sollte der Pfad so lauten:


```
String rfile="/mnt/nand/AVS3/test.txt";
```


- Alex


----------



## Kaladial (5. Dez 2008)

ja hatte ich auch schon versucht ... bringt nur leider nix ...


----------

