我正在编写perl脚本来将目录复制到远程计算机。 我正在使用expect模块来获取密码并发送密码。
但是语法错误如下所示
sh:-c:第0行:意外令牌
scp'
系统附近的语法错误(scp -r / home / user1 / data / 192.168.0.1:/tmp /)'
sh: -c: line 0:
perl脚本是:
use Expect;
$Expect::Debug=2;
$cmd="scp -r /home/user1/data/ 192.168.0.1:/tmp/";
my $exp1=Expect-> spawn("system($cmd)") or die print "cannot spwan process\n";
$exp1-> expect(10,["root@192.168.0.1's password: "=>sub{ $exp1-> send("usr1234\r");}]);
提前谢谢
答案 0 :(得分:2)
spawn需要一个shell命令,而不是Perl代码。所以:
my $exp1=Expect-> spawn($cmd)) or die;
您看到的错误消息只是您的shell,说它不知道如何处理'系统(scp ...'。
并且:你想掩盖'@'。
答案 1 :(得分:0)
我不完全确定你的脚本出了什么问题(当然是spawn(system($cmd))
的execpt,但是已经在评论中解决了。也许不需要=>
?或者你需要使用\n
代替\r
来结束密码?无论如何,它非常简单。我使用了类似下面的内容(注意$rsync
是我的Expect对象)。
$rsync=Expect->spawn ("rsync $remUser\@$remIp:$remFiles $locFolder");
if (! defined($rsync))
{
die "spawning failed. Probably fork failed: $!";
}
my $matchStatus = $rsync->expect(100, '-re', '(.+)');
if (! defined $matchStatus)
{
die "Nothing got returned within 100 seconds. $!";
}
my $spawned = 0;
while ($spawned eq 0)
{
my $return = $rsync->match();
if ($return =~ m/command not found/)
{
die "Command not found, there appears to be no rsync... $!";
}
elsif ($return =~ m/RSA key fingerprint is/)
{
$rsync->send ("yes\n");
sleep(5);
}
elsif ($return =~ m/password/)
{
$rsync->send($password,"\n");
$spawned = 1;
}
else
{
print "rsync answered:\n\n";
print "$return \n";
print "I did not expect that. EXIT\n";
exit(1);
}
}
print "Sent Pw...\n";
处理更多不同的答案,可以更轻松地进行修改和调试。但显然要长得多。我更喜欢明确而优雅。