SSHJ - 功能齐全的Java SSH库( 二 )


// SFTP下载final SFTPClient sftp = ssh.newSFTPClient();try {sftp.get("test_file", new FileSystemFile("/tmp"));} finally {sftp.close();}// SFTP上传final SFTPClient sftp = ssh.newSFTPClient();try {sftp.put(new FileSystemFile(src), "/tmp");} finally {sftp.close();}利用 SSHJ , 我们还就可以很方便地实现一个交互式 SSH 客户端 , 在本地命令行上实现对远程命令行的交互:
package net.schmizz.sshj.examples;import net.schmizz.sshj.SSHClient;import net.schmizz.sshj.common.StreamCopier;import net.schmizz.sshj.connection.channel.direct.Session;import net.schmizz.sshj.connection.channel.direct.Session.Shell;import net.schmizz.sshj.transport.verification.ConsoleKnownHostsVerifier;import net.schmizz.sshj.transport.verification.OpenSSHKnownHosts;import java.io.File;import java.io.IOException;import net.schmizz.sshj.common.LoggerFactory;/** 交互式SSH客户端 */class RudimentaryPTY {public static void main(String... args)throws IOException {final SSHClient ssh = new SSHClient();final File khFile = new File(OpenSSHKnownHosts.detectSSHDir(), "known_hosts");ssh.addHostKeyVerifier(new ConsoleKnownHostsVerifier(khFile, System.console()));ssh.connect("localhost");try {ssh.authPublickey(System.getProperty("user.name"));final Session session = ssh.startSession();try {session.allocateDefaultPTY();final Shell shell = session.startShell();new StreamCopier(shell.getInputStream(), System.out, LoggerFactory.DEFAULT).bufSize(shell.getLocalMaxPacketSize()).spawn("stdout");new StreamCopier(shell.getErrorStream(), System.err, LoggerFactory.DEFAULT).bufSize(shell.getLocalMaxPacketSize()).spawn("stderr");new StreamCopier(System.in, shell.getOutputStream(), LoggerFactory.DEFAULT).bufSize(shell.getRemoteMaxPacketSize()).copy();} finally {session.close();}} finally {ssh.disconnect();}}}【SSHJ - 功能齐全的Java SSH库】在这个例子中 , 使用了会话的 startShell 来启动一个命令行 , 而不像我们的第一个例子那样创建会话 。在此之后 , 使用 SSHJ 提供的 StreamCopier , 进行远程命令行输出流的获取 , 以及本地输入流的上传 , 从而完成了一个实时交互的 SSH 命令行 。

SSHJ - 功能齐全的Java SSH库

文章插图
SSH协议与SSHJ库
总结SSHJ 作为一个使用 Java 语言实现的 SSH 库 , 其对于 SSH 协议的实现十分全面 , 包含的特性众多 , 在其所提供的 SSH 实现的比较中 , SSHJ 对于协议和算法的实现覆盖程度很高 , 是实现 SSH 协议相关代码逻辑和应用的优秀选择 。
SSHJ 项目代码质量高 , 历经数年的开发 , 项目一直处于活跃的开发和维护状态;项目代码量不大 , 代码结构设计较好 , 且提供了丰富的使用例子 , 值得有兴趣的开发者进行更进一步的学习研究和开源贡献 。




推荐阅读