You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java应用中通过SSH连接远程服务器并执行ping操作

问题根因

  1. 你写的两次Runtime.getRuntime.exec()调用会生成两个完全独立的本地进程,两次进程无任何关联,第一次启动的ssh会话和第二次执行的ping命令没有绑定关系,ping自然只会在本地运行,不可能送到远程服务器执行。
  2. 你尝试的ssh user@host ping ip逻辑本身是正确的,出现本地执行的异常情况,大概率是命令参数解析错误、ssh未成功完成远程登录导致的。

可用解决方案

方案1:合并为单条ssh命令直接调用

ssh原生支持将远程命令作为参数直接传递,正确写法需要把要执行的远程命令作为最后一个参数传入,Java调用时建议用字符串数组形式传参,避免空格、引号被本地系统错误解析:

// 示例:远程执行ping 192.168.1.1,发送4个包后退出
String[] cmd = {
    "ssh",
    "user@你的远程主机地址",
    "ping -c 4 192.168.1.1"
};
Process p = Runtime.getRuntime().exec(cmd);
// 后续需要自行读取进程的输入流、错误流获取执行结果,调用waitFor()等待进程执行完成

注意:该方案需要提前配置本地到远程服务器的ssh免密登录,否则ssh进程会阻塞等待输入密码,导致程序无响应。

方案2:使用Java专用SSH库JSch实现(推荐生产环境使用)

不依赖本地系统的ssh客户端,支持密码、密钥等多种登录方式,稳定性和可控性更高,示例代码如下:

  1. 首先引入JSch依赖(Maven示例):
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>
  1. 功能实现代码:
import com.jcraft.jsch.*;
import java.io.InputStream;

public class RemotePingExecutor {
    public static void main(String[] args) throws Exception {
        JSch jsch = new JSch();
        // 初始化SSH会话,参数为用户名、远程主机地址、SSH端口(默认22)
        Session session = jsch.getSession("远程用户名", "远程主机IP", 22);
        session.setPassword("远程登录密码");
        // 测试环境可跳过主机密钥校验,生产环境建议配置已知主机列表提升安全性
        session.setConfig("StrictHostKeyChecking", "no");
        // 建立连接,超时时间30秒
        session.connect(30000);

        // 打开执行命令的通道
        ChannelExec channel = (ChannelExec) session.openChannel("exec");
        // 设置要执行的远程ping命令
        channel.setCommand("ping -c 4 要ping的目标IP");
        InputStream outputStream = channel.getInputStream();
        InputStream errorStream = channel.getErrStream();
        channel.connect();

        // 读取命令执行输出
        byte[] buffer = new byte[1024];
        while (true) {
            // 读取正常输出
            while (outputStream.available() > 0) {
                int readLen = outputStream.read(buffer, 0, 1024);
                if (readLen < 0) break;
                System.out.print(new String(buffer, 0, readLen));
            }
            // 读取错误输出
            while (errorStream.available() > 0) {
                int readLen = errorStream.read(buffer, 0, 1024);
                if (readLen < 0) break;
                System.err.print(new String(buffer, 0, readLen));
            }
            if (channel.isClosed()) break;
            Thread.sleep(500);
        }
        // 执行完成后关闭资源
        channel.disconnect();
        session.disconnect();
    }
}

方案3:通过shell脚本封装

本质和方案1逻辑一致,将ssh执行逻辑封装为shell脚本,Java直接调用脚本即可,适合需要频繁调整远程执行逻辑的场景:

#!/bin/bash
# 脚本名remote_ping.sh,传入参数为要ping的目标IP
ssh user@远程主机 "ping -c 4 $1"

Java调用时直接执行Runtime.getRuntime().exec(new String[]{"bash", "remote_ping.sh", "目标IP"})即可。

内容的提问来源于stack exchange,提问作者Jexxer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:54:04