比较中的Commons VFS,SSHJ和JSch

几周前,我评估了一些用于Java的SSH库。 对它们的主要要求是在远程计算机上进行文件传输和文件操作。 因此,它存在一个基于SSH,SSH文件传输协议(或SFTP)的网络协议。 因此,我需要一个支持SFTP的SSH库。

一项研究表明,它退出了许多用于Java的SSH库。 为了进行比较,我将库的数量减少到三个。 我选择JSch,SSHJ和Apache的Commons VFS,以获得更深入的了解。 它们都支持SFTP。 JSch似乎是Java的实际标准。 SSHJ是较新的库。 其目标是为SSH提供一个清晰的Java API。 它在后台使用Apache SSHD。 Commons VFS的目标是为虚拟文件系统提供清晰的API,SFTP是受支持的协议之一。 在后台,它将JSch用于SFTP协议。 这些库应满足以下要求:

  • 通过密码进行客户端身份验证
  • 通过公钥进行客户端身份验证
  • 服务器认证
  • 通过SFTP从本地主机上传文件
  • 通过SFTP将文件下载到本地主机
  • 远程主机上的文件操作,例如通过SFTP移动,删除,列出给定文件夹的所有子文件夹(在文件或文件夹等类型之后进行过滤)
  • 执行普通的shell命令

让我们更深入地了解这三个库如何满足需求。

客户端认证

这三个库都支持两种必需的身份验证方法。 SSHJ具有最清晰的身份验证API( SSHClient.authUserPass(),SSHClient.authUserPublicKey() )。

SSHClient sshClient= new SSHClient();
sshClient.connect(host);// only for public key authentication
sshClient.authPublickey("user", "location to private key file");// only for password authentication
sshClient.authPassword("user", "password");

在Commons VFS中,身份验证配置取决于应使用哪种身份验证。 对于公共密钥身份验证,必须在FileSystemOption中设置私有密钥,并且用户名是连接URL的一部分。 对于密码验证,用户名和密码是连接URL的一部分。

StandardFileSystemManager fileSystemManager = new StandardFileSystemManager();
fileSystemManager.init();// only for public key authentication
SftpFileSystemConfigBuilder sftpConfigBuilder = SftpFileSystemConfigBuilder.getInstance();
FileSystemOptions opts = new FileSystemOptions();
sftpConfigBuilder.setIdentities(opts, new File[]{privateKey.toFile()});
String connectionUrl = String.format("sftp://%s@%s", user, host);// only for password authentication
String connectionUrl = String.format("sftp://%s:%s@%s", user, password, host);// Connection set-up
FileObject remoteRootDirectory = fileSystemManager.resolveFile(connectionUrl, connectionOptions);

JSch中的认证配置类似于Commons VFS。 这取决于应使用哪种身份验证。 必须在JSch对象中配置用于公共密钥认证的私钥,并且必须在Session对象中设置用于密码认证的密码。 对于两者,当JSch对象获取Session对象时,将设置用户名。

JSch sshClient = new JSch();// only for public key authentication
sshClient.addIdentity("location to private key file");session = sshClient.getSession(user, host);// only for password authentication
session.setPassword(password);session.connect();

服务器认证

这三个库均支持服务器身份验证。 在SSHJ中,可以使用SSHClient.loadKnownHost启用服务器身份验证。 可以添加自己的known_host文件位置,也可以使用默认位置,该位置取决于使用平台。

SSHClient sshClient = new SSHClient();
sshClient.loadKnownHosts(); // or sshClient.loadKnownHosts(knownHosts.toFile());
sshClient.connect(host);

在Commons VFS中,服务器身份验证配置也是FileSystemOption的一部分,类似于公钥身份验证。 在那里,可以设置known_hosts文件的位置。

SftpFileSystemConfigBuilder sftpConfigBuilder = SftpFileSystemConfigBuilder.getInstance();
FileSystemOptions opts = new FileSystemOptions();
sftpConfigBuilder.setKnownHosts(opts, new File("location of the known_hosts file"));

在JSch中,存在两种配置服务器身份验证的可能性。 一种可能性是使用OpenSSHConfig (请参阅JSch示例以了解OpenSSHConfig )。 另一种可能性更容易。 可以直接在JSch对象中设置known_hosts文件的位置。

