SFTP信任公钥配置及JSCH库
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的权限为600和700
chmod 600 authorized_keys
chmod 700 .ssh
1.5 测试
在客户端执行:
sftp –oPort=端口 用户名@服务端IP
如果不需要输入密码就可以连上,则说明配置成功
2、基于JSCH库的sftp操作
- public class SftpUtil {
- private final static Logger log = LoggerFactory.getLogger(SftpUtil.class);
- /** SFTP */
- public static final String SFTP = "sftp";
- /** 通道 */
- private ChannelSftp channel;
- /** session */
- private Session session;
- /** 规避多线程并发 */
- private static ThreadLocal<SftpUtil> sftpLocal = new ThreadLocal<SftpUtil>();
- /**
- * 获取sftpchannel
- *
- * @param connectConfig 连接配置
- * @return
- * @throws Exception
- * @throws JSchException
- */
- private void init(ConnectConfig connectConfig) throws Exception {
- String host = connectConfig.getHost();
- int port = connectConfig.getPort();
- String userName = connectConfig.getUserName();
- //创建JSch对象
- JSch jsch = new JSch();
- //添加私钥(信任登录方式)
- if (StringUtils.isNotBlank(connectConfig.getPrivateKey())) {
- jsch.addIdentity(connectConfig.getPrivateKey());
- }
- session = jsch.getSession(userName, host, port);
- if (log.isInfoEnabled()) {
- log.info(" JSCH Session created,sftpHost = {}, sftpUserName={}", host, userName);
- }
- //设置密码
- if (StringUtils.isNotBlank(connectConfig.getPassWord())) {
- session.setPassword(connectConfig.getPassWord());
- }
- Properties config = new Properties();
- config.put("StrictHostKeyChecking", "no");
- session.setConfig(config);
- //设置超时
- session.setTimeout(connectConfig.getTimeout());
- //建立连接
- session.connect();
- if (log.isInfoEnabled()) {
- log.info("JSCH Session connected.sftpHost = {}, sftpUserName={}", host, userName);
- }
- //打开SFTP通道
- channel = (ChannelSftp) session.openChannel(SFTP);
- //建立SFTP通道的连接
- channel.connect();
- if (log.isInfoEnabled()) {
- log.info("Connected successfully to sftpHost = {}, sftpUserName={}", host, userName);
- }
- }
- /**
- * 是否已连接
- *
- * @return
- */
- private boolean isConnected() {
- return null != channel && channel.isConnected();
- }
- /**
- * 获取本地线程存储的sftp客户端
- *
- * @return
- * @throws Exception
- */
- public static SftpUtil getSftpUtil(ConnectConfig connectConfig) throws Exception {
- SftpUtil sftpUtil = sftpLocal.get();
- if (null == sftpUtil || !sftpUtil.isConnected()) {
- sftpLocal.set(new SftpUtil(connectConfig));
- }
- return sftpLocal.get();
- }
- /**
- * 释放本地线程存储的sftp客户端
- */
- public static void release() {
- if (null != sftpLocal.get()) {
- sftpLocal.get().closeChannel();
- sftpLocal.set(null);
- }
- }
- /**
- * 构造函数
- * <p>
- * 非线程安全,故权限为私有
- * </p>
- *
- * @throws Exception
- */
- private SftpUtil(ConnectConfig connectConfig) throws Exception {
- super();
- init(connectConfig);
- }
- /**
- * 关闭通道
- *
- * @throws Exception
- */
- public void closeChannel() {
- if (null != channel) {
- try {
- channel.disconnect();
- } catch (Exception e) {
- log.error("关闭SFTP通道发生异常:", e);
- }
- }
- if (null != session) {
- try {
- session.disconnect();
- } catch (Exception e) {
- log.error("SFTP关闭 session异常:", e);
- }
- }
- }
- /**
- * 下载文件
- *
- * @param downDir 下载目录
- * @param src 源文件
- * @param dst 保存后的文件名称或目录
- * @throws Exception
- */
- public void downFile(String downDir, String src, String dst) throws Exception {
- channel.cd(downDir);
- channel.get(src, dst);
- }
- /**
- * 删除文件
- *
- * @param filePath 文件全路径
- * @throws SftpException
- */
- public void deleteFile(String filePath) throws SftpException {
- channel.rm(filePath);
- }
- @SuppressWarnings("unchecked")
- public List<String> listFiles(String dir) throws SftpException {
- Vector<LsEntry> files = channel.ls(dir);
- if (null != files) {
- List<String> fileNames = new ArrayList<String>();
- Iterator<LsEntry> iter = files.iterator();
- while (iter.hasNext()) {
- String fileName = iter.next().getFilename();
- if (StringUtils.equals(".", fileName) || StringUtils.equals("..", fileName)) {
- continue;
- }
- fileNames.add(fileName);
- }
- return fileNames;
- }
- return null;
- }
- }
说明:
2.1 ConnectConfig包含了建立sftp连接所需要的全部参数信息
2.2 如果按照第一步进行了sftp的信任公钥配置,则需要通过调用jsch的addIdentity方法将密钥对中的私钥id_dsa设置进去
- //添加私钥(信任登录方式)
- if (StringUtils.isNotBlank(connectConfig.getPrivateKey())) {
- jsch.addIdentity(connectConfig.getPrivateKey());
- }
2.3 为了避免频繁的进行连接建立和连接释放操作,一般会定义为单例模式,但存在某些业务场景,需要在同一个线程执行完连续几次完整的业务操作后,将连接释放掉。如果采用单例,那么多线程并发的场景下会出现共享资源竞争导致的并发问题,譬如在B线程执行业务的过程中,A线程将连接释放。因此,可以借助ThreadLocal来避免该问题。
- /**
- * 获取本地线程存储的sftp客户端
- *
- * @return
- * @throws Exception
- */
- public static SftpUtil getSftpUtil(ConnectConfig connectConfig) throws Exception {
- SftpUtil sftpUtil = sftpLocal.get();
- if (null == sftpUtil || !sftpUtil.isConnected()) {
- sftpLocal.set(new SftpUtil(connectConfig));
- }
- return sftpLocal.get();
- }
- /**
- * 释放本地线程存储的sftp客户端
- */
- public static void release() {
- if (null != sftpLocal.get()) {
- sftpLocal.get().closeChannel();
- sftpLocal.set(null);
- }
- }
SFTP信任公钥配置及JSCH库的更多相关文章
- linux信任公钥的配置
一.每个用户都有自己的家目录 访问方式是:~/.ssh/id_rsa.pub 使用~就是表示家目录. 具体家目录在哪里,在用户密码配置文件中:/etc/passwd中.第6列的值就是. 可以使用~访问 ...
- Git 实用基础(配置,建库,提交,推送 GitHub)
Git 实用基础(配置,建库,提交,推送 GitHub) SVN ? Git ? 目前市面上主流的版本控制系统就是 SVN 和 Git . 两者的区别简单通俗地说就是,版本数据是否有在本地. 如果觉得 ...
- Linux中安装C++编译器codeBlock,并配置opencv链接库
1.Linux中安装codeBlock https://blog.csdn.net/xinyunyishui/article/details/50967395 2.CodeBlock中的中文显示不完全 ...
- Git SSH公钥配置
https://www.cnblogs.com/smuxiaolei/p/7484678.html https://blog.csdn.net/weixin_42063071/article/deta ...
- SFTP 安装与配置
SFTP 安装与配置 sftp 是 Secure File Transfer Protocol 的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH 的一部分,由于这种 ...
- rsa字符串格式公钥转换python rsa库可识别的公钥形式
在爬虫分析的时候,经常在网页上看到如下格式的rsa公钥: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC7kw8r6tq43pwApYvkJ5laljaN9BZb21 ...
- Sftp搭建与配置参考
Sftp搭建与配置参考 1. 介绍 sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一 ...
- Gerrit+apache+H2数据库简单安装配置及建库流程
Gerrit 是一个基于 Web 的代码评审和项目管理的工具,面向基于 Git 版本控制系统的项目.因此需要Apache.Mysql.GIT等相关软件的支持 系统配置: 新装的UBANTU LINUX ...
- maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。
注:本文来源于:杨四郎2018 <maven的安装.路径配置.修改库文件路径和eclipse中的配置.创建maven工程> 一.maven的安装 首先,先到官网去下载maven.这里是官 ...
随机推荐
- Lucene学习总结之二:Lucene的总体架构
Lucene总的来说是: 一个高效的,可扩展的,全文检索库. 全部用Java实现,无须配置. 仅支持纯文本文件的索引(Indexing)和搜索(Search). 不负责由其他格式的文件抽取纯文本文件, ...
- CSS3弹性盒模型布局模块介绍
来源:Robert’s talk原文:http://robertnyman.com/2010/12/02/css3-flexible-box-layout-module-aka-flex-box-in ...
- 关于tuple的只读特性
a = (1,3,[5,4,1]) a[2][1] = 2 print(a) 结果是:(1,3,[5,2,1]) 可以看到,在这里tuple的内容被修改了. 原因就是tuple的“只读”属性是指tup ...
- 符号三角形(hdu 2510 搜索+打表)
符号三角形 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- WPF实现毛玻璃效果
1和2需要Microsoft.WindowsAPICodePack.Shell.dll 和引用using System.Windows.Interop,并只能在有DwmApi.dll 版本的Windo ...
- 转:LINQ查询返回DataTable类型
动态绑定ReportViewer虽然之前实现过,但现在弄起来还是有点晕,主要是过去没有使用Linq,数据的操作经常用到DataTable,可以直接拿来使用,现在用Linq更方便,也懒得再用之前的数据库 ...
- excel内容转成xml
简单记录下如何将excel中的一个表格内容转成xml格式的文件. excel菜单栏中的"开发工具"下有专门处理xml的模块,如下图. 如果你的excel中看不到"开发工具 ...
- 【转】如何查看linux版本 如何查看LINUX是多少位
原文网址:http://sopace.blog.51cto.com/1227753/670526 如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: ...
- json中换行问题
json中不能存在换行,但可以进行替换后给服务器 function(text_info) { text_info=text_info.replace(/\r/gm,"<br\>& ...
- bzoj1623 [Usaco2008 Open]Cow Cars 奶牛飞车
Description 编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000). ...