Expect脚本不适用于多个密码请求

问题描述

我试图执行一个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程序结束:

  1. 在同一Expect命令中放入多个模式
  2. 使用特殊的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