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

已建立SFTP连接,如何从Java执行Unix服务器带参Shell脚本?

在Java中远程执行Unix服务器上带参数的Shell脚本

嗨,我来帮你搞定这个问题~ 首先得明确一点:SFTP协议只能用来传输文件,没法直接执行远程命令,所以你之前建立的SFTP连接没法帮你执行脚本,得换成SSH连接来操作。咱们常用的Java SSH工具库是JSch,下面我给你一步步讲怎么实现:

1. 先引入JSch依赖

如果用Maven管理项目,把这段依赖加到你的pom.xml里:

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version> <!-- 建议用最新稳定版本 -->
</dependency>

2. 编写Java代码远程执行脚本

核心思路是通过SSH建立服务器会话,打开ChannelExec通道,构造带参数的脚本执行命令,最后获取执行结果和错误信息。下面是完整的示例代码:

import com.jcraft.jsch.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class RemoteScriptExecutor {
    public static void main(String[] args) {
        // 服务器配置信息
        String host = "你的服务器IP地址";
        String username = "服务器登录用户名";
        String password = "服务器登录密码";
        int sshPort = 22; // 默认SSH端口是22

        // 构造脚本执行命令:脚本绝对路径 + 参数,比如 "/home/user/scripts/backup.sh daily 2024"
        String scriptCommand = "/path/to/your/target_script.sh param1 param2";

        JSch jsch = new JSch();
        Session sshSession = null;
        ChannelExec execChannel = null;

        try {
            // 建立SSH会话
            sshSession = jsch.getSession(username, host, sshPort);
            sshSession.setPassword(password);
            // 跳过主机密钥验证(生产环境建议配置密钥登录,不要用这个)
            sshSession.setConfig("StrictHostKeyChecking", "no");
            sshSession.connect();

            // 打开执行命令的通道
            execChannel = (ChannelExec) sshSession.openChannel("exec");
            execChannel.setCommand(scriptCommand);

            // 获取命令的输出流和错误流
            InputStream outputStream = execChannel.getInputStream();
            InputStream errorStream = execChannel.getErrStream();

            // 启动通道执行命令
            execChannel.connect();

            // 读取脚本执行的标准输出
            BufferedReader outputReader = new BufferedReader(new InputStreamReader(outputStream));
            String line;
            System.out.println("脚本执行输出内容:");
            while ((line = outputReader.readLine()) != null) {
                System.out.println(line);
            }

            // 读取脚本执行的错误信息
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream));
            System.out.println("\n脚本执行错误信息:");
            while ((line = errorReader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待命令执行完成,获取退出码
            while (!execChannel.isClosed()) {
                Thread.sleep(100);
            }
            int exitCode = execChannel.getExitStatus();
            System.out.println("\n脚本执行退出码:" + exitCode);

        } catch (JSchException | InterruptedException | java.io.IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源,避免连接泄露
            if (execChannel != null && execChannel.isConnected()) {
                execChannel.disconnect();
            }
            if (sshSession != null && sshSession.isConnected()) {
                sshSession.disconnect();
            }
        }
    }
}

3. 关键注意事项

  • 脚本路径:一定要用服务器上的绝对路径,避免因为当前目录切换问题导致找不到脚本。如果你之前用SFTP定位到了脚本目录,也可以把目录路径拼到脚本名称前。
  • 参数处理:如果参数包含空格、特殊字符(比如$、&),记得用双引号把参数包裹起来,比如:
    String scriptCommand = "/path/to/script.sh \"param with space\" \"param$special\"";
    
  • 脚本权限:确保服务器上的脚本有可执行权限,登录服务器执行chmod +x /path/to/your/target_script.sh给脚本添加执行权限。
  • 生产环境安全:示例里跳过了主机密钥验证,生产环境强烈建议使用SSH密钥登录,不要用明文密码,避免安全风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:50:46