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

Posted

技术标签:

【中文标题】期望脚本不适用于多个密码请求【英文标题】:Expect script does not work with multiple password requests 【发布时间】:2021-02-06 19:25:41 【问题描述】:

我正在尝试执行一个 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
'

【问题讨论】:

您的缩进并不反映其中单个 expect 语句的组织。密切注意大括号和双引号。 看看我的sexpect (Expect for Shells),您可以使用它来编写仅使用shell 代码的Expect 脚本。 【参考方案1】:

首先,在将期望脚本放入 bash 脚本时使用引用的 heredoc,它可以显着减少引用地狱。

看来你需要输入密码,然后等待perl程序结束:

    在同一个期望命令中放置多个模式 使用特殊的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

【讨论】:

完美格伦!!非常感谢您的帮助!!

以上是关于期望脚本不适用于多个密码请求的主要内容,如果未能解决你的问题,请参考以下文章

Scapy/ARP 请求不适用于多个/范围 IP。仅针对单个 IP 请求

多个 CORS 适用于 GET 但不适用于 PUT/POST 与飞行前请求 Web api 2

Web 服务 SOAP 请求适用于 SOAPUI,但不适用于 PHP

PHP 脚本适用于笔记本电脑,但不适用于服务器

Laravel 请求验证不适用于邮递员请求

Nock 不适用于同时运行的多个测试