2013-09-06 2 views
1

another question에서 나는 expect와 if/else 문 (기본적으로 작성 방법에 대한 지식 부족)이있는 딜레마에 대한 해결책을 제공해주었습니다. 내가받은 스크립트는 한 가지 예외가 있습니다. 원격 호스트에 깨끗하게 연결하면 exit 명령이 전송되지 않아 해당 연결을 닫고 목록의 다음 호스트로 이동합니다.SSH를 통해 expect 스크립트를 사용하여 명령 보내기

이 스크립트의 기능적인 부분이다 : [사용자 이름 @ 호스트 ~] $ : 나는 내가 표준 리눅스 프롬프트를 볼 것으로 예상 호스트에 연결되어있어

while {[gets $file1 host] != -1} { 
    puts $host 
    spawn -noecho ssh $host 
    expect { 
     "continue connecting" { 
      send "yes\r" 
      expect { 
       "current" { 
        send -- $pw2\r 
        exp_continue 
       } 
       "New password" { 
        send -- $pw1\r 
        exp_continue 
       } 
       "Retype new password" { 
        send -- $pw1\r 
        exp_continue 
       } 
       msnyder 
      } 
      send "exit\r" 
     } 
    } 
    interact 
} 

. 적어도 표준 프롬프트입니다. 프롬프트 앞에는 배너가 있습니다. 이것에 꼬임을 던지는 것일까 요? 나는 RSA 지문 프롬프트에서 "연결을 계속하기"를 찾고 텍스트가 여러 줄에 걸쳐 있기 때문에 그렇게 생각하지 않을 것입니다. 예상되는 것은 스크롤하는 텍스트를 무시하고 입력을 요구하는 프롬프트의 텍스트 만 볼 정도로 지능적이라고 생각합니다.

ssh $host 명령에 대한 인수로 exit 명령을 전달하는 것으로 생각했지만 기대치가 좋지 않습니다.

누군가가 이제 exit 명령을 제대로 보내는데 도움이 될 수 있습니까?

업데이트 : 스크립트에 수행 할 작업을 확인하기 위해 스크립트에 exp_internal 1 옵션을 추가했으며 SSH 연결이 설정되면 사용자 프롬프트에서도 "계속 연결"과 일치하는 것으로 보입니다. "msnyder"에 대한 다음 비교를 실행하는 것으로 보이지 않습니다. http://pastebin.com/kEGH3yUY

업데이트 2 : 진행 중입니다. 암호 프롬프트가 나타날 때까지 아래 Glenn Jackman의 스크립트를 기반으로,이 작업을 얻을 수있었습니다 :

나는 명시 적으로 글렌 사용 단락 방법을 것보다 두 배 오히려 exit 명령을 보내도록 말한
set prompt {\$ $} 
set file1 [open [lindex $argv 0] r] 
set pw1 [exec cat /home/msnyder/bin/.pw1.txt] 
set pw2 [exec cat /home/msnyder/bin/.pw2.txt] 

while {[gets $file1 host] != -1} { 
    puts $host 
    spawn -noecho ssh -q $host 
    expect { 
     "continue connecting" { 
      send "yes\r" 
      expect { 
       "current" { 
        send -- $pw2\r 
        exp_continue 
       } 
       "New password" { 
        send -- $pw1\r 
        exp_continue 
       } 
       "Retype new password" { 
        send -- $pw1\r 
        exp_continue 
       } 
       -re $prompt { 
        send -- exit\r 
        expect eof 
       } 
      } 
     } -re $prompt { 
      send -- exit\r 
      expect eof 
     } 
    } 
} 

(그것은 그의 대답에 따라 내 코멘트 당 작동하는 것 같지 않았다).

지금 일어나고있는 일은 호스트 목록을 반복하고 RSA 지문 프롬프트에 '예'를 보낸 다음 명령 프롬프트에 '끝내기'를 보냅니다. 그러나 암호가 설정되어야하는 서버에 도달하면 설정이 중지됩니다. 결국 시간이 초과 된 것으로 보였고 다음 호스트로 다시 시작됩니다. 현재 비밀번호를 보내지 않았습니다. 우리는 당신이 중 하나 "comtinue가 연결"또는 당신이 당신의 프롬프트에 직접 로그인하면 일치하는 경우가 실행될 수있는 장소로, "exit"를 이동 한

