【问题标题】:script invoked by expect spawn is not running, when same command works via terminal当相同的命令通过终端运行时,expect spawn 调用的脚本未运行
【发布时间】:2012-12-30 06:48:16
【问题描述】:

我对这个期望的东西还有另一个问题。我已经尝试了八种方法到星期天来让它工作,但似乎无法弄清楚。基本上,我想要么在期望生成过程中“调用脚本”,要么弄清楚如何调用 sudo,然后以提升的提示符运行一组 Mac CLI 命令。

这是我要运行的命令(它们需要以管理员身份运行):

#!/bin/bash

networksetup -setdnsservers "Ethernet" 172.xxx.xxx.xxx;
networksetup -setsearchdomains "Ethernet" "congo.test";

我将此文件命名为“change.sh”

基本上,我想在运行我现在正在使用的主安装脚本之前先设置一些网络接口。

这是我所拥有的似乎不起作用的东西,但是,当直接在命令行上调用时它会起作用:

expect -c "
set password \"foobar\"
spawn su root -c \"/bin/bash change.sh\"
expect \"Password:\"
send \"\$password\r\"
"

现在,我知道我可以传入一个 argv,我很可能会在最终运行时这样做,但这不起作用,它实际上似乎从未触发脚本并运行网络更改。如果我跑:

%> su root -c ./change.sh

这行得通。但是,它在期望脚本中不起作用。

我有另一个脚本,名为“install.sh”,它适用于上面的以下代码:

spawn su root -c \"/bin/bash install.sh\"
expect \"Password:\"
send \"\$password\r\"
"

这很好用。

两个问题:

  1. 我可以在主脚本中调用那些networksetup cli吗?如果是这样,为什么调用这个“change.sh”脚本不起作用?
  2. 对于“install.sh”脚本,spawn 以 root 身份成功触发并且运行良好,它们看起来完全一样

我确定这是我遇到的一个愚蠢的问题,需要在某个地方解决一些问题。

【问题讨论】:

  • 尝试指定脚本的完整路径:spawn su root -c {/bin/bash /path/to/change.sh}
  • 不,那没有这样做..

标签: macos bash shell automation expect


【解决方案1】:

奇怪的是,这行得通:

#!/bin/bash

cd /Users/wqcoleman/Desktop/

expect -c "
set password \"william1\"
spawn su root -c \"/bin/bash /Users/wqcoleman/Desktop/change.sh\"
expect \"Password:\"
send \"\$password\r\"
interact
"

在sn-p结束时进行交互。不知道为什么?也许有人可以为我回答这个问题,但显然交互与“时间”有关?或者也许是 change.sh 中的步骤的执行?无论如何,它奏效了。

【讨论】:

  • 实际上,我错了。交互所做的只是为超时增加 BIT MORE 时间。如果我将超时设置为高于默认值,脚本就会运行,我们都很好。
  • 你也可以使用sleep 10,例如10是秒数
  • 我意识到这条评论晚了大约 2 年,但是......:期望在它存在之前向底层产生的进程发送一个 SIGHUP。如果这些脚本应该比期望脚本更有效,您可能希望在期望脚本的跨度行中使用spawn -ignore SIGHUP ... 以避免杀死生成的子进程。 HTH。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2017-01-25
  • 2016-04-29
相关资源
最近更新 更多