예상 부분이 완료되면 bash 스크립트를 계속 실행하는 방법

예상 부분이 완료되면 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제대로 작동하는 것 외에도 올바른 사용자로 전환했습니다. 문제는 쉘에서 실행될 때 스크립트가 이 시점에서 중지된다는 것입니다. 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은 필요하지 않음 ).grepawk

답변3

예상 스크립트에 대한 새 스크립트 파일(예: "expect.sh")을 만듭니다. bash 스크립트에서 호출하십시오.

./expect.sh

이제 Expect 스크립트가 bash 스크립트 내에서 실행됩니다.

관련 정보