予想されるコードを含む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
正常に動作するだけでなく、正しいユーザーに切り替えました。問題は、シェルで実行するとスクリプトがこの時点で停止することです。 bashスクリプトはシェルを終了したときにのみ続きます。 bashスクリプトの残りの部分を実行し続け、実行中にスクリプトの残りの部分に対してシェルを維持するようにスクリプトの予想される部分を調整できますか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"