【问题标题】:send multiple files from windows machine to a linux remote server "Jsch code"将多个文件从 Windows 机器发送到 linux 远程服务器“Jsch 代码”
【发布时间】:2011-09-09 05:36:18
【问题描述】:

smoeone 是否可以尝试使用 Jsch 将多个文件发送到远程服务器,这可能吗!!

我正在尝试发送多个脚本 perl 来检查远程服务器中的一些现有文件和命令,然后必须在我的本地计算机中返回一个包含结果的文件,问题是我必须使用 eclipse那。

错误:

Bareword found where operator expected at /root/port.pl line 27, near "10.156.31.46 ssh"
    (Missing operator before ssh?)
Bareword found where operator expected at /root/port.pl line 27, near "8HcmdrGQDgXKL"
    (Missing operator before HcmdrGQDgXKL?)
Bareword found where operator expected at /root/port.pl line 27, near "9N1XgcLKUcC1DgFmcYoNLb1VsU9KYRhLAOGiIjWBdRkr6gLhZTJsnd2e464"
    (Missing operator before N1XgcLKUcC1DgFmcYoNLb1VsU9KYRhLAOGiIjWBdRkr6gLhZTJsnd2e464?)
Bareword found where operator expected at /root/port.pl line 27, near "2iIe3zJSlBH1tVd8PCifJaZ6Xu4KqsDFWjIILv8wY5XMWYdxVcPcMOsQhpl7vB2EgZxrc3yxE6rwfGnyxEKWez9W9t6e2hOvx3J21PxAGTaCIPjgxbcM4G"
    (Missing operator before iIe3zJSlBH1tVd8PCifJaZ6Xu4KqsDFWjIILv8wY5XMWYdxVcPcMOsQhpl7vB2EgZxrc3yxE6rwfGnyxEKWez9W9t6e2hOvx3J21PxAGTaCIPjgxbcM4G?)
syntax error at /root/port.pl line 27, near "10.156.31.46 ssh"
Execution of /root/port.pl aborted due to compilation errors.
exit-status: 255

当我使用 FileOutput 时出现此错误

java.io.FileNotFoundException: C:\Users\Computer\workspace\proj (Accès refusé)

【问题讨论】:

  • 您要上传多个文件,还是执行它们,或者两者都执行?
  • 你的代码有什么问题?你有例外吗?它做的不是你想要的(如果是,是什么?)。
  • 它给了我这个异常:java.lang.ArrayIndexOutofBoundsException:0 并且 cmd 不在远程服务器中执行
  • 请多合作一点。这个异常发生在哪一行?我的猜测是在new FileInputStream(args[0]) - 这只有在您使用文件名作为命令行参数调用程序时才有效(同样的参数也用作主机名)。在您的情况下,您不需要任何输入,因为您上传了脚本 - 只需使用 channel1.setInputStream(null) 代替。
  • 异常消失,但命令没有在远程服务器中执行

标签: java scp jsch


【解决方案1】:

是的,它可以很简单地完成。您需要打开一个通道,只需将二进制对象放入适当位置的通道中。如果您想对多个文件执行此操作,您可以按顺序执行,也可以连续提交给 Executor。

Session session = ...;// a new jSch Session with remote attributes (like ip, username and password)
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp csftp = (ChannelSftp) channel;

File file = new File(...); //binary file location to ftp
String fileAbsolutePath = ...;//The to location on remote server

csftp.put(new FileInputStream(file), fileAbsolutePath, file.length());

这当然是使用 jSch。有关更多信息,您可以查看此example

【讨论】:

  • 我试过这段代码,但命令不起作用!!可能是因为本机操作系统在windows,远程服务器在linux!!
  • 不应该这样,因为我能够从 Windows 到 OS 执行相同的一组功能。你有任何关于它为什么不起作用的信息吗?是不是连接失败了?它是否毫无例外地通过了 .put?
  • 太好了,不客气!最终的问题是其他人会遇到类似的事情吗?
  • put方法使用有误。第三个参数是传输模式(RESUME、APPEND 或 OVERWRITE)。见ChannelSftp
