Showing posts with label SFTP. Show all posts
Showing posts with label SFTP. Show all posts

Tuesday, March 15, 2016

JSch - Java Secure Channel

JSch adalah library java yang pernah saya gunakan untuk membangun koneksi ke SFTP Server. JSch dirilis oleh jcraft dengan BSD License. JSch adalah pengimplementasi murni dari SSH2, jadi sangat simple tanpa penambahan fitur-fitur diluar fitur yang dimiliki oleh SSH2. Tersedia beberapa fitur authentikasi yang bisa digunakan juga, yang bisa lebih jelas dilihat pada penjelasan di http://www.jcraft.com/jsch/

Pada contoh yang akan saya berikan adalah contoh penggunaan authentikasi dengan password atau Public Private Key. Jadi bisa di remark saja salah satu baris untuk jenis authentikasi yang tidak digunakan.

Put File
 
public boolean uploadFile(String srcFileInLocal, String dstFileInServer){
    Session session = null;
    ChannelSftp channelSftp = null;
    FileInputStream localFileStream = null;
    boolean result= false;
    try{
        JSch jsch= new JSch();
        
        // untuk penggunaan file PPK sebagai authentikasi
        File ppkFile= new File("C:\key.ppk");
        jsch.addIdentity(ppkFile.getAbsolutePath()); 
        
        // username, server, dan port
        session = jsch.getSession("root", "localhost", 22 );
        
        // untuk penggunaan password sebagai authentikasi
        session.setPassword("password"); 
        
        session.setConfig("StrictHostKeyChecking", "no");
        session.setTimeout(15000);
        session.connect();
        
        channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();
        
        File localFile = new File (srcFileInLocal);
        if (localFile.exists()){
            localFileStream = new FileInputStream(localFile);
            
            channelSftp.put(localFileStream, dstFileInServer);
            localFileStream.close();
            result=true;
        }else{
            logger.warn("Local file not found " + localFile.getAbsolutePath());
        }
        
    }catch (Exception ex) {
        logger.error(ex.getMessage(), ex);
        result = false;
    }finally{
        if(channelSftp != null){
            channelSftp.disconnect();
        }
        if(session != null){
            session.disconnect();
        }
    }
    return result;
}

 


Download File
 
public boolean downloadFile(String srcFileInServer, String dstFileInLocal){
    Session session = null; 
    ChannelSftp channelSftp = null; 
    boolean result = false;
    try{ 
        JSch jsch = new JSch(); 
       
        // untuk penggunaan file PPK sebagai authentikasi
        File ppkFile = new File("C:\key.ppk");
        jsch.addIdentity(ppkFile.getAbsolutePath()); 
        
        // username, server, dan port
        session = jsch.getSession("root", "localhost", 22 );
        
        // untuk penggunaan password sebagai authentikasi
        session.setPassword("password"); 
        
        session.setConfig("StrictHostKeyChecking", "no");
        session.setTimeout(15000);
        session.connect();
        
        channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();
        
        byte[] buffer = new byte[1024]; 
        BufferedInputStream bis = new BufferedInputStream(channelSftp.get(srcFileInServer)); 
        File newFile = new File(dstFileInLocal); 
        FileOutputStream fos = new FileOutputStream(newFile); 
        BufferedOutputStream bos = new BufferedOutputStream(fos); 
        int readCount; 
        
        while( (readCount = bis.read(buffer)) > 0) { 
            System.out.println("Writing: " ); 
            bos.write(buffer, 0, readCount); 
        } 
        bis.close(); 
        bos.close();
        result=true;            
        
    }catch(Exception ex){ 
        logger.error(ex.getMessage(), ex);
        result= false;
    }finally{
        if(channelSftp != null){
            channelSftp.disconnect();
        }
        if(session != null){
            session.disconnect();
        }
    }
    
    return result;
}

 


Delete File
 
public boolean deleteRemoteFile(String fielPathInServer){
    Session session = null; 
    ChannelSftp channelSftp = null; 
    boolean result= false;
    try{ 
        JSch jsch = new JSch();
        
        // untuk penggunaan file PPK sebagai authentikasi
        File ppkFile= new File("C:\key.ppk");
        jsch.addIdentity(ppkFile.getAbsolutePath()); 
        
        // username, server, dan port
        session = jsch.getSession(username, urlHost, Integer.parseInt(portHost) );
        
        // untuk penggunaan password sebagai authentikasi
        session.setPassword("password"); 
        
        session.setConfig("StrictHostKeyChecking", "no");
        session.setTimeout(15000);
        session.connect();
        
        channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();
        
        channelSftp.rm(fielPathInServer);
        result= true;
        
    }catch(Exception ex){ 
        logger.error(ex.getMessage(), ex); 
        result = false;
    }finally{
        if(channelSftp != null){
            channelSftp.disconnect();
        }
        if(session != null){
            session.disconnect();
        }
    }
    
    return result;
}

 

