Perl从Windows到Linux的scp文件
这个Perl脚本在Windows上运行,我试图从本地机器到Linux机器上scp文件,它不打印任何错误,但不复制文件。Perl从Windows到Linux的scp文件
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);
的Net::SCP documentation有如何调用scp()
两个例子:
use Net::SCP qw(scp iscp);
scp($source, $destination);
$scp = new Net::SCP;
$scp->scp($source, $destination);
你会注意到,无论是版本显示如何指定主机名,用户名或密码,或复制操作是本地到远程或remote-to-local。
事实是,Net :: SCP文档不能很好地描述如何使用scp()。望着source code for the module表明:
- 的
scp()
子程序不使用任何传送到的Net :: SCP的构造函数的值。 - scp()调用
scp
命令行实用工具,将源和目标参数传递给该程序逐字。
因此,指定主机名,用户名,密码和复制方向的正确方法与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);
这将产生一个目的与形式的“[email protected]:/ tmp目录”,这是scp
程序接受的表单。
如果您尝试执行远程到本地副本,则应将$ {user} \ @ $ {ip}:“字符串预置为$ source而不是$ destination。请注意,“@”前面有一个反斜杠,因为它在双引号字符串中是特殊的。另外,如果用两个本地路径名调用scp
程序,它会调用系统的文件复制实用程序来执行本地复制操作。所以你可能已经将源文件名复制到C:\ tmp或本地系统上的类似位置。
您正在测试成功调用scp
对象的构造函数,但是您未在实际执行scp
操作时测试成功。
这条线可以改进:
$scp->scp($source, $destination);
该模块的文档指出scp
失败时返回假,并设置errstr
属性。所以,你可以改变该行如下:
$scp->scp($source, $destination) or die 'scp failed: ', $scp->{errstr};
通过这样做,你应该得到有用的诊断信息,这是真的知道了发生在解决这个问题的唯一途径。
此外,与您的问题无关,但值得一提:use Net::SCP qw(scp);
是错误的,因为它将scp
函数导入到您的调用名称空间中。这是错误的原因是您正在使用scp
(也就是$scp->scp(...)
)的面向对象的“方法调用”调用。调用scp
的方法调用方法不需要将任何内容导入到您的调用名称空间中。
'$ scp-> scp(...)'的返回值是什么? '$ scp - > {errstr}'的价值是什么? – mob