2010-05-31 4 views
1

예상 스크립트로 Linkproof 장치를 백업하려고하는데 문제가 있습니다. 수명령이 Expect와 함께 버퍼에 쓰지 않습니다.

호스트의 진위를 '@IP (XXX.XXX.XXX.XXX)')

#!/usr/bin/expect 
spawn ssh @IPADDRESS 
expect "username:" 
# Send the username, and then wait for a password prompt. 
send "@username\r" 
expect "password:" 
# Send the password, and then wait for a shell prompt. 
send "@password\r" 
expect "#" 
# Send the prebuilt command, and then wait for another shell prompt. 
send "system config immediate\r" 
#Send space to pass the pause 
expect -re "^ *--More--\[^\n\r]*" 
send "" 
expect -re "^ *--More--\[^\n\r]*" 
send "" 
expect -re "^ *--More--\[^\n\r]*" 
send "" 
# Capture the results of the command into a variable. This can be displayed, or written to disk. 
sleep 10 
expect -re .* 
set results $expect_out(buffer) 
# Copy buffer in a file 
set config [open linkproof.txt w] 
puts $config $results 
close $config 
# Exit the session. 
expect "#" 
send "logout\r" 
expect eof 

출력 파일의 내용, 기대 난 내 한계에 도달이에 그것은 내 첫 번째 스크립트입니다 설립 될 수 없다.

RSA 키 지문은 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX입니다.

정말 연결 하시겠습니까 (예/아니요)?

가 '예'또는 '아니오'를 입력하십시오 @username : @Password

'예'또는 '아니오'를 입력하십시오 : 즉시 시스템 설정

입력하세요 '예'또는 '아니오'


사용자가 볼 수있는 것처럼 명령 결과는 파일에 없습니다. 왜 제발 저를 도와 주시겠습니까? 도움 주셔서 감사합니다. 그들이 기다리고있는 텍스트가 실제로 표시되는 텍스트를 일치하지 않기 때문에

로무는

답변

3

당신의 "기대"문 모든 아웃 타이밍. 첫 번째 또는 두 가지를 살펴 보겠습니다. 다른 것은 모두 같습니다. 그러나 실제로는 ssh에서받는 것은

expect "username:" 

:

The authenticity of host '@IP (XXX.XXX.XXX.XXX)' can't be established. 
RSA key fingerprint is XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. 
Are you sure you want to continue connecting (yes/no)? 

이는 문자열 "이름을"포함하지 않는

당신이 말하는 기대 명령이 시간 초과 있도록하고, 스크립트는 다음 명령으로 이동합니다 :

send "@username\r" 

우리는 그것을 보내지 않습니다.

Are you sure you want to continue connecting (yes/no)? @username 

하지만이 질문에 대한 올바른 대답은 아닙니다.

출력의 나머지 부분은 같은 생각입니다.

1

@joefis 언급했듯이 ssh에서 yes/no를 찾아야합니다.

내가 여기에 그 관련성이 높은으로 serverexchange 내 응답에서이를 복사 한

당신은 "암호 :"사용하지 않는 것이 좋습니다 당신은 로그인 중에 문자열 을 모니터링하는 경우, 당신은 것을 발견 할 것이다 항상 대문자로 표시되지는 않습니다.

-re "(. *) assword :"또는 "assword :"로 예상치를 변경하면 회선 잡기에 더 효과적으로 이되는 경향이 있습니다.

타이밍이 너무 빠르면 잠을 잘 수 있습니다. 1; 당신 보내기 전에

이것은 만 것입니다, 내가 지금 몇 가지, 이것은 기대 하나에 이러한 결과의 응답을 기대 허용됩니다 사용

expect { 
    #When asked about authenticity, answer yes then restart expect block 
    "(yes/no)?" { 
     send "yes\n" 
     exp_continue 
    } 
    "passphrase" { send "\r" } 
    -re "(.*)assword:" { sleep 1; send -- "password\r" } 
    -re $prompt { return } 
    timeout  { puts "un-able to login: timeout\n"; return } 
    eof   { puts "Closed\n" ; return } 
} 

을 기대하는 것입니다 return 문을 발견하면 더 많은 코드를 작성하십시오. 명령이 완료되었거나 로그인이 실제로 성공했는지 여부를 감지하는 데 도움이되므로 프롬프트 값을 설정하는 것이 좋습니다.

관련 문제