public static void downloadFile ( Session session , String remoteFilePath , String localFilePath ) throws Exception { // exec 'scp -f rfile' remotely String command = "scp -f " + remoteFilePath ; 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 != ' ' ) { 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 ] - ' ' ) ; } 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 FileOutputStream fos = new FileOutputStream ( localFilePath ) ; 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 ( ) ; if ( checkAck ( in ) != 0 ) { throw new RuntimeException ( ) ; } // send '\0' buf [ 0 ] = 0 ; out . write ( buf , 0 , 1 ) ; out . flush ( ) ; } }
Download a remote file via scp .