Perl scp从windows到Linux的文件

时间:2015-09-04 22:04:47

标签: perl scp

此Perl脚本在Windows上运行,我正在尝试将文件从本地计算机scp到Linux计算机,它不会打印任何错误但不会复制该文件。

use Net::SCP qw(scp);
$source = 'c:\temp\a.txt';
$destination = '/tmp';
$scp = Net::SCP->new( "$ip", "$user" ) or die "cannot scp $!";
print "scp $source $destination";
$scp->scp($source, $destination);

3 个答案:

答案 0 :(得分:0)

$scp = Net::SCP->new( "$ip", "$user" ) or die "cannot scp $!";
$scp = new Net::SCP;

两次调用Net::SCP构造函数。第二次,它调用它没有主机名或用户ID,不检查返回值,并覆盖您以前看起来正确的调用。删除这些行中的第二行。

答案 1 :(得分:0)

您正在测试是否已成功调用scp对象的构造函数,但您未对实际执行scp操作的成功进行测试。

这条线可以改进:

$scp->scp($source, $destination);

该模块的文档指出scp在失败时返回false,并设置errstr属性。所以您可以按如下方式更改该行:

$scp->scp($source, $destination) or die 'scp failed: ', $scp->{errstr};

通过这样做,您应该获得有用的诊断信息,这是真正了解解决问题的唯一方法。

此外,与您的问题无关,但值得一提:use Net::SCP qw(scp);错误,因为它将scp函数导入您的调用命名空间。这是错误的原因是你正在使用面向对象的"方法调用"调用scp(换句话说,$scp->scp(...)。调用scp的方法调用方法并不需要将任何内容导入到调用命名空间中。

答案 2 :(得分:0)

Net::SCP documentation有两个如何调用scp()的示例:

use Net::SCP qw(scp iscp);
scp($source, $destination);

$scp = new Net::SCP;
$scp->scp($source, $destination);

您会注意到,两个版本都没有显示如何指定主机名,用户名或密码,或者复制操作是本地到远程还是远程到本地。

事实上,Net :: SCP文档在描述如何使用scp()方面做得不是很好。查看source code for the module表明:

  1. scp()子例程不使用传递给Net :: SCP构造函数的任何值。
  2. scp()调用scp命令行实用程序,将源和目标参数传递给该程序 verbatim
  3. 因此,指定主机名,用户名,密码和复制方向的正确方法与the scp command line utility的方法相同。您的$source$destination值必须遵循scp计划接受的一般格式。假设您正在尝试进行本地到远程传输,您应该尝试这样的事情:

    $source = 'c:\temp\a.txt';
    $destination = "${user}\@${ip}:/tmp";
    $scp = new Net::SCP;
    $scp->scp($source, $destination);
    

    这将生成一个格式为“user@1.2.3.4:/ tmp”的目的地,这是scp程序接受的格式。

    如果您尝试执行远程到本地副本,那么“$ {user} \ @ $ {ip}:”字符串应该预先添加到$ source而不是$ destination。请注意,“@”前面有一个反斜杠,因为它在双引号字符串中很特殊。

    顺便说一句,如果您使用两个本地路径名调用scp程序,它会调用系统的文件复制实用程序来执行本地复制操作。因此,您可能已将源文件名复制到C:\ tmp或本地系统上的类似位置。