新手求助:使用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
相关产品推荐
相关产品推荐

