当expect部分完​​成时如何继续执行bash脚本

当expect部分完​​成时如何继续执行bash脚本

我有 bash 脚本,其中包含预期代码:

#!/bin/bash
set -ex

funct()
{
pass3="some_pass"

    expect -c "
    spawn su - oracle
    expect "Password:"
    send \"$pass3\n\"
    interact
    "
}
funct

var_ulimit=`ulimit -Ha |grep "open files" |awk '{print $4}'`
echo $var_ulimit

当我执行脚本时./script.sh,除了工作正常之外,我已经切换到正确的用户。问题是,当从 shell 执行时,脚本会在此时停止。仅当我退出 shell 时,bash 脚本才会继续。是否可以调整脚本的expect部分以继续执行bash脚本的其余部分,并在执行时为脚本的其余部分保留shell su - oracle

谢谢

答案1

这在很大程度上未经测试。目的是将您想要以用户“oracle”运行的命令作为参数发送到函数,然后让这些命令在预期会话中执行。

它使用单引号的here-docs 来包含您想要作为oracle 运行的命令和期望的主体,因此请注意匹配我在这里演示的引用。

#!/bin/bash
set -ex

as_oracle() {
    local pass="the_password"
    local cmds=$(cat -)         # read the oracle commands from stdin

    # quoting in the next line is very important
    expect -f - "$pass" "$cmds" <<'END_EXPECT'
        lassign $argv pass3 commands

        spawn su - oracle
        expect "Password:"
        send -- "$pass3\r"

        # this is the regular expression that matches the end
        # of oracle's prompt: please change it if it's not correct
        set prompt {\$ $}

        expect -re $prompt
        send -- "eval \"$commands\"\r"
        expect -re $prompt
        send -- "exit\r"
        expect eof
END_EXPECT
}


as_oracle <<'END_ORACLE'
    var_ulimit=$(ulimit -Ha | awk '/open files/ {print $4}')
    echo $var_ulimit
END_ORACLE

我不确定这eval就是执行这些命令的方式。这可能会更好:

send -- ". <(echo \"$commands\")\r"

答案2

最后两个命令永远不会在 oracle 用户的 shell 中执行。尝试一下:

expect -c "
  log_user 0
  spawn su - oracle -c \"ulimit -Hn\"
  expect \"Passwort:\"
  send \"$pass3\n\"
  expect eof
  puts \"\$expect_out(buffer)\"
"

还假设您只想要open files带有-n标志的限制(不需要grep, awk, ...)。

答案3

为您的期望脚本创建一个新的脚本文件,例如“expect.sh”。并在 bash 脚本中调用它:

./expect.sh

现在您的 Expect 脚本将在您的 bash 脚本中运行。

相关内容