我有 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 脚本中运行。