2

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é)
4

5 回答 5

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。有关更多信息,您可以查看此示例

于 2011-06-06T11:49:12.250 回答
1

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

于 2012-05-10T11:16:10.710 回答
0

澄清问题后进行编辑。

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

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

  3. 在最后一个命令完成后,您使用ChannelSftp再次下载文件(使用get此处的方法)。

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

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


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

这里是重要的部分:

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 行看起来语法错误。看看这一行,如果你没有发现问题,就提出一个新问题

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

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

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

File file4 = new File("C:\\Users\\Computer\\workspace\\proj\\anime.txt");
于 2011-06-06T11:52:40.000 回答
0

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

于 2011-06-06T11:35:10.413 回答
0

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

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

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

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

于 2011-06-06T11:35:25.983 回答