/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ /** * This program will demonstrate the file transfer from remote to local * $ CLASSPATH=.:../build javac ScpFrom.java * $ CLASSPATH=.:../build java ScpFrom user@remotehost:file1 file2 * You will be asked passwd. * If everything works fine, a file 'file1' on 'remotehost' will copied to * local 'file1'. * */ import com.jcraft.jsch.*; import java.awt.*; import javax.swing.*; import java.io.*; public class ScpFrom{ public static void main(String[] arg){ if(arg.length!=2){ System.err.println("usage: java ScpFrom user@remotehost:file1 file2"); System.exit(-1); } FileOutputStream fos=null; try{ String user=arg[0].substring(0, arg[0].indexOf('@')); arg[0]=arg[0].substring(arg[0].indexOf('@')+1); String host=arg[0].substring(0, arg[0].indexOf(':')); String rfile=arg[0].substring(arg[0].indexOf(':')+1); String lfile=arg[1]; String prefix=null; if(new File(lfile).isDirectory()){ prefix=lfile+File.separator; } 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(); // exec 'scp -f rfile' remotely rfile=rfile.replace("'", "'\\''"); rfile="'"+rfile+"'"; String command="scp -f "+rfile; 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 ? lfile : prefix+file); int foo; while(true){ if(buf.length