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

新手求助:使用JSch实现Linux服务器文件目录复制失败(附代码)

解决JSch复制文件到远程Linux目录的问题

嘿,作为Linux和JSch新手,踩这些小坑太正常啦!我仔细看了你的代码,发现几个关键问题导致文件复制失败,咱们一个个来修正:

几个核心问题

  • 命令用错了:你写的是mv -u(移动文件),但你实际需要的是复制文件,应该用cp -u(-u是仅当源文件更新时才复制,这个参数没问题,只是命令本身错了)。
  • 目标路径拼写错误:你的目标路径写的是/home/Sumit/abcd/,但你的用户名是Smt,应该改成/home/Smt/abcd/,不然会因为路径不存在或者权限问题报错。
  • 命令还没执行就断开会话:你在打开Channel后,直接调用了session.disconnect(),这会导致命令还没跑完就被终止,必须等待Channel执行完成再断开。
  • 没有处理Channel的输出和关闭:需要读取Channel的输出(哪怕只是打印出来),并且在执行完成后关闭Channel,避免资源泄漏。
  • 定义的src和dest变量没用到:可以直接用这些变量来拼接命令,让代码更易维护。

修正后的完整代码

public static void main(String args[]) {
    String host = "192.168.11.90";
    String user = "Smt";
    String password = "ping";
    String src = "/home/Smt/abc/text1.txt";
    String dest = "/home/Smt/abcd/"; // 修正了用户名拼写,确保路径存在

    try {
        Properties config = new Properties();
        // 注意:生产环境不建议关闭StrictHostKeyChecking,这只是测试用的临时设置
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();

        // 创建会话并连接
        Session session = jsch.getSession(user, host, 22);
        session.setPassword(password);
        session.setConfig(config);
        session.connect();
        System.out.println("已连接到远程服务器...");

        // 构建正确的复制命令
        String cpCommand = String.format("cp -u %s %s", src, dest);
        ChannelExec channel = (ChannelExec) session.openChannel("exec");
        channel.setCommand(cpCommand);

        // 捕获命令输出和错误输出
        channel.setErrStream(System.err);
        InputStream in = channel.getInputStream();
        channel.connect();

        // 读取命令执行的输出,确保命令执行完成
        byte[] buffer = new byte[1024];
        while (true) {
            while (in.available() > 0) {
                int len = in.read(buffer);
                if (len < 0) break;
                System.out.print(new String(buffer, 0, len));
            }
            if (channel.isClosed()) {
                if (in.available() > 0) continue;
                System.out.println("命令执行完成,退出状态:" + channel.getExitStatus());
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (Exception ee) {
                ee.printStackTrace();
            }
        }

        // 关闭Channel和Session
        channel.disconnect();
        session.disconnect();
        System.out.println("会话已断开");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

额外注意事项

  • 目标目录必须存在:如果/home/Smt/abcd/目录不存在,cp命令会报错,你可以先执行mkdir -p /home/Smt/abcd/来确保目录存在(可以把这个命令和复制命令用&&拼接,比如mkdir -p /home/Smt/abcd/ && cp -u ...)。
  • 权限问题:确保用户Smt对源文件有读权限,对目标目录有写权限。
  • 安全提示:StrictHostKeyChecking=no在测试环境可以用,但生产环境建议设置为yes,避免中间人攻击,你可以提前把远程服务器的公钥添加到本地known_hosts文件里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:20:59