Bash 스크립팅에서 시간 초과 예상


13

다음 스크립트에서 "expect"에 대한 시간 초과를 어떻게 추가합니까? 120 초로 설정하고 싶습니다.

#!/bin/bash
HOST="localhost"
USER="myuname"
PASS="mypassword"

VAR=$(expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

echo "==============="
echo "$VAR"

답변:


13

expect맨 페이지에 따라 기본 시간 제한 은 10 초입니다. 120 초로 변경하려면 앞에 spawn ssh $USER@$HOST줄을 추가하십시오.

set timeout 120

이것을 만들기 위해

VAR=$(expect -c "
set timeout 120
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

2

다음 매뉴얼 페이지의 추출에 따르면 예상 :

"예상 [[-opts] pat1 body1] ... [-opts] patn [bodyn]

패턴 중 하나가 생성 된 프로세스의 출력과 일치하거나 지정된 시간이 지났거나 파일 끝이 보일 때까지 기다립니다. 최종 본문이 비어 있으면 생략 할 수 있습니다.

가장 최근의 expect_before 명령의 패턴은 다른 패턴보다 암시 적으로 사용됩니다. 가장 최근의 expect_after 명령의 패턴은 다른 패턴 뒤에 암시 적으로 사용됩니다.

전체 expect 문에 대한 인수에 둘 이상의 행이 필요한 경우 백 슬래시로 각 행을 종료하지 않도록 모든 인수를 하나로 묶을 수 있습니다. 이 경우 중괄호에도 불구하고 일반적인 Tcl 대체가 발생합니다.

패턴이 키워드 eof 인 경우 해당 본문은 파일 끝에서 실행됩니다. 패턴이 키워드 시간 초과 인 경우 해당 본문이 시간 초과시 실행됩니다. 시간 초과 키워드를 사용하지 않으면 시간 초과시 암시 적 null 작업이 실행됩니다. 기본 시간 초과 기간은 10 초이지만 "set timeout 30"명령으로 예를 들어 30으로 설정할 수 있습니다. 무한 시간 초과는 값 -1로 지정할 수 있습니다. 패턴이 키워드 기본값 인 경우, 해당 본문은 시간 종료 또는 파일 끝에서 실행됩니다.

패턴이 일치하면 해당 본문이 실행됩니다. expect는 본문의 결과를 반환합니다 (또는 패턴이 일치하지 않으면 빈 문자열). 여러 패턴이 일치하는 경우 가장 먼저 나타나는 패턴이 바디를 선택하는 데 사용됩니다. ... "


1

@DerfK가 귀하의 질문에 답변했습니다. 그래도 유지 보수를 위해 스크립트를 리팩터링합니다.

#!/bin/bash
export HOST="localhost"
export USER="myuname"
export PASS="mypassword"

script=<<'END_OF_SCRIPT'
    set timeout 120
    spawn ssh $env(USER)@$env(HOST)
    expect "password:"
    send "$env(PASS)\r"
    expect "\$"
    send "ls\r"
    expect -re "$env(USER).*"
    send "logout"
    expect eof
END_OF_SCRIPT

VAR=$(expect -c "$script")

echo "==============="
echo "$VAR"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.