2014-07-22 6 views
0

pexpect를 사용하여 원격으로 gdb로 작업하려고합니다. 이것은 내 현재 코드 :이전 출력에서 ​​문자열을 일치시킬 때 pexpect python 모듈의 예상 결과가

child = pexpect.spawn("ssh [email protected] \"gdb\"") 
child.logfile = sys.stdout 
child.expect("password:") 
child.sendline("xxxx") 
child.expect("(gdb)") 
child.sendline("attach 9813") 
child.expect("(gdb)") 
child.sendline("info registers") 
child.expect("(gdb)") 
child.sendcontrol('c') 

그리고 이것은 내 콘솔 출력의 일부입니다

(...) 
GNU gdb (GDB) 7.4.1-debian 
(...) 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
(gdb) attach 9813 
info registers 
[email protected]:~$ 

이 같은 뭔가 기대 동안 :

(...) 
GNU gdb (GDB) 7.4.1-debian 
(...) 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
(gdb) attach 9813 
<Attaching...> 
(gdb) info registers 
<Registers info displayed...> 
(gdb) <Ctrl+C is done> 
[email protected]:~$ 

그래서, 문제를 처음으로 (gdb)과 일치하고 첫 번째 명령 attach 9813을 보내면 pexpect가 두 번째가 아닌 것으로 보입니다. (gdb) 새 명령을 보낼 회선 info registers. 첫 번째 (gdb)을 다시보고 일치시키고 두 번째 명령 을 보내지 않고 첫 번째 명령이 실행될 때까지 (필요한 프로세스에 연결될 때까지)을 기다리지 않고 기다립니다.

어떻게하면 다음과 같은 결과 만 분석 할 수 있습니까? 이전 출력을 두 번 일치시키지 않고? 내가 알고있는 것처럼, 여기 pexpect이 필요하기 ftp> 반응을 관리하고 연속적으로 명령을 전송

child = pexpect.spawn('ftp ftp.openbsd.org') 
child.expect('(?i)name .*: ') 
child.sendline('anonymous') 
child.expect('(?i)password') 
child.sendline('[email protected]') 
child.expect('ftp> ') 
child.sendline('cd /pub/OpenBSD/3.7/packages/i386') 
child.expect('ftp> ') 
child.sendline('bin') 
child.expect('ftp> ') 
child.sendline('prompt') 

: 나는 FTP 서버에 대해이 같은 샘플을 보았다. 내 코드가 비슷해 보인다.

또한 플러시 표준 출력을 시도했지만 작동하지 않았습니다.

+0

'expect()'는 실제로 그 인수를 간단한 문자열이 아닌 정규 표현식으로 취급하므로, 처음으로 프롬프트를 검색하는 것은'GNU gdb (GDB) 7.4.1-debian'에서 아마도 일치 할 것입니다. 버그보고 URL에서 두 번째로 또는 생략 된 부분의 내용 간단한 문자열 매칭을하기 위해'expect_exact()'를 사용해보십시오. –

+0

답장을 보내 주셔서 감사합니다. 'expect_exact()'시도가 도움이되지 않았습니다. 하지만 두 번째 cmd 인 info registers에 대해 expect ("(\ (gdb \). *) {2}")를 시도했지만, 불행히도 2 {'gdb} '와 일치합니다. 하지만 그러한 해결책은 최후의 수단입니다. searchwindowsize와 관련이 있는지 알고 있습니까? 나는 '0, 1, 2'를 할당하려고 시도했지만, 도움이되지 않습니다. 그리고 그 메커니즘을 얻지 못하는 것 같습니다. – primavera314

+0

필자는'expect()'를'expect_exact()'로 변경했지만, 더 공평하게 보입니다 (위에서 보여준 정규식 제외). – primavera314

답변

1

GDB는 명령의 출력 전에 프롬프트를 다시 표시하는 것으로 보입니다. 명령을 보내고 결과가 표시되기 전에 '조기'프롬프트와 즉시 일치하는 첫 번째 프롬프트와 일치합니다. 즉, 끝에있는 Control-C는 'info registers'의 결과가 표시되기 전에 보내지 만 나머지 스크립트는 제대로 작동하는 것 같습니다.

해결 방법은 다음 명령을 보내기 전에 예상되는 출력과 일치시키는 것입니다.

+0

이것은 정확히 내가 결국 생각해 낸 것입니다. 제 솔루션을 확인해 주셔서 감사합니다. 나는 이것을 올바른 것으로 표시 할 것이다. – primavera314

0

동일한 문제가있었습니다. Joelmatth의 대답은 나에게 그 수정을 상기시켰다.

trash = child.expect([".+"]) 

". +"는 처음 발견 한 항목과 일치하며 모든 것을 플러시하는 데 도움이됩니다.