2010-01-01 2 views
3

Expect를 사용하여 SSH 세션 및 ERP 프로그램과 자동으로 상호 작용합니다.Expect - 행 및 열을 기반으로 화면 영역에서 변수 가져 오기

내 기대 스크립트에서 변수를 포착하기보다는 표 영역 (예 : 한 필드)을 코드의 변수에 캡처하는 특정 키 입력을 받으면 가능합니까? 서버에 다른 명령을 보내고 필드를 다시 보내시겠습니까?

내 6 자리 주문 번호가 포함 된 주문 번호가 6, 12, 6, 18 (6은 행, 12-18은 열임)에 포함되어 있다고 가정 해보십시오. 나는 행 6 열 12에서 18로 그 주문 번호를 변수에 복사하고 싶다. 그런 다음 사용자가 좀 더 상호 작용할 수있게하거나 다른 메뉴로 이동할 것을 기대하고 다른 메뉴에서 주문 번호를 다시 보냅니다.

제 질문은 다음과 같습니다. 현재 화면의 내용이 하나의 버퍼에 있습니까? (전체 세션이 아님) 화면의 해당 행과 열 범위에만 존재하는 특정 데이터 요소 만 추출 할 수 있습니까?

샘플 의사 코드 :

#!/usr/bin/expect -f 
set env(TERM) vt100 
spawn ssh -Y [email protected] 
#... set user/pass and other vars... 
#... send commands to log into ERP 
#don't time out 
set timeout -1 
     interact { 
       -reset $CTRLZ {exec kill -STOP [pid]} 
       $CTRLA { 
         exp_send "menu_address\ry\r" 
       } 
       $CTRLO { 
         #...acquire order number variable... 
         #...some code I don't understand yet... 

         exp_send "menu_exit_sequence\r" 
         exp_send "menu_address\r" 
         exp_send $ordernumvar 

       } 
       ~~ 
     } 

답변

0

아니, 당신은 특정 행/열에서 화면 오프 뭔가를 잡을 수 없습니다. 그러나 처음에는 정보가 어떻게 화면에 표시되는지 생각해보십시오. curses를 사용하는 tty 기반 응용 프로그램의 경우 해당 행/열에 나타나는 특수 이스케이프 시퀀스를 사용하여 stdout으로 출력되었습니다. 그래서, 그 특정 탈출 시퀀스가 ​​그 위치에있는 것을 얻기 위해 '기대'합니다.

+0

이러한 특수 이스케이프 시퀀스 중 하나의 예는 무엇입니까? tty 기반 응용 프로그램이 제대로 표시되는 방식에 다소 익숙합니다. 또한 화면에 이미있는 경우 내 필드를 '예상'할 수 있으며 그 후에 만 ​​사용자가 변수 복사 작업을 실행합니까? 그 메뉴에 대한 유용한 데이터 요소를 미리 결정하고 나중에 사용할 수 있도록 변수에 미리로드하는 것이 불가능하지 않을 것입니다. – jjclarkson

+0

[1; 3H는 커서를 1 행 3 열로 이동합니다. 기대 스크립트를 실행하기 전에 이미 화면에 어떻게 표시되는지 잘 모르겠습니다.초기 화면을 표시하려면 스크립트에 로그인하거나 다른 프로그램을 시작해야합니까? –

+0

흥미 롭습니다 ... 스크립트에서 작업하고있는 시나리오의 경우 SSH 세션을 생성합니다 (ERP 프로그램은 쉘 설정에 따라 로그인 할 때 자동으로 시작되지만 로그인 시퀀스도 스크립트에 의해 자동화 됨). 사용자가 '상호 작용'을 사용하지만 Ctrl + o (및 기타 여러 가지)와 같은 특정 키 입력은 자동화 된 절차를 트리거 한 다음 사용자에게 다시 제어 할 수 있습니다. 커서 제어는 특정 필드의 선택 및 특정 명령의 전송 만 필요하지 않습니다. – jjclarkson

0

내 ERP의 출력을 디버깅하려면 출력 문자를 얻으려면 exp_internal을 사용할 수 있음을 발견했습니다. 그래서 지금 (내 번호가 076338 인 입력)

spawn id exp0 sent <0>^M 
spawn id exp6 sent <0>^M 
spawn id exp0 sent <7>^M 
spawn id exp6 sent <7>^M 
spawn id exp0 sent <6>^M 
spawn id exp6 sent <6>^M 
spawn id exp0 sent <3>^M 
spawn id exp6 sent <3>^M 
spawn id exp0 sent <3>^M 
spawn id exp6 sent <3>^M 
spawn id exp0 sent <8>^M 
spawn id exp6 sent <8>^M 
spawn id exp0 sent <\r>^M 
spawn id exp6 sent <\r\n\u001b[1;14H>^M 

을 나는 필드를 얻을 수있는 정규 표현식을 파악해야합니다

exp_internal -f file 0 

그 출력은 내게 준. 나는이 있었다 :

-nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} { 
    set ordernumber $interact_out(0,string) 
} 

을하지만 지금이 통합해야이를 대표 할 몇 가지 정규식으로

^([a-zA-Z0-9]{1})?[0-9]{5} 

을 :

\r\n\u001b[1;14H 

와 나는이 저장된 것을 일단 $ ordernumber 변수를 사용하기 위해서는 종료 문자열 전에 문자를 분리하고 변수에 저장해야합니다.

+0

{^ ([a-zA-Z0-9] {1})? [0-9] {5} \ r \ n \ u001b [1; 14H $}를 시도했지만 오류가 발생했습니다. 거기,하지만 난 그냥 올바른 정규식 구문을 추측하고있어 ... – jjclarkson

1

실제로는 term_expect Expect와 함께 제공되는 예제 프로그램은 정확하게 이것을 할 수 있습니다. 커서로 주소를 지정할 수있는 터미널을 에뮬레이션하고 특정 화면 위치에서 출력을 테스트 할 수 있습니다. 내 ActiveTcl 배포판에는/expect/term_expect 데모가 있습니다.