JSch sshClient = new JSch();
sshClient.setKnownHosts("location of known-hosts file");

通过SFTP上传/下载文件

这三个库均支持通过SFTP上传和下载文件。 SSHJ具有非常清晰的API用于这些操作。 SSHClient对象创建一个SFTPClient对象。 这个对象负责上传(SFTPClient。PUT)和下载(SFTPClient。 获得 )。

SSHClient sshClient = new SSHClient();
// ... connectiontry (SFTPClient sftpClient = sshClient.newSFTPClient()) {// downloadsftpClient.get(remotePath, new FileSystemFile(local.toFile()));// uploadsftpClient.put(new FileSystemFile(local.toFile()), remotePath);
}

在Commons VFS中,上传和下载文件被抽象为在文件系统上的操作。 因此,两者均由FileObject对象的copyFrom方法表示。 上传是参数】remotefile对象上的copyfrom操作和下载是在LOCALFILE一个的copyfrom操作

StandardFileSystemManager fileSystemManager = new StandardFileSystemManager();
// ... configuration
remoteRootDirectory = fileSystemManager.resolveFile(connectionUrl, connectionOptions);LocalFile localFileObject = (LocalFile) fileSystemManager.resolveFile(local.toUri().toString());
FileObject remoteFileObject = remoteRootDirectory.resolveFile(remotePath);
try {// downloadlocalFileObject.copyFrom(remoteFileObject, new AllFileSelector());// uploadremoteFileObject.copyFrom(localFileObject, new AllFileSelector());
} finally {localFileObject.close();remoteFileObject.close();
}

JSch还支持SFTPClient。 在JSch中,它称为ChannelSFTP 。 它有两种下载( ChannelSFTP.get )和上载( ChannelSFTP.put )的方法。

// here: creation and configuration of sessionChannelSftp sftpChannel = null;
try {sftpChannel = (ChannelSftp) session.openChannel("sftp");sftpChannel.connect();// downloadInputStream inputStream = sftpChannel.get(remotePath);Files.copy(inputStream, localPath);// uploadOutputStream outputStream = sftpChannel.put(remotePath);Files.copy(locaPathl, outputStream);
} catch (SftpException | JSchException ex) {throw new IOException(ex);
} finally {if (sftpChannel != null) {sftpChannel.disconnect();}
}

执行Shell命令

仅Commons VFS不支持执行普通Shell命令。 在SSHJ中,它是两层的。 SshClient启动一个新的Session对象。 该对象执行shell命令。 这是非常直观的。

// creation and configuration of sshClienttry (Session session = sshClient.startSession()) {session.exec("ls");
}

在Jsch中, ChannelExec负责通过SSH执行Shell命令。 首先,在通道中设置命令,然后必须启动通道。 它不像SSHJ那样直观。

// here: creation and configuration of session objectChannelExec execChannel = null;
try {execChannel = (ChannelExec) session.openChannel("exec");execChannel.connect();execChannel.setCommand(command);execChannel.start();
} catch (JSchException ex) {throw new IOException(ex);
} finally {if (execChannel != null) {execChannel.disconnect();}
}

远程主机上的文件操作

所有库都通过远程计算机上的SFTP支持或多或少的理想文件操作。 在SSHJ中, SFTPClient也具有用于文件操作的方法。 方法的名称与Linux系统上的文件操作相同。 以下代码段显示了如何删除文件。

//here: creation and configuration of sshClienttry (SFTPClient sftpClient = sshClient.newSFTPClient()) {sftpClient.rm(remotePath);
}

Commons VFS的核心功能是文件操作。 用法需要习惯。 必须解析文件对象,并且可以对其执行文件操作。

// here: creation and configuration of remoteRootDirectoryFileObject remoteFileObject = remoteRootDirectory.resolveFile(remotePath);
try {remoteFileObject.delete();
} finally {remoteFileObject.close();
}

JSch的SFTPClient ChannelSFTP也具有文件操作方法。 此通道支持大多数文件操作。 例如,必须通过ChannelExec上的简单外壳命令来完成远程计算机上的文件复制操作。

