代码之家  ›  专栏  ›  技术社区  ›  Cory Kleiser

Perl—在windows上建立SFTP连接的最佳方法

  •  2
  • Cory Kleiser  · 技术社区  · 7 年前

    我需要在Windows机器上使用SFTP将文件放在远程目录中。我试过了 Net::SFTP::Foreign 虽然我不能用它,因为它需要 IO::Pty 在Windows计算机上不可用。最好/最简单的方法是什么?

    使用请求的信息更新:

    以下是我正在使用的版本:

    网络::SFTP::外部 :v 1.89

    Net::SSH2 :v 0.69

    Net::SFTP::Foreign::Backend::Net_SSH2 :v 0.09

    下面是我代码的要点:

    $ssh2 = Net::SSH2->new();
    $ssh2->connect($host) || die "connect failed";
    $ssh2->auth_password($user, $pass) || die "password auth failed";
    $sftp = Net::SFTP::Foreign->new(ssh2 => $ssh2,
                                       backend => 'Net_SSH2');
    $sftp->error and
      die "Unable to stablish SFTP connection: ". $sftp->error;
    

    现在我只是想建立一种联系。我需要将文件放在服务器上。我收到的错误如下:

    Net::SSH2::timeout(ss, timeout) at C:/Strawberry/perl/site/lib/Net/SSH2.pm line 111, <STDIN> line 1.
    
    3 回复  |  直到 7 年前
        1
  •  3
  •   salva    7 年前

    首选的使用方式 Net::SFTP::Foreign 在Windows中可能要使用 Net::SFTP::Foreign::Backend::Net_SSH2 后端( 使现代化 :CPAN提供的Perl模块),它使用 Net::SSH2 在引擎盖下(已包含在草莓Perl中, 使现代化 :否则,您将需要自己构建和安装libssh2,这有时并不容易)。

    另一种选择是 tell Net::SFTP::Foreign 要使用 plink 运行SSH连接的命令(搜索 普林克 在模块文档上)。 使现代化 : 普林克 PuTTY application distribution,一个非常流行的SSH客户端,可能已经安装在该计算机中。

    最后,您还可以尝试使用 Net::SSH::Any 它为 网络::SFTP::外部 并且可以在多个SSH客户端和模块上运行。。。但它仍处于测试阶段!

        2
  •  2
  •   Shizeon    7 年前

    我有几个跨平台脚本,它们在windows上使用plink,在linux上使用openssh,使用Net::SFTP::Foreign,效果很好。Windows正在使用最新的草莓perl版本。

    my $sftp = Net::SFTP::Foreign->new(
        host=> $server,
        ssh_cmd => $plink, #Contains full path to plink or path to ssh
        user=> $user,
        more => ['-i', $keyfile],
        stderr_discard => 1,
    );
    

    使用plink后端的唯一一点是,您必须首先使用psftp或Putty gui手动建立连接,以便它将信任确认存储在注册表中。在那之后,最好从剧本开始。

    好的是,您可以在系统级配置文件中定义ssh或plink的实际路径,脚本只读取特定平台上需要的内容。ie(…\bin\Putty\plink.exe或/usr/bin/ssh)

    这不是一个纯粹的Perl解决方案,但非常健壮。我在我的任何windows框上都看不到IO::Pty,因此对plink没有依赖关系。

        3
  •  0
  •   Edwin Buck    7 年前

    SFTP实际上是SSH,带有一个包装器来模拟类似FTP的命令,因此 mdir 实际上是 ssh 'ls /path/to/dir'

    虽然可能有一个Perl SFTP包可以避免 IO::Pty ,只需将“FTP”命令转换为它们的ssh/scp等效命令,并查看 Net::SSH

    ---根据要求添加示例---

    #!/bin/env perl
    
    use Net::OpenSSH ();
    
    my $connection = Net::OpenSSH->new('somehost.com', user => 'myuser', password => 'mypassword' );
    my @ls = $connection->capture("ls");
    printf "remote listing is %s\n", join(', ', @ls);
    

    这将列出控制台中的文件。

    您提到没有IO::Pty,因为它不适用于windows计算机。也许您应该尝试安装IO::Pty::Easy。请注意 Net::OpenSSH 使用 IO::Pty 也可以,但如果您还安装了 Glib 如本帖所示 http://www.perlmonks.org/bare/?node_id=856863

    祝你好运

    推荐文章