Java如何通过SSH连接Linux虚拟机执行命令并上传文件
Java SSH连接+执行命令+SCP上传实现方案
Java生态中最常用的SSH操作库是JSch,完全可以覆盖你提到的所有功能需求,以下是具体实现步骤和等价功能对应:
第一步:引入依赖
如果用Maven管理项目,直接在pom.xml中添加以下依赖:
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency>
功能等价对应说明
1. 建立SSH连接(对应Python代码中ssh.connect逻辑)
import com.jcraft.jsch.*; import java.io.InputStream; public class SshOperationDemo { public static void main(String[] args) throws Exception { JSch jsch = new JSch(); // 三个参数分别是:用户名、Linux主机IP、SSH端口 Session session = jsch.getSession("root", "替换为你的Linux设备IP", 22); // 设置SSH登录密码 session.setPassword("替换为你的SSH登录密码"); // 测试环境可跳过主机密钥校验,生产环境建议移除该行配置正规密钥校验规则 session.setConfig("StrictHostKeyChecking", "no"); // 正式建立SSH连接 session.connect();
2. 执行远程命令(等价于ssh.exec_command)
// 打开exec通道执行远程命令 ChannelExec execChannel = (ChannelExec) session.openChannel("exec"); // 设置要执行的命令,加-p参数避免目录已存在时报错 execChannel.setCommand("mkdir -p /opt/Home/test_files"); execChannel.connect(); // 读取命令执行返回结果,等价于Python的stdout.read() InputStream inputStream = execChannel.getInputStream(); byte[] buffer = new byte[1024]; StringBuilder cmdResult = new StringBuilder(); while (inputStream.read(buffer) != -1) { cmdResult.append(new String(buffer)); } // 执行完成关闭exec通道 execChannel.disconnect();
3. SCP上传文件(等价于SCPClient(ssh.get_transport()) + scp.put)
JSch中用ChannelSftp即可实现和SCP完全一致的文件上传能力:
// 打开sftp通道,等价于Python中创建SCPClient实例 ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp"); sftpChannel.connect(); // 两个参数分别是:本地文件完整路径、远程目标目录路径,等价于Python的scp.put sftpChannel.put("替换为你本地pcap文件的完整路径", "/opt/Home/test_files/"); // 上传完成关闭sftp通道 sftpChannel.disconnect();
4. 关闭SSH连接(对应Python的ssh.close())
session.disconnect(); } }
注意事项
- 涉及含空格、特殊字符的文件路径,需要提前做转义处理避免执行报错
- 生产环境使用建议配置主机密钥校验,不要关闭StrictHostKeyChecking规则提升安全性
内容的提问来源于stack exchange,提问作者Orly Orly
相关产品推荐
相关产品推荐