// here: creation and configuration of session
ChannelSftp sftpChannel = null;
try {sftpChannel = (ChannelSftp) session.openChannel("sftp");sftpChannel.connect();sftpChannel.rm(remotePath);
} catch (SftpException | JSchException ex) {throw new IOException(ex);
} finally {if (sftpChannel != null) {sftpChannel.disconnect();}
}

结论

比较之后,我有两个收藏夹,SSHJ和Commons VFS。 SSHJ具有非常清晰的API,如果我需要通用的SSH客户端或通过SFTP进行文件操作就足够了,我会选择它。 如果我可以通过许多文件系统协议进行文件操作,或者不需要通用的SSH客户端,则可以选择Commons VFS。 对于这两种情况,我可以同时使用JSch来通过SSH执行命令。 Commons VFS的API已经习惯了。 但是在了解了背后的概念之后,API的用法就很简单了。

这个比较的整个源代码示例都托管在Github上 。

有用的链接

  1. SSHJ主页
  2. JSch主页
  3. Commons-vfs主页
  4. 有关SFTP的维基百科页面
  5. SSHD主页
  6. Github上此比较的源代码

翻译自: https://www.javacodegeeks.com/2015/08/commons-vfs-sshj-and-jsch-in-comparison.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android自定义xml解析

<?xml version"1.0" encoding"utf-8"?> <resources><Users><User name"jason" age"12" location"Beijing"/><User name"peter" age"18" location"Shanghai"/&g…

前端常见的安全性问题有哪些?

安全性 前端安全问题有哪些? XSS 跨站请求攻击XSRF 跨站请求伪造上边这两个问题,前端也只是辅助,主要还是靠后端XSS原理 在博客里可以写文章,同时偷偷插入一段<script>代码。发布博客,有人查看博客内容打开博客时,就会执行插入的js攻击代码在攻击代码中,获取cook…

(fofa信息收集骚操作)windows查看文件的md5值

1、winr 输入cmd进入控制界面 2、certutil -hashfile XXXX md5(XXXX为绝对路径) Linux下查看文件md5值&#xff1a; 进入文件目录&#xff0c;使用md5sum加文件名&#xff0c;例如md5sum test.txt 像fofa的语法里有可以查找js的md5值&#xff0c;这样就可以收集到更多信息了&…

教你读懂Ajax的工作原理

Ajax的工作原理 1、ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth、google suggest以及gmail等对ajax技术的广泛应用,催生了ajax的流行。而这也让微软感到无比的尴尬,因为早在97年,微软便已经发明了ajax中的关键技术,并且在99年I…

二叉树性质及遍历

一、二叉树的定义 树的每个结点至多只有二棵子树(不存在度大于2的结点)&#xff0c;树的子树有左右之分&#xff0c;次序不能颠倒。 二、二叉树的性质 (1) 在非空二叉树中&#xff0c;第i层的结点总数不超过, i>1&#xff1b;(2) 深度为h的二叉树最多有个结点(h>1)&#…

利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单

目标环境&#xff1a; 比如&#xff0c;目标存在一个上传的逻辑&#xff1a; <?php if(isset($_FILES[file])) {$name basename($_POST[name]);$ext pathinfo($name,PATHINFO_EXTENSION);if(in_array($ext, [php, php3, php4, php5, phtml, pht])) {exit(bad file);}mo…

将数据压缩到数据结构中

这个故事是关于我们最近在Plumbr进行的容量优化任务。 一切始于将无害的要求添加到现有组合中。 如您所知&#xff0c;Plumbr监视解决方案作为连接到服务器的Java代理分发。 只需少量添加即可跟踪一段时间内所有已连接的代理&#xff0c;以便可以实时回答以下问题&#xff1a;…

程序员面试需要注意的问题

今天给朋友带来的是找一份工作的流程详细介绍&#xff0c;以及期间所需要注意的东西&#xff0c;其中包括&#xff1a; 简历&#xff08;附带写简历的注意事项&#xff09;笔试&#xff08;附带笔试题详细介绍的链接&#xff09;电话面试(附带常见的面试题)面试&#xff08;详…

CVE-2017-15715漏洞复现

复现环境 docke apache 2.4.0到2.4.29即可 php5.5 复现过程 先在物理机上创建目录 mkdir -p /var/www/html 然后创建个容器&#xff0c;并关联物理机的/var/www/html目录 docker run -d -v /var/www/html:/var/www/html -p 8080:80 --name apache php:5.5-apache 再把物理机的/…