답변

1

답을 정리했습니다. Glenn의 스크립트를보고 나면 각 블록은 if/else로 나뉘어져 있는데 대신 암호 섹션이 단일 블록으로 작동하고 exit가 else로 작동해야합니다. 이것은 내가 지금 무엇을 가지고 :

  1. 나는 RSA 지문을 그대로 사용하거나 비밀번호를 변경할 필요가 없습니다 :

    set prompt {\$ $} 
    set file1 [open [lindex $argv 0] r] 
    set pw1 [exec cat /home/msnyder/bin/.pw1.txt] 
    set pw2 [exec cat /home/msnyder/bin/.pw2.txt] 
    
    while {[gets $file1 host] != -1} { 
        puts $host 
        spawn -noecho ssh -q $host 
        expect { 
         -re $prompt { 
          send -- exit\r 
          expect eof 
         } 
         "current" { 
           send -- $pw2\r 
           expect "New password" 
           send -- $pw1\r 
           expect "Retype new password" 
           send -- $pw1\r 
         } 
         "continue connecting" { 
          send "yes\r" 
          expect { 
           "current" { 
            send -- $pw2\r 
            expect "New password" 
            send -- $pw1\r 
            expect "Retype new password" 
            send -- $pw1\r 
           } 
           -re $prompt { 
            send -- exit\r 
            expect eof 
           } 
          } 
         } 
        } 
    } 
    

    이 네 상황을 해결합니다.

  2. RSA 지문을 수락 할 필요가 없지만 암호를 변경해야합니다.
  3. RSA 지문을 수락하고 비밀번호를 변경해야합니다.
  4. RSA 지문을 수락해야하지만 암호는 변경하지 않아야합니다.
1
# a regular expression that matches a dollar sign followed by a space 
# anchored at the end of the string 
set prompt {\$ $} 

while {[gets $file1 host] != -1} { 
    puts $host 
    spawn -noecho ssh $host 
    expect { 
     "continue connecting" { 
      send "yes\r" 
      expect { 
       # ...snipped... 
       -re $prompt 
      } 
     } 
     -re $prompt 
    } 
    send -- exit\r 
    expect eof 
} 

.


멋진 답변이지만 코드 잘라 내기 및 붙여 넣기가 좋지 않습니다. 하나의 설명과 약간의 리팩터링 : "현재"블록을 클릭하면 암호는 변경되지만 끝내지 않습니다.

while {[gets $file1 host] != -1} { 
    puts $host 
    spawn -noecho ssh -q $host 
    expect { 
     "continue connecting" { 
      send "yes\r" 
      exp_continue 
     } 
     "current" { 
      send -- $pw2\r 
      expect "New password" 
      send -- $pw1\r 
      expect "Retype new password" 
      send -- $pw1\r 
      exp_continue 
     } 
     -re $prompt 
    } 
    send -- exit\r 
    expect eof 
} 

당신이, 당신은 예 보낸 다음 "현재"또는 프롬프트를보기 위해 기다릴 수 "연결 계속"을 참조하는 경우 : 각 시나리오는 프롬프트를보고하고 종료로 종료해야 할 발생합니다.
"현재"가 표시되면 암호를 변경 한 다음 프롬프트가 표시 될 때까지 기다립니다.
프롬프트가 표시되면 기대 의견이 끝나고 그 다음에 exit가 끝납니다.

+0

여전히 프롬프트에서 종료 메시지를 보내지 않습니다. 이것은 내가 위에 언급 한 것입니다 : http://pastebin.com/eb7NwTfJ 확실하지 않은 한 줄이 있습니다. 첫 번째'-re $ prompt'. 코드를 잘랐다면 그 코드가 속한 곳인지 알 수가 없습니다. – theillien

+0

내가보고있는 것은 원격 서버에 로그인되어있는 동안 루프의 다음 호스트가 exit 명령이 아닌 보내지고 있다는 것입니다. – theillien

관련 문제