【问题标题】:Can the expect script continue to execute other command after "interact"?“交互”后,expect 脚本能否继续执行其他命令?
【发布时间】:2011-11-25 23:49:32
【问题描述】:

我正在编写一个脚本来运行 ssh 以登录远程主机,所有操作完成后,我键入 exit 并注销。但我希望脚本继续运行并在本地主机上写入日志。脚本类似于:

#!/usr/bin/expect
spwan ssh qwerty@remote_host

expect {
    "password:" {
        send "123123\r"
    }
}

interact;
send "echo $(date) >> login_history.log\r"

但是最后一个命令“send ...”总是失败,错误信息如下 “发送:spawn id exp4 not open ...”

当我从远程主机上注销时,expect 脚本是否可以像在本地主机上运行一样继续工作?

【问题讨论】:

    标签: expect


    【解决方案1】:

    是的,处理可以在 [interact] 之后继续。

    简答:将最后的 {send ...} 更改为 {exec date >> login_history.log}

    您需要了解几个概念才能实现您所追求的控制流。首先,http://www.cotse.com/dlf/man/expect/interact_cmd_desc.htm 提供了一个简洁的概要和中间 [interact] 使用的示例。

    第二:为什么你会看到消息“... spawn id ... not open ...”?因为spawn id没有打开。您编写的脚本实际上是“交互,然后,在交互结束后,向 ssh 进程发送一个新命令。”如果您已经注销,那么,该已失效进程的 id 当然不再可用。

    第三:你如何实现你想要的?我不确定你想要什么。 听起来,就像我在上面描述的那样简单地转换 [send] 就足够了。你觉得怎么样?

    【讨论】:

    • 非常感谢,您的回答提供了很多信息。并且 exec 命令确实有效
    • 不客气,qwerty。我感谢您的明确跟进,您现在已经拥有了您所寻求的。
    猜你喜欢
    • 2020-07-24
    • 2017-07-17
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多