Expect 스크립트 종료

Expect 스크립트 종료

expect호스트에 로그인하고, 명령을 실행하고, 내용을 반환하고 종료하는 스크립트가 있습니다 . 명령 실행을 마친 후 어떤 종류의 정리/적절한 종료가 필요합니까? 이 명령은 항상 무언가를 반환하며 내가 처리해야 할 더 큰 문제는 SSH 중단 또는 관리자 사용자로 로그인 중단이라고 생각합니다. 내 생각에 이 문제는 다음과 같이 처리되었을 수 있습니다 timeout.

#!/usr/bin/expect -f

set timeout 10
match_max 100000
set hostname [lindex $argv 0]

spawn /usr/bin/ssh -o "StrictHostKeyChecking no" admin@$hostname
expect "*password:"
send -- "redactedSSHpassword\r"
expect "Username:"
send -- "admin\r"
expect "*password:"
send -- "redacted\r"
expect -- "*#*"
send -- "show stat summary\r"
expect -- "*#*"

또한 이 스크립트를 종료하고 오래된 세션을 남기지 않는 올바른 방법을 이해하지 못합니다.

답변1

시간이 초과되면 expect명령문은 실패하고 다음 명령문을 계속 진행합니다. 이는 말이 되지 않을 수도 있지만 다음과 같은 일이 발생할 수 있음을 의미합니다.

You expect "Username:" and get it.
You send "admin\r", and get back "No such username"
You expect "password:" but don't get it because you got the "No such username" message, so you timeout.
You send "redacted\r" and get back "redacted: no such command" but redacted has been added to the history on the machine.
You expect "*#*" ....

스크립트가 끝에 도달하면 종료됩니다. 이 시점에서 ssh는 PID 1로 재설정됩니다. ssh는 표준 입력에서 EOF를 감지하고 이를 전달한 후 종료합니다. 따라서 추가 정리가 필요하지 않을 수도 있습니다.

이것이 내 스크립트라면 나는 작은 프로그램을 작성할 것입니다

proc lookfor {pat} {
    expect timeout { send_user "timeout looking for '$pat'\r\n" ; exit } $pat
}

일치가 실패하면 즉시 종료되도록 모든 호출을 expect교체합니다 . 간단한 진단을 위해서는 또는 를 lookfor사용할 수 있습니다 .expect_afterexpect_beforelookfor

답변2

보완적인이카루스에 대한 유용한 답변, Expect 스크립트의 시작 부분에 이것을 추가하여 시간 초과 시 종료되도록 할 수 있습니다.

expect_before {
    timeout { puts "timeout"; exit 1 }
}

이는 expect각 명령 앞에 주어진 핸들러를 붙입니다. 시간 초과가 발생하면 "timeout"을 인쇄한 다음 반환 코드와 함께 종료됩니다 1.

관련 정보