다음을 사용하여 예상되는 출력

다음을 사용하여 예상되는 출력

나는 다음과 같은 스크립트를 만들었습니다.

#!/usr/bin/expect -f
set ip [lindex $argv 0];
spawn ssh name@server
expect "assword"
set timeout 0.5
send "password\r"
expect "xxxxx"
set timeout 1
send "telnet $ip\r"
expect "assword"
send "password\r"
expect "xxxxxx"
send "xxxxxxx\r"
.
.
.
.

스크립트는 내 출력이 다음과 같이 표시되는 위치까지 계속됩니다.

Last update from 1.1.1.1 1d06h ago
  Routing Descriptor Blocks:
  * 1.1.1.1 from 2.2.2.2

1.1.1.1계속할 수 있도록 항상 고유한 IP( )를 추출하고 자동으로 스크립트에 전달하는 방법을 알아내야 합니다 .

답변1

두 가지 인스턴스가 있습니다 1.1.1.1. 첫 번째 인스턴스가 일치할 수 있다고 가정하면 먼저 원하는 출력을 생성하는 간단한 스크립트를 작성하고 원격 장치에서 거의 수행되는 잘못된 프롬프트도 포함해야 합니다.

#!/usr/bin/env expect
proc prompt {} { puts "prompt"; gets stdin; }
prompt
puts "Last update from 1.1.1.1 1d06h ago"
puts "  Routing Descriptor Blocks:"
puts "  * 1.1.1.1 from 2.2.2.2"
prompt

이 스크립트를 호출 generator한 다음 해당 스크립트를 호출하고 상호 작용하려면 다른 스크립트가 필요합니다. 하지만 먼저 다른 터미널에서 이러한 스크립트의 변경 사항을 빠르게 반복하는 방법을 살펴보겠습니다.

$ (echo consume; echo generate) | entr ./consume
...

consumeconsume스크립트가 변경될 때마다 스크립트를 실행합니다 generate. 그런 다음 스크립트를 조작하여 프롬프트와 상호 작용하고 원하는 출력을 찾은 다음 정규식을 적용할 수 있습니다(설명서 읽기 regexp(n)).

#!/usr/bin/env expect
spawn -noecho ./generate

expect -ex prompt
send -- "before\r"

expect -ex prompt
# this is what I used to confirm that the required prompt block
# had been matched
#puts ">>>$expect_out(buffer)<<<"

regexp {Last update from ([^ ]+) } $expect_out(buffer) unused theip
puts ">>>$theip<<<"

send -- "after\r"
expect eof

이 방법은 원하는 출력이 힌트에 의해 지원된다고 가정합니다. 또 다른 옵션은 정규식 expect줄을 사용하는 것이지만 Last update ...이는 더 복잡할 수 있습니다. 또한 이 IP 주소 일치는 거의 모든 항목과 일치할 수 있습니다. 텍스트가 실제로 IP 주소인지 확인해야 하는 경우 더 정확한 정규식을 사용하세요.

다른 문제:

  • 제한 시간이 매우 짧습니다. 관련된 시스템이나 네트워크가 느리고 출력이 지정된 제한 시간보다 오래 걸리면 어떻게 되나요?
  • ssh시스템 에서 호스트 키 오류나 프롬프트가 발생 하는 경우 오류 검사가 많지 않습니다 .

관련 정보