반응형

SFTP 접속하는 라이브러리는 jsch 다.

sftp: <http://www.jcraft.com/jsch/>

 

내서버에서 다른 서버 22번 sftp 접속하는 방법이다.

 

public class FTPUtil {

	private static Log logger = LogFactory.getLog(FTPUtil.class);

    private Session session = null;
    private Channel channel = null;
    private ChannelSftp channelSftp = null;

   // SFTP 서버연결
    public void connect(String user, String url, String password) throws Exception{

        logger.info(url);
        //JSch 객체 생성
        JSch jsch = new JSch();
        try {
            //세션객체 생성 ( user , host, port )
            logger.info("session");
            session = jsch.getSession(user, url);
            //password 설정
            session.setPassword(password);
            //세션관련 설정정보 설정
            java.util.Properties config = new java.util.Properties();
            //호스트 정보 검사하지 않는다.
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            //접속
            session.connect();
            //sftp 채널 접속
            channel = session.openChannel("sftp");
            channel.connect();

        } catch (JSchException e) {
            logger.error("connect JSchException error : " +e.toString());
            throw new Exception("JSchException");
        } catch (Exception e) {
        	 logger.error("connect error : " +e.toString());
             throw new Exception(e.toString());
		}
        channelSftp = (ChannelSftp) channel;
    }

    // 단일 파일 업로드
    public void upload( String dir , File file){
        FileInputStream in = null;
        try{ //파일을 가져와서 inputStream에 넣고 저장경로를 찾아 put
            in = new FileInputStream(file);
            channelSftp.cd(dir);
            channelSftp.put(in,file.getName());
        }catch(SftpException se){
            se.printStackTrace();
        }catch(FileNotFoundException fe){
            fe.printStackTrace();
        }finally{
            try{
                in.close();
            } catch(IOException ioe){
                ioe.printStackTrace();
            }
        }
    }


    public ChannelSftp moveDirectory(String dir){
    	 try{ //경로탐색후 inputStream에 데이터를 넣음
             channelSftp.cd(dir); // 결로 이동
         }catch(SftpException se){
             se.printStackTrace();
         }
		return channelSftp;
    }

    /**
     *
     * @param dir  서버의 저장되어 있는 경로
     * @param fileNm 다운받으려는 파일명
     * @param saveDir 현 서버의 다운받으려고 하는 경로
     */
    public void download(String dir, String fileNm, String saveDir){
        InputStream in = null;
        FileOutputStream out = null;
        //String path = "...";
        try{ //경로탐색후 inputStream에 데이터를 넣음
            channelSftp.cd(dir); // 결로 이동
            in = channelSftp.get(fileNm);

        }catch(SftpException se){
        	logger.error("download " +se.toString());
        }
        try {
            out = new FileOutputStream(new File(saveDir));
            int i;
            while ((i = in.read()) != -1) {
                out.write(i);
            }

        } catch (IOException e) {
        	logger.error("download io error : " +e.toString());
        } finally {
            try {
                out.close();
                in.close();
            } catch (IOException e) {
            	logger.error("download close error : " +e.toString());
            }
        }

    }

    /**
     * 인자로 받은 경로의 파일 리스트를 리턴한다.
     * @param path
     * @return
     */
    public Vector<ChannelSftp.LsEntry> getFileList(String path, String lsCmd) {

    	Vector<ChannelSftp.LsEntry> list = null;
    	try {
    		channelSftp.cd(path);
    		list = channelSftp.ls(lsCmd);
		} catch (SftpException e) {
			e.printStackTrace();
			return null;
		}
    	return list;
    }

    // 파일서버와 세션 종료
    public void disconnect(){
        channelSftp.quit();
        session.disconnect();
    }
}
반응형

+ Recent posts