Linux网络流量实时监控ifstat iftop命令详解

ifstat 介绍 ifstat工具是个网络接口监测工具,比较简单看网络流量 实例 默认使用 #ifstateth0 eth1 KB/s in KB/s out KB/s in KB/s out0.07 0.20 0.00 0.000.07 0.15 0.58 0.00 默认ifstat不监控回环接口&#xff0c;…

一种移动端自适应屏幕的方法

前端移动端开发的时候肯定是会面对不同型号的手机的页面展示问题的&#xff0c;今天给大家推出另外一种自适应不同移动端的方法&#xff0c;使用vw&#xff0c;vh单位。 vw和vh单位的大小是多少&#xff1f; vw和vh是根据设备的宽度和高度来决定的&#xff0c;设备的宽就是10…

Metasploit--后渗透(一些基本操作方法)

查看主机是否运行在虚拟机上 run post/windows/gather/checkvm关闭杀毒软件 拿到目标主机的shell后第一件事就是关闭掉目标主机的杀毒软件&#xff0c;通过命令 run killav获取目标主机的详细信息 run scraper它将目标机器上的常见信息收集起来然后下载保存在本地 Meterpre…

CentOS6 下Vim安装和配置

1.系统只安装了vim-minimal&#xff0c;执行以下命令安装另外两个组件 yum install vim-common yum install vim-enhanced 2.安装ctags yum install ctags 下载linux-2.6.32.27内核源码并解压到~/arm/linux-2.6.32.27&#xff0c;进入该目录&#xff0c;生成索引文件 ctags -R …

端到端测试_端到端测试的滥用–测试技术2

端到端测试我的上一个博客是有关测试代码方法的一系列博客中的第一篇&#xff0c;概述了使用一种非常常见的模式从数据库检索地址的简单方案&#xff1a; …并描述了一种非常通用的测试技术&#xff1a; 不编写测试 &#xff0c; 而是手动进行所有操作。 今天的博客涵盖了另一…

vue全家桶指的是哪些?

vue全家桶&#xff1a; vue&#xff08;整体架构&#xff09;  vuex&#xff08;状态管理&#xff09;  vue-router&#xff08;路由&#xff09;  vue_resource || axios&#xff08;ajax请求&#xff09;  mint-UI(移动端UI框架库) || antd-vue(PC端UI框架库)

Metasploit 之生成木马(msfvenom)

msfvenom参数 相关参数介绍 -p, --payload <payload> 指定需要使用的payload(攻击荷载) -l, --list [module_type] 列出指定模块的所有可用资源,模块类型包括: payloads, encoders, nops, all -n, --nopsled <length> 为payload预先指定一个NOP滑动长度 -f, --for…

KVO 和 KVC 的区别?

KVO 和 KVC 的区别&#xff1f; key value coding ,key value observer KVC 是 路径访问的规范 KVO 观察某个变量的变化过程 它提供一种机制&#xff0c;当指定的对象的属性被修改后&#xff0c;则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改…

react全家桶指的是哪些?

react全家桶&#xff1a; react&#xff08;整体架构&#xff09;  redux || mobx&#xff08;状态管理&#xff09;  react-router&#xff08;路由&#xff09;  axios&#xff08;ajax请求&#xff09;  antd || react-material || antd-model(UI框架库)

将Redis集成到您的Spring项目中

本文展示了如何通过注释配置将Redis缓存集成到您的spring项目中。 我们将从Gradle配置开始。 我们将使用jedis驱动程序。 group com.gkatzioura.spring version 1.0-SNAPSHOTapply plugin: java apply plugin: eclipse apply plugin: idea apply plugin: spring-bootbuildscr…

自学前端的误区和痛点解决办法

网上有很多自学的方案路线&#xff0c;还有一些知道&#xff1b;但是我感觉他们很多人都是没有真实学习过的&#xff0c;很多人说的那些路线&#xff0c;真的是扯淡&#xff1b;肯定不是自己通过自学后的感悟&#xff0c;他们所谓的路线可能是结合培训班大纲和知乎的一些答案组…