perl scipt:使用expect模块发送bash命令时出现意外标记的语法错误

perl scipt:使用expect模块发送bash命令时出现意外标记的语法错误,perl,expect,Perl,Expect,我正在编写perl脚本,以便将目录复制到远程计算机。 我正在使用expect模块来获取密码并发送密码 但是得到如下语法错误 sh:-c:第0行:意外标记附近的语法错误scp' sh:-c:第0行:system(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=E

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

但是得到如下语法错误

sh:-c:第0行:意外标记附近的语法错误
scp'
sh:-c:第0行:
system(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");}]);

提前谢谢你

我不完全确定你的脚本出了什么问题(为
spawn(系统($cmd))执行execpt)
当然可以,但这已经在注释中解决了。可能不需要
=>
?或者您需要用
\n
而不是
\r
来结束密码?总之,这是非常简单的。我使用了如下内容,效果非常好(请注意,
$rsync
是我的预期对象)


它可以处理更多不同的答案,并且可以更容易地修改和调试。但显然要长得多。不过,我更喜欢显式而不是优雅。

spawn需要一个shell命令,而不是Perl代码。因此:

my $exp1=Expect-> spawn($cmd)) or die;
您看到的错误消息只是您的shell说它不知道如何处理“系统(scp…”


并且:您将要屏蔽“@”。

您不是只想
spawn($cmd)
而不是
spawn($cmd)”
?spawn($cmd)不会给出错误。只要我执行此脚本,就会进行调试root@192.168.0.1的密码:等待新数据(10秒)…正在出现..此时它没有获得任何数据..因此密码没有发送..你能帮我解决这个问题吗..leeduhemerror没有再次出现,但是expect现在无法发送密码..因为它应该期望的字符串在它开始期望之前就已经出现了..这不应该发生。如果输出出现在co上nsole它通常意味着,
Expect
已经完成。例如,如果对象被破坏,或者如果您显式清空句柄。我会假设它立即匹配,但您的sub无法完成您想要的操作。我认为问题在于生成“scp-r/home/data/192.168.0.1:/tmp/”而不是发送密码…..srcipt能够发送密码,但它没有将目录复制到远程系统..有人能帮我吗有人能告诉我spawn($cmd)和spawn($system($cmd)之间的区别吗?这是第一点disscussion@ar777:基本上
spawn()
需要一个shell命令,而
system($cmd)
是一个perl命令。您不会在shell上编写
system(scp-bla-bla)
,因此当
spawn()时没有太多意义
尝试这样做。我现在还认为,您的第二个问题可能是密码后的
\r
而不是
\n
。如果答案确实对您有帮助,最好接受并可能对其进行投票。注意:实际上\n或\r产生了相同的结果,密码正在发送,但目录尚未发送copied@ar777:如果通过ord已发送,但目录未被复制,原因可能是您的目录有问题或需要其他输入。您是否也尝试删除命令中的
=>
my $exp1=Expect-> spawn($cmd)) or die;