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

Perl - Best way to establish an SFTP connection on windows

我需要在 Windows 机器上使用 SFTP 将文件放在远程目录中。我试过 Net::SFTP::Foreign,但我不能使用它,因为它需要 IO::Pty,而 Windows 机器上没有。 best/simplest 的方法是什么?

更新请求信息:

以下是我使用的版本:

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.

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

虽然可能有一个避免 IO::Pty 的 Perl SFTP 包,但您只需将 "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,但这应该可以在 windows 上执行,前提是您还按照 post [=18] 中的指示安装 Glib =]

祝你好运!

在引擎盖下使用 Net::SFTP::Foreign in Windows is probably to use the Net::SFTP::Foreign::Backend::Net_SSH2 backend (update: a Perl module available from CPAN) which uses Net::SSH2 的首选方式(Strawberry Perl 已包含,更新:否则,您将需要自己构建和安装 libssh2这有时并不像它应该的那样容易。

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

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

我有几个使用 Net::SFTP::Foreign 的跨平台脚​​本,在 windows 上使用 plink,在 linux 上使用 openssh,效果很好。 Windows 正在使用最新的 strawberry 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 解决方案,但非常可靠。我在我的任何 windows 框上都没有看到 IO::Pty,因此 plink 没有依赖性。