【解决方案2】:

我使用 java 和 Ant 脚本为 jsch SCP Get 和 Put 创建了教程。 jsch tutorials

【讨论】:

    【解决方案3】:

    您一次只能发送一个文件——但也许您可以将它与 ZipInput/OutputStream 结合使用,从而以这种方式发送多个文件?

    【讨论】:

      【解决方案4】:

      是的,但这并不容易。 Sftp 确实允许在一个会话中发送多个文件。不知道scp在发送多个文件时是否使用一个会话。

      我会推荐使用ant task或使用apache camel来拥有更高级别、易于使用的界面来处理。

      ant 任务是一个简单易用的工具,可以完成一项工作。

      另一方面,Camel 是一种非常灵活的工具,可帮助解决基于企业集成模式在不同系统之间传输信息时的各种问题。它还提供了更多功能,使这些转移成为“工业实力”。

      【讨论】:

      • scp 使用exec 通道,所有文件使用单个流(以及每个文件之间的确认,这使其在低延迟连接上变慢)。
      【解决方案5】:

      问题澄清后编辑。

      1. 您需要一个ChannelSftp,并使用其中一个(或多个)put 方法。多次调用它们没有问题,即使是同时调用(虽然这不会增加带宽,但它可能有助于高延迟。(参见约翰的答案)。

      2. 然后打开ChannelExec 来执行你的脚本。您通常可以向通道发出多个命令(由; 或换行符分隔),它会将它们传递给shell,shell 将按顺序执行它们。或者,在此处使用多个通道(一个接一个或同时)。

      3. 上一条命令完成后,再次使用ChannelSftp 下载文件(此处使用get 方法)。

      这与 Eclipse 并没有真正的关系,除了可能如何将库包含在构建和运行路径中(如果是,请在评论中说明)。

      如果您真的不需要将脚本作为文件保存在服务器上,另一种方法是使用perl 命令的变体,它允许在命令行(即在 exec 通道中)提供脚本命令字符串)或作为标准输入(即在 exec 通道的输入流中)。有关详细信息,请参阅perlrun 文档。 您可以调整脚本,使结果不会写入文件,而是作为输出生成(然后您可以从 exec 通道输出中读取)。


      我在我的 JSch 示例集合版本中添加了一个 example

      这里是重要的部分:

      InputStream scriptStream =
        new BufferedInputStream(new FileInputStream(arg[0]));
      
      String command = "perl -w - ";
      
      Channel channel=session.openChannel("exec");
      ((ChannelExec)channel).setCommand(command);
      
      
      // input = script
      channel.setInputStream(scriptStream);
      
      // TODO: set other streams
      
      channel.connect();
      

      好的,让我们看看错误。

      首先,您的 Perl 脚本中有一些错误。第 27 行中的语法似乎有误。请查看此行,如果您没有发现问题,请就此提出新问题

      (您应该首先尝试使用普通的 SSH 连接运行它,不使用 JSch,以隔离问题。或者更好的是,首先尝试在您的计算机上本地运行它。)

      其次,您的 FileNotFoundException(顺便说一句,您应该在聊天块中使用 e.printStackTrace() 而不是 System.out.println(e);)。

      这个Accès refusé表示你的程序无权写到这里。从您的其他路径来看,这不是文件名,而是目录名。您不能用文件覆盖目录。使用您的文件应保存的名称:

      File file4 = new File("C:\\Users\\Computer\\workspace\\proj\\anime.txt");
      

      【讨论】:

      • "多次调用它们没有问题。"这意味着顺序,对吗?
      • 我的意思是顺序,因为我没有检查它们是否也在同一个频道上同时工作。如果没有,您可以打开多个频道并并行上传,尽管这仍然不会增加您的整体带宽。
      • 如果您有很多小文件和高网络延迟,多个并行通道可能会更快。当然,在这种情况下上传 tar 或 zip 文件并在服务器上解压会更快。
      • 有一个使用 ChannelExec 的小例子
      • @Dark_angel:这里是你的例子。玩得开心!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多