如何打开通道并将数据推入while循环?

时间:2019-01-18 17:24:15

标签: perl ssh

我正在尝试将<table className="padding-table-columns"> <tr> <td>Cell one</td> <!-- There will be a 5px space here--> <td>Cell two</td> <!-- There will be an invisible 5px space here--> </tr> </table> 命令遍历到通道中,该命令是在循环并将输出推入ls | grep数组时。但是,虽然while循环未提供必要的输出,所以代码将以@output终止。如果我注释了代码的模具部分,然后继续进行从源到目标的复制,则无法正常工作。

这是我的代码的一部分:

die "could not find the file $_[1] in $Source to $Destination \n" unless(@output);

日志中的错误:

  

/data/Directory1/ABC.csv到/data/Directory2/ABC.csv找不到文件ABC.csv

我手动验证了服务器上的文件,该文件确实存在。请指教。

1 个答案:

答案 0 :(得分:0)

引用Net::SSH2::Channel

  

或者,也可以启动远程shell(使用   外壳程序)并模拟用户交互打印命令到其   stdin流并从其stdout和stderr读回数据。但   如果可能,应避免这种方法;与壳说话是   困难,而且通常不可靠。

此外,使用ls检测文件/目录是否存在是脆弱且不可靠的。您应该改用文件测试操作,例如

sub exec_remote($$) {
    my($ssh2, $cmd) = @_;

    # every exec() requires a new channel
    my $chan = $ssh2->channel()
        or $ssh2->die_with_error;

    # send command to remote
    $chan->exec($cmd)
        or $ssh2->die_with_error;

    # we're done from our side
    $chan->send_eof;

    # ignore command output
    while (<$chan>) {}

    # wait for remote command to complete and return its exit status
    return $chan->exit_status;
}

sub copy_remote_if_necessary($$$$) {
     my($ssh2, $source, $destination, $file) = @_;

     if (exec_remote($ssh2, "/usr/bin/test -f ${destination}/${file}") ne 0) {
         die "Copy failed!\n"
             unless (exec_remote($ssh2, "cp ${source}/${file} ${destination}/") ne 0);
     }
}

copy_remote_if_necessary($ssh2, '/data/Directory1', '/data/Directory2', 'ABC.csv');