问题描述
我试图执行一个perl脚本以连接到Linux主机,从而生成一个快照,然后需要将此快照SCP到本地服务器。因此,我必须将密码2乘以1(在服务器上登录)和2(在SCP上)以生成先前生成的文件。 问题是,我的期望脚本仅适用于第一个密码,有人知道吗?
[linuxserver dimm]$ ./mul.sh
spawn perl perlscript.pl
Cleaning up /tmp/logs
Getting logs from server 9.x.x.x using snap
Password: <------ THIS IteraTION WORKS FINE WITH EXPECT
Password: <------ THE 2nd IteraTION DOES NOT WORK AND I HAVE TO ADD THE PASSWORD MANUALLY
[linuxserver dimm]$
export PASSWORD='mypassword'
/usr/bin/expect -c '
spawn perl perlscript.pl
expect {
-nocase "*assword*" {
send "$env(PASSWORD)\r"
exp_continue
}
expect -c "
expect "*assword*"
send \$env(PASSWORD)\r
interact"
}
interact
'
解决方法
首先,将期望脚本放入bash脚本中时,请使用带引号的heredoc,这样可以大大减少引用地狱。
似乎您需要输入密码,然后等待perl程序结束:
- 在同一Expect命令中放入多个模式
- 使用特殊的
eof
模式来期待所生成程序的结束。
/usr/bin/expect <<'END_EXPECT'
set timeout -1
spawn perl perlscript.pl
expect {
-nocase "*assword*" {
send "$env(PASSWORD)\r"
exp_continue
}
eof
}
END_EXPECT