Perl - 在Windows上建立SFTP连接的最佳方式

时间:2018-04-18 00:28:56

标签: perl sftp put

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

使用请求信息进行更新:

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

Net::SFTP::Foreign: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 个答案:

答案 0 :(得分:3)

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

另一个选择是tell Net::SFTP::Foreign使用plink命令运行SSH连接(在模块文档上搜索plink)。 更新plinkPuTTY应用程序发行版的一部分,这是一个非常流行的SSH客户端,可能已安装在该计算机中。

最后,您还可以尝试使用Net::SSH::AnyNet::SFTP::Foreign提供自己的后端,并且可以在多个SSH客户端和模块之上运行......但它仍处于测试阶段!

答案 1 :(得分:2)

我有几个跨平台脚本使用Net :: SFTP :: Foreign使用windows上的plink和linux上的openssh,它运行良好。 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的实际路径,并且脚本只读取该特定平台上所需的内容。即(... \ bin \ Putty \ plink.exe或/ usr / bin / ssh)

不是纯粹的Perl解决方案,但一直非常强大。我没有在我的任何一个窗口框上看到IO :: Pty,因此对plink没有任何依赖。

答案 2 :(得分:0)

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

虽然可能存在避免IO::Pty的Perl SFTP程序包,但只需将“FTP”命令转换为ssh / scp等效项并查看Net::SSH <,就可以更快地获得解决方案/ p>

---按要求添加示例---

#!/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,但如果您还按照此帖http://www.perlmonks.org/bare/?node_id=856863

中的说明安装了Glib,则可以在Windows上执行此操作 祝你好运!