2013-04-25 1 views
5

서버로 ssh를 보내고 sudo su를 보낸 다음 iptables 상태를 확인하고 출력을 서버의 로그 파일에 저장하는 expect 스크립트를 작성하려고합니다. 아래는 스크립트입니다.스크립트가 ssh에 잘못된 명령 이름을 반환 할 것을 기대합니다.

1 #!/usr/bin/expect 
    2 exp_internal 1 
    3 log_user 0 
    4 set timeout 10 
    5 set password "******" 
    6 
    7 spawn /usr/bin/ssh -l subhasish *.*.*.* -p 10022 
    8 
    9 expect { 
10  -re "password: " {send "$password\r"} 
11  -re "$ " {send "sudo su\r"} 
12  -re "[sudo] password for subhasish:" {send "$password\r"} 
13  -re "# " {send "service iptables status\r"} 
14  } 
15 set output $expect_out(buffer) 
16 send "exit\r" 
17 puts "$output\r\n" >> output.log 

그러나 디버그 모드에서 실행되는 동안 오류가 발생합니다.

expect -d testcase 
expect version 5.44.1.15 
argv[0] = expect argv[1] = -d argv[2] = testcase 
set argc 0 
set argv0 "testcase" 
set argv "" 
executing commands from command file testcase 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {24105} 
invalid command name "sudo" 
    while executing 
"sudo" 
    invoked from within 
"expect { 
    -re "password: " {send "$password\r"} 
    -re "$ " {send "sudo su\r"} 
    -re "[sudo] password for subhasish:" {send "$password\r"} 
..." 
    (file "testcase" line 9) 

어디서 잘못 될지 잘 모르겠습니다. 그것은 잘못된 명령 이름 "sudo"를 말하고, 나는 기대하지 않기 때문에 이것이라고 생각합니다.이 명령을 이해하지 못합니다. 어떻게 돌아 다니 느냐. 도와주세요. 감사.

답변

11

문제는이 광고

-re "[sudo] password for subhasish:" {send "$password\r"} 
티클에

(따라서 기대로) 대괄호 (쉘에서 역 따옴표 같은) 명령을 교체하는 구문이다이다.

다른 문제를 불러옵니다
-re {[sudo] password for subhasish:} {send "$password\r"} 

: :이 정확한 문자를 볼 것으로 예상된다 그래서 당신은 괄호를 탈출 또는 다양한 확장을 방지 다른 따옴표를 사용해야 하나? 정규 표현식으로 대괄호를 처리 할 것을 기대하고 있으므로 정규 표현식에서 대괄호는 문자 클래스를 의미하기 때문에 ',', 'u', 'd'또는 'o '.

-re {\[sudo\] password for subhasish:} {send "$password\r"} 

또는

-ex {[sudo] password for subhasish:} {send "$password\r"} 
+0

나는 sudo su가 "subhasish를위한 암호 :"를 기대하고 또한 당신이 언급 한 방법을 바꾸었다. 아래 업데이트 된 코드를 사용하여 #!/usr/bin/expect -f #!/빈/bash는 설정된 제한 시간 60 LOG_USER 1 설정 호스트 *. *. *. * 암호 설정 ****** 산란 ssh를 -p 10022 $ 사용자의 경우 output.txt 세트 사용자 청년 Subhasish 세트의 로그 파일 @ $ 호스트 기대 "* assword : *" 전송 - "$ 암호 \ r에" LOG_USER 1 은 "$" 전송 기대 - "sudo는 스와 \ r에"를 는 "암호 청년 Subhasish에 대해"기대 전송 - - "$ password \ r" "#" send - "서비스 iptables 상태 \ r" log_file /home/subhasish/output.log expect "#" log_file send - "exit \ r"; send - "exit \ r"; exit 0 –

+0

수동 로깅은 다음과 같습니다. [root @ localhost subhasish] # ssh -p 10022 [email protected]*.*.*.* [email protected]*.*.*.* 암호 : 마지막 로그인 : Mon Apr 29 07:19:52 2013 *. *. *에서.* [청년 Subhasish의 @의 testhost ~] $ sudo를 쓰 [sudo는] 청년 Subhasish 암호 : [루트 @의 testhost의 청년 Subhasish가] # –

+0

디버그 스크립트가가에 갇히지 보여줍니다 예상 : 기대 : 않습니다 "\ 연구 \ n 마지막 로그인 : 월 Apr 29 07:35:36 2013 *. *. *. * \ r \ r \ n \ u001b] 0; subhasish @ testhost : ~ \ u0007 "(spawn_id exp4) 일치하는 글로브 패턴"subhasish의 비밀번호 : "?expect : "\ r \ n 지난 로그인 : Mon Apr 29 07:35:36 2013 *. *. *. * \ r \ r \ n \ u001b] 0; subhasish @ testhost : ~ \ u0007 \ u001b [? 1034h [subhasish @ testhost ~] $ "(spawn_id exp4) 일치하는 glob 패턴"subhasish의 암호 : "? no –

3

감사 글렌은, 지금 일하고있어 : 그래서 당신은 아마 필요한 것은 이것이다. 그것이 작동하지 않는 이유를 한 가지 더 이유는,이 코드는 여기에서 $ 프롬프트가 반환하기 전에, 그렇지 않으면 "sudo는 스와는"다른 사람에게 참조를 위해 전송되는 한, 정상 로그인 및 sudo는 로그인 사이에 잠을 필요로했다

#!/usr/bin/expect -f 
#! /bin/bash 

set timeout 60 
log_user 1 
set host *.*.*.* 
set password ****** 
set user subhasish 
set logfile output.txt 
spawn ssh -p 10022 [email protected]$host 
expect "*?assword:*" 
send -- "$password\r" 
#log_user 1 
sleep 2 
expect "$" 
send -- "sudo su\r" 
expect -gl {*password for subhasish:*} 
send -- "$password\r" 
expect "#" 
send -- "service iptables status\r" 
log_file /home/subhasish/output.log 
expect "#" 
log_file 
send -- "exit\r"; 
send -- "exit\r"; 
exit 0 
+0

프롬프트를 기다리는 것이 매우 유용했습니다. – phyatt

관련 문제