예상 코드가 포함된 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"
답변2
마지막 두 명령은 oracle 사용자의 셸에서 실행되지 않습니다. 시도 해봐:
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 스크립트 내에서 실행됩니다.