Java利用JSch实现SSH远程操作的技术指南
作者:拾荒的小海螺
在日常开发中,许多应用需要通过 SSH 协议远程连接服务器来执行命令、上传或下载文件,JSch是一个功能强大的 Java 库,它提供了便捷的接口来实现 SSH 连接和其他远程管理功能,本文将介绍 JSch 的基本功能,并通过实际代码示例帮助您快速上手,需要的朋友可以参考下
1、简述
在日常开发中,许多应用需要通过 SSH 协议远程连接服务器来执行命令、上传或下载文件。JSch (Java Secure Channel) 是一个功能强大的 Java 库,它提供了便捷的接口来实现 SSH 连接、SFTP 文件传输和其他远程管理功能。
2、核心功能
- SSH 远程命令执行:通过 SSH 协议在远程服务器上运行命令。
- SFTP 文件传输:支持上传和下载文件。
- 端口转发:支持本地端口和远程端口转发。
- 密钥登录:支持通过密码和私钥进行认证。
在使用 JSch 之前,需要添加其依赖。以下是 JSch 的 Maven 依赖:
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency>
3、使用实例
3.1 远程执行命令
以下代码展示如何通过 SSH 连接到远程服务器并执行命令:
import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.InputStream; public class JSchExecExample { public static void main(String[] args) { String host = "your-server-ip"; String user = "your-username"; String password = "your-password"; try { JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); session.setPassword(password); // 忽略主机密钥检查 session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 打开执行命令的通道 ChannelExec channel = (ChannelExec) session.openChannel("exec"); channel.setCommand("ls -l"); // 获取命令输出 InputStream inputStream = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[1024]; while (inputStream.read(tmp) != -1) { System.out.print(new String(tmp)); } channel.disconnect(); session.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
3.2 上传文件到远程服务器 (SFTP)
以下代码展示如何通过 SFTP 上传文件:
import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; public class JSchSFTPUploadExample { public static void main(String[] args) { String host = "your-server-ip"; String user = "your-username"; String password = "your-password"; String localFile = "/path/to/local/file.txt"; String remoteDir = "/path/to/remote/dir/"; try { JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); session.setPassword(password); // 忽略主机密钥检查 session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 打开 SFTP 通道 ChannelSftp channel = (ChannelSftp) session.openChannel("sftp"); channel.connect(); // 上传文件 channel.put(localFile, remoteDir); System.out.println("File uploaded successfully!"); channel.disconnect(); session.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
3.3 下载文件到本地 (SFTP)
import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; public class JSchSFTPDownloadExample { public static void main(String[] args) { String host = "your-server-ip"; String user = "your-username"; String password = "your-password"; String remoteFile = "/path/to/remote/file.txt"; String localDir = "/path/to/local/dir/"; try { JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); session.setPassword(password); // 忽略主机密钥检查 session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 打开 SFTP 通道 ChannelSftp channel = (ChannelSftp) session.openChannel("sftp"); channel.connect(); // 下载文件 channel.get(remoteFile, localDir); System.out.println("File downloaded successfully!"); channel.disconnect(); session.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
3.4 使用私钥进行认证
如果需要使用私钥而不是密码进行认证,可以如下设置:
import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.InputStream; public class JSchPrivateKeyExample { public static void main(String[] args) { String host = "your-server-ip"; String user = "your-username"; String privateKey = "/path/to/private/key"; try { JSch jsch = new JSch(); jsch.addIdentity(privateKey); Session session = jsch.getSession(user, host, 22); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); ChannelExec channel = (ChannelExec) session.openChannel("exec"); channel.setCommand("ls -l"); InputStream inputStream = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[1024]; while (inputStream.read(tmp) != -1) { System.out.print(new String(tmp)); } channel.disconnect(); session.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
3.5 本地端口转发
通过 JSch 实现本地端口转发,可以让本地端口访问远程服务:
import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; public class JSchPortForwarding { public static void main(String[] args) { String host = "your-server-ip"; String user = "your-username"; String password = "your-password"; try { JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 设置本地端口转发 int assignedPort = session.setPortForwardingL(8888, "localhost", 8080); System.out.println("Local port forwarding: localhost:" + assignedPort + " -> localhost:8080"); // 保持连接 Thread.sleep(60000); session.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
4、总结
以上JSch常见的使用样例,JSch常见的使用场景是自动化远程管理、文件传输、构建SSH隧道等。以下是JSch 的优势:
- 轻量级:单个 JAR 包即可使用。
- 功能丰富:支持 SSH、SFTP、端口转发等多种功能。
- 开源免费:无额外成本。
到此这篇关于Java利用JSch实现SSH远程操作的技术指南的文章就介绍到这了,更多相关Java JSch SSH远程操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!