【问题标题】:Error using expect to execute shell script使用expect执行shell脚本时出错
【发布时间】:2022-10-24 20:42:29
【问题描述】:

我正在使用一个期望脚本来自动回答旨在将 Linux 系统添加到活动目录的 shell 脚本中的提示。我只有三个提示:位置,用户名,密码。我正在使用 Ansible 来执行它。

脚本执行时的问题,它尝试在 vm、adcli、realmd 等上安装 ~ 49 rpms。Yum 开始安装 rpms,但它从未完全完成。有时,它会在 17、46 或 42 rpms 后停止。它不会产生错误,但只是不一致地停止,并且 vm 显然没有加入 AD。

我知道我可以使用 Ansible 来编写任务并回避使用 bash 脚本。我的目标是至少暂时使用另一位同事的工作并在以后生成 Ansible 游戏。

如果我在 Ansible Tower 之外使用脚本,它就可以正常工作。 shell 脚本中的所有函数都会按预期执行并安装 rpm。这是我第一次尝试使用 expect,所以我可能做错了什么。谢谢参观。

  - name: Joining of system to the domain
    ansible.builtin.shell: |
      set timeout 10
      spawn sudo ./addto-AD
      match_max 100000

      expect -exact "Please Enter the Environment (i.e. Portand or Seattle): "
      send -- "Seattle\r"
      expect -exact "\r"

      expect -exact "Enter Elevated AD Username: "
      send -- "{{ elevated }}\r"
      expect -exact "\r"

      expect -exact "Enter Password for User: "
      send -- "{{ elevated_pass }}\r"
      expect -exact "\r"
      
      expect eof

【问题讨论】:

  • 期限 ”...我可以使用 Ansible 编写任务并回避使用 bash 脚本。“对我来说似乎是解决问题的方法。
  • ansible.builtin.shell 用于运行 shell 命令。 Expect 使用不是 shell 的 tcl 语言。

标签: linux ansible expect


【解决方案1】:

expect eof 仍然会超时。该脚本可能需要超过 10 秒才能完成。我建议set timeout -1


显然我不知道脚本在做什么,但也许你不需要对此期望:尝试将响应发送到脚本的标准输入

printf '%s
' "Seattle" "{{ elevated }}" "{{ elevated_pass }}" | sudo ./addto-AD

【讨论】:

  • 感谢您的输入,非常感谢。我今天早上测试了它,最初是 set timeout 20,然后是 set timeout -1。 Ansible Tower 上的每个构建都成功通过。 <br/> 我知道 printf 语句,但尚未测试该解决方案。不过我会的,绝对有帮助。 <br/> 偶然用“match_max”设置缓冲区大小时有什么经验法则吗?
  • 只有当您对捕获输出感兴趣时,该缓冲区大小才真正相关。取决于您发送的命令产生了多少输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多