从Windows机器发送多个文件到Linux远程服务器“Jsch代码”

时间:2011-06-06 11:33:22

标签: java scp jsch

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

5 个答案:

答案 0 :(得分:1)

是的,可以相当简单地完成。您需要打开一个通道,只需将二进制对象放入具有适当位置的通道中即可。如果您想使用多个文件,可以按顺序执行,也可以连续提交给执行程序。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您一次只能发送一个文件 - 但也许您可以将它与ZipInput / OutputStream结合使用,并以此方式发送多个文件?

答案 3 :(得分:0)

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

我建议使用ant task或使用apache camel来使用更高级别,易于使用的界面进行处理。

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

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

答案 4 :(得分:0)

在澄清问题后编辑。

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

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

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

  4. 这与Eclipse没有关系,除了可能如何在构建和运行路径中包含库(如果是这样,在注释中说明)。

    另一种方法是,如果你真的不需要将脚本作为服务器上的文件,那么将使用perl命令的变体,该命令允许在命令行上提供脚本(即exec channels命令字符串)或作为标准输入(即在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");