Get List File
 
public List<String> getSFTPListFile(String remoteDir){
    List<String> listFiles = null;
    Session session = null;
    ChannelSftp channelSftp = null;
    
    try{
        JSch jsch= new JSch();
        
        // untuk penggunaan file PPK sebagai authentikasi
        File ppkFile= new File("C:\key.ppk");
        jsch.addIdentity(ppkFile.getAbsolutePath());
        
        // username, server, dan port
        session = jsch.getSession(username, urlHost, Integer.parseInt(portHost) );
        
        // untuk penggunaan password sebagai authentikasi
        session.setPassword("password"); 
        
        session.setConfig("StrictHostKeyChecking", "no");
        session.setTimeout(15000);
        session.connect();
        
        channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();
        
        Vector<LsEntry> listEntry= channelSftp.ls(remoteDir);
        listFiles= new ArrayList<String>();
        
        for(LsEntry lsEntry : listEntry){
            if(!lsEntry.getAttrs().isDir()){
                listFiles.add(lsEntry.getFilename());
            }
        }
        
    }catch (Exception e) {
        logger.error(e.getMessage(), e);
    }finally{
        if(channelSftp != null){
            channelSftp.disconnect();
        }
        if(session != null){
            session.disconnect();
        }
    }
    
    return listFiles;
}

 




FTP & SFTP Server Portable

Pada kali ini saya akan mengenalkan sebuah tools yang pernah saya gunakan pada OS Windows.
Sebagai penghuni dunia IT konsultan, mungkin ada saatnya akan mendapatkan requirement dari client untuk membuat aplikasi yang bisa terintegrasi dengan sistem internal lain yang sudah berjalan, dan cara integrasinya mungkin saja menggunakan FTP/SFTP.
Sebelum pembahasan lebih lanjut mari bahas sedikit pengertian dari FTP/SFTP.

FTP (File Transfer Protocol) adalah protokol yang digunakan untuk mengupload dan/atau mendownload file antara client dan server. Authentikasi pada FTP menggunakan username dan password yang dikirim ke server secara plain (tidak terenkripsi). Begitu juga dengan proses pengiriman file nya yang tidak terenkripsi.

SFTP (Secure File Transfer Protocol) adalah fitur gabungan antara FTP dan SCP (Secure Copy). Protokol ini mengkombinasikan fleksibilitas FTP dan keamanan dari SCP. Protokol ini mengenkripsi komunikasi data anda dengan memberikan standard keamanan yang lebih baik dan membantu anda dalam mengamankan data anda dari "pencuri" data.

Untuk pengguna biasa FTP masih bisa di terima sebagai media transfer file sehari-hari. Tetapi untuk penggunaan pada client enterprise biasanya mereka menggunakan SFTP sebagai standar nya.

Dalam fase development para programmer tentunya perlu untuk melakukan testing dari hasil codingnya. Bila kita menggunakan server terpisah maka akan repot karena perlu login melalui FTP client untuk melihat file yang sudah dikirim. Maka pastilah akan dicari cara agar SFTP server bisa berjalan di localhost. Saya yang pada saat itu menggunakan OS Windows berusaha untuk mencari SFTP server yang tidak perlu di install dan akhirnya menemukannya pada http://www.coreftp.com/server/

Harap diperhatikan bahwa untuk SFTP server yang portable bukanlah yang ada pada link yg mengandung kata 64-bit atau 32-bit. Tetapi ada pada bagian agak kebawah apabila kita scroll:


atau direct link nya adalah : http://www.coreftp.com/server/download/msftpsrvr.exe

Setelah beres didownload dan dirunning penampakannya adalah seperti berikut :


Terdapat beberapa field yang perlu diisi untuk konfigurasi.
User : user yang akan login
Password : password user login
Port : setting port yang akan digunakan
Root Path : lokasi direktori folder yang akan digunakan sebagai root direktori SFTP server

Untuk merunning mini SFTP server kita tinggal klik tombol start saja.