1、SFTP信用公钥配置

1.1 客户端生成密钥对

以DSA举例:

ssh-keygen –t dsa

执行该命令后,在home/用户名/.ssh目录下,会生成id_dsa和id_dsa.pub两个文件

1.2 将id_dsa.pub公钥文件上传至服务端的home/用户名/.ssh目录下

scp id_dsa.pub 用户名@服务端IP:/home/用户名/.ssh

此时还需要输入密码

1.3服务端添加信任公钥

登录服务端,进入到/home/用户名/.ssh目录,将刚刚拷贝的id_dsa.pub文件的内容加入到authorized_keys文件中

cat id_dsa.pub >> authorized_keys

1.4 服务端分别修改authorized_key文件和.ssh的权限为600700

chmod 600 authorized_keys

chmod 700 .ssh

1.5 测试

在客户端执行:

sftp –oPort=端口 用户名@服务端IP

如果不需要输入密码就可以连上,则说明配置成功

2、基于JSCH库的sftp操作

  1. public class SftpUtil {
  2. private final static Logger          log       = LoggerFactory.getLogger(SftpUtil.class);
  3. /** SFTP */
  4. public static final String           SFTP      = "sftp";
  5. /** 通道 */
  6. private ChannelSftp                  channel;
  7. /** session */
  8. private Session                      session;
  9. /** 规避多线程并发 */
  10. private static ThreadLocal<SftpUtil> sftpLocal = new ThreadLocal<SftpUtil>();
  11. /**
  12. * 获取sftpchannel
  13. *
  14. * @param connectConfig 连接配置
  15. * @return
  16. * @throws Exception
  17. * @throws JSchException
  18. */
  19. private void init(ConnectConfig connectConfig) throws Exception {
  20. String host = connectConfig.getHost();
  21. int port = connectConfig.getPort();
  22. String userName = connectConfig.getUserName();
  23. //创建JSch对象
  24. JSch jsch = new JSch();
  25. //添加私钥(信任登录方式)
  26. if (StringUtils.isNotBlank(connectConfig.getPrivateKey())) {
  27. jsch.addIdentity(connectConfig.getPrivateKey());
  28. }
  29. session = jsch.getSession(userName, host, port);
  30. if (log.isInfoEnabled()) {
  31. log.info(" JSCH Session created,sftpHost = {}, sftpUserName={}", host, userName);
  32. }
  33. //设置密码
  34. if (StringUtils.isNotBlank(connectConfig.getPassWord())) {
  35. session.setPassword(connectConfig.getPassWord());
  36. }
  37. Properties config = new Properties();
  38. config.put("StrictHostKeyChecking", "no");
  39. session.setConfig(config);
  40. //设置超时
  41. session.setTimeout(connectConfig.getTimeout());
  42. //建立连接
  43. session.connect();
  44. if (log.isInfoEnabled()) {
  45. log.info("JSCH Session connected.sftpHost = {}, sftpUserName={}", host, userName);
  46. }
  47. //打开SFTP通道
  48. channel = (ChannelSftp) session.openChannel(SFTP);
  49. //建立SFTP通道的连接
  50. channel.connect();
  51. if (log.isInfoEnabled()) {
  52. log.info("Connected successfully to sftpHost = {}, sftpUserName={}", host, userName);
  53. }
  54. }
  55. /**
  56. * 是否已连接
  57. *
  58. * @return
  59. */
  60. private boolean isConnected() {
  61. return null != channel && channel.isConnected();
  62. }
  63. /**
  64. * 获取本地线程存储的sftp客户端
  65. *
  66. * @return
  67. * @throws Exception
  68. */
  69. public static SftpUtil getSftpUtil(ConnectConfig connectConfig) throws Exception {
  70. SftpUtil sftpUtil = sftpLocal.get();
  71. if (null == sftpUtil || !sftpUtil.isConnected()) {
  72. sftpLocal.set(new SftpUtil(connectConfig));
  73. }
  74. return sftpLocal.get();
  75. }
  76. /**
  77. * 释放本地线程存储的sftp客户端
  78. */
  79. public static void release() {
  80. if (null != sftpLocal.get()) {
  81. sftpLocal.get().closeChannel();
  82. sftpLocal.set(null);
  83. }
  84. }
  85. /**
  86. * 构造函数
  87. * <p>
  88. * 非线程安全,故权限为私有
  89. * </p>
  90. *
  91. * @throws Exception
  92. */
  93. private SftpUtil(ConnectConfig connectConfig) throws Exception {
  94. super();
  95. init(connectConfig);
  96. }
  97. /**
  98. * 关闭通道
  99. *
  100. * @throws Exception
  101. */
  102. public void closeChannel() {
  103. if (null != channel) {
  104. try {
  105. channel.disconnect();
  106. } catch (Exception e) {
  107. log.error("关闭SFTP通道发生异常:", e);
  108. }
  109. }
  110. if (null != session) {
  111. try {
  112. session.disconnect();
  113. } catch (Exception e) {
  114. log.error("SFTP关闭 session异常:", e);
  115. }
  116. }
  117. }
  118. /**
  119. * 下载文件
  120. *
  121. * @param downDir 下载目录
  122. * @param src 源文件
  123. * @param dst 保存后的文件名称或目录
  124. * @throws Exception
  125. */
  126. public void downFile(String downDir, String src, String dst) throws Exception {
  127. channel.cd(downDir);
  128. channel.get(src, dst);
  129. }
  130. /**
  131. * 删除文件
  132. *
  133. * @param filePath 文件全路径
  134. * @throws SftpException
  135. */
  136. public void deleteFile(String filePath) throws SftpException {
  137. channel.rm(filePath);
  138. }
  139. @SuppressWarnings("unchecked")
  140. public List<String> listFiles(String dir) throws SftpException {
  141. Vector<LsEntry> files = channel.ls(dir);
  142. if (null != files) {
  143. List<String> fileNames = new ArrayList<String>();
  144. Iterator<LsEntry> iter = files.iterator();
  145. while (iter.hasNext()) {
  146. String fileName = iter.next().getFilename();
  147. if (StringUtils.equals(".", fileName) || StringUtils.equals("..", fileName)) {
  148. continue;
  149. }
  150. fileNames.add(fileName);
  151. }
  152. return fileNames;
  153. }
  154. return null;
  155. }
  156. }

 说明:

2.1 ConnectConfig包含了建立sftp连接所需要的全部参数信息

2.2 如果按照第一步进行了sftp的信任公钥配置,则需要通过调用jsch的addIdentity方法将密钥对中的私钥id_dsa设置进去

  1. //添加私钥(信任登录方式)
  2. if (StringUtils.isNotBlank(connectConfig.getPrivateKey())) {
  3. jsch.addIdentity(connectConfig.getPrivateKey());
  4. }

2.3 为了避免频繁的进行连接建立和连接释放操作,一般会定义为单例模式,但存在某些业务场景,需要在同一个线程执行完连续几次完整的业务操作后,将连接释放掉。如果采用单例,那么多线程并发的场景下会出现共享资源竞争导致的并发问题,譬如在B线程执行业务的过程中,A线程将连接释放。因此,可以借助ThreadLocal来避免该问题。

  1. /**
  2. * 获取本地线程存储的sftp客户端
  3. *
  4. * @return
  5. * @throws Exception
  6. */
  7. public static SftpUtil getSftpUtil(ConnectConfig connectConfig) throws Exception {
  8. SftpUtil sftpUtil = sftpLocal.get();
  9. if (null == sftpUtil || !sftpUtil.isConnected()) {
  10. sftpLocal.set(new SftpUtil(connectConfig));
  11. }
  12. return sftpLocal.get();
  13. }
  14. /**
  15. * 释放本地线程存储的sftp客户端
  16. */
  17. public static void release() {
  18. if (null != sftpLocal.get()) {
  19. sftpLocal.get().closeChannel();
  20. sftpLocal.set(null);
  21. }
  22. }

