最近项目使用SFTP很多,在使用过程中遇到很多问题,把自己用到的和同事指导后的代码整理出发,记录一下:
需要引用的jar:
jsch-0.1.53.jar
SFTPClient类:
public class SFTPClient { private static final Logger logger = Logger.getLogger(SFTPClient.class); private static int timeoutSecond = 20; private Session session; private ChannelSftp channel; private SFTPClient(Session session, ChannelSftp channel) { this.session = session; this.channel = channel; } public static final SFTPClient connect(String ip, int port, String userName, String password) throws Exception { if (StringUtils.isEmpty(ip)||StringUtils.isEmpty(userName)||StringUtils.isEmpty(password)) { throw new Exception("连接SFTP参数异常"); } Session session = null; Channel channel = null; try { JSch jsch = new JSch(); session = jsch.getSession(userName, ip, port); session.setPassword(password); Properties sshConfig = new Properties(); sshConfig.put("StrictHostKeyChecking", "no"); session.setConfig(sshConfig); session.connect(); channel = session.openChannel("sftp"); channel.connect(timeoutSecond * 1000); logger.info(" Sftp connect success"); return new SFTPClient(session, (ChannelSftp) channel); } catch (JSchException e) { logger.error(" Sftp connect error : ", e); IOUtils.closeQuietly(channel); IOUtils.closeQuietly(session); throw new Exception(" Sftp connect error : "+e.getMessage()); } } public void close() { IOUtils.closeQuietly(channel); IOUtils.closeQuietly(session); } }
StringUtils工具类:
public class StringUtils { /** * 判断字符串是否为空,为空返回true */ public static boolean isEmpty(String str) { return (str == null || "".equals(str.trim()) || "null".equals(str .trim())); } }
IOUtils工具类:
public class IOUtils extends org.apache.commons.io.IOUtils{ public static void closeQuietly(Session session){ if (session != null) { session.disconnect(); } } public static void closeQuietly(Channel channel){ if (channel != null) { channel.disconnect(); } } }
SFTP使用过程完要记得关闭相应的会话session和通道channel,避免连接过多导致不能创建新的SFTP连接,代码仅供参考,
有不对的请包涵和指正