perl scipt:使用expect模块spawing bash命令时意外令牌的语法错误

时间:2014-02-07 06:54:36

标签: perl expect

我正在编写perl脚本来将目录复制到远程计算机。 我正在使用expect模块来获取密码并发送密码。

但是语法错误如下所示

  

sh:-c:第0行:意外令牌scp'
sh: -c: line 0:
系统附近的语法错误(scp -r / home / user1 / data / 192.168.0.1:/tmp /)'

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");}]);

提前谢谢

2 个答案:

答案 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";

处理更多不同的答案,可以更轻松地进行修改和调试。但显然要长得多。我更喜欢明确而优雅。