SFTP信任公钥配置及JSCH库的更多相关文章

  1. linux信任公钥的配置

    一.每个用户都有自己的家目录 访问方式是:~/.ssh/id_rsa.pub 使用~就是表示家目录. 具体家目录在哪里,在用户密码配置文件中:/etc/passwd中.第6列的值就是. 可以使用~访问 ...

  2. Git 实用基础(配置,建库,提交,推送 GitHub)

    Git 实用基础(配置,建库,提交,推送 GitHub) SVN ? Git ? 目前市面上主流的版本控制系统就是 SVN 和 Git . 两者的区别简单通俗地说就是,版本数据是否有在本地. 如果觉得 ...

  3. Linux中安装C++编译器codeBlock,并配置opencv链接库

    1.Linux中安装codeBlock https://blog.csdn.net/xinyunyishui/article/details/50967395 2.CodeBlock中的中文显示不完全 ...

  4. Git SSH公钥配置

    https://www.cnblogs.com/smuxiaolei/p/7484678.html https://blog.csdn.net/weixin_42063071/article/deta ...

  5. SFTP 安装与配置

    SFTP 安装与配置 sftp 是 Secure File Transfer Protocol 的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH 的一部分,由于这种 ...

  6. rsa字符串格式公钥转换python rsa库可识别的公钥形式

    在爬虫分析的时候,经常在网页上看到如下格式的rsa公钥: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC7kw8r6tq43pwApYvkJ5laljaN9BZb21 ...

  7. Sftp搭建与配置参考

    Sftp搭建与配置参考 1. 介绍 sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一 ...

  8. Gerrit+apache+H2数据库简单安装配置及建库流程

    Gerrit 是一个基于 Web 的代码评审和项目管理的工具,面向基于 Git 版本控制系统的项目.因此需要Apache.Mysql.GIT等相关软件的支持 系统配置: 新装的UBANTU LINUX ...

  9. maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。

    注:本文来源于:杨四郎2018  <maven的安装.路径配置.修改库文件路径和eclipse中的配置.创建maven工程> 一.maven的安装 首先,先到官网去下载maven.这里是官 ...

随机推荐

  1. SSH 5W学习

    what SSH的英文全称为Secure Shell,是IETF(Internet Engineering Task Force)的Network Working Group所制定的一族协议,其目的是 ...

  2. Django学习(七) 创建第一个Django项目

    如果这是你第一次使用Django,你必须进行一些初始设置.即,您将需要自动生成一些代码,建立了Django项目. 从命令行.cd进入一个目录,你想要存储您的代码,然后运行以下命令: django-ad ...

  3. bat加载和分离VHD

    VHD: vhd:虚拟磁盘格式 [详看 百科 ] 应用: 建立VHD文件,把系统装进VHD,然后从VHD启动. 优点: 因为系统在一个文件里,所以有可删,可移动,可快照的优点. VHD装系统方法: 请 ...

  4. inPolygonTest学习和C++实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 此篇博客实现了判定平面一点是否在给定多边形内部的功能.精确,性能优良,因为只包含加法和乘法运算,效 ...

  5. BZOJ NOI十连测 第一测 T1

    思路:首先考虑t=1的情况,t等于1,那么所有位置的颜色相同,我们不用考虑概率的问题,那么,k+d*x在模d下都相等,我们考虑预处理一个数组s[i][j],代表d为i,起始位置为j的等差数列的和,这个 ...

  6. QT 4.87 changes

    http://blog.qt.io/blog/2015/05/26/qt-4-8-7-released/ Qt 4.8.7 is a bug-fix release. It maintains bot ...

  7. 【错误】:Could not open JDBC Connection for transaction; nested exception is: Communications link failure;The last packet sent successfully to the server was 1 milliseconds ago

    # #错误日志 2016-11-10 16:19:20,834 ERROR [org.quartz.core.JobRunShell] - Job DEFAULT.jobtask threw an u ...

  8. gdb 调试coredump文件过程

    gdb 调试coredump文件过程: 第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到 ...

  9. UIView 弹出动画

    // 展开动画 - (void)beginAnimations { CGContextRef context = UIGraphicsGetCurrentContext(); [UIView begi ...

  10. Struts2+Spring集成合并

    前边单独总结了Struts2,Spring和Ibaits框架了,那么怎么结合使用呢?这次先来看一下Sturts2和Spring的集成合并.其实挺简单的,就是导入各自的jar包以及连接彼此的jar包,分 ...