2014-11-07 2 views
3

필자는 기대하는 스크립트를 여러 컴퓨터를 홉킹하고 명령을 실행하기 전에 대상 컴퓨터에 환경을 설정하는 멋진 ssh 프로그램으로 동작시키고 싶습니다.예상 송신 출력을 억제하는 방법은 무엇입니까?

log_user 0/1을 사용하여 expect에서 출력을 껐다 켤 수 있으며 암호 프롬프트 및 로그인 배너와 환경 설정 명령에 도움이됩니다.

하지만 ssh와 마찬가지로 스크립트가 명령을 내리기 시작하면 발행 된 명령을보고 싶지 않습니다. 그것은 "command \ n"을 보낸 후에 "command"를보고 싶지 않습니다. 내가보고 싶은 것은 명령의 결과뿐입니다.

송신 출력은 억제하지만 결과는 어떻게 억제합니까?

다음은 기대 스크립트의 코드 조각입니다 :

log_user 1 
foreach daline [lrange \$argv 0 end] { 
    send "\$daline\r" 
    set buffer1 
} 

그래서 전이 루프에, 내가 암호 및 설치 환경을 보낼 수 있습니다. 그런 다음이 루프에서 예상대로 인수로 제공되는 각 bash 명령을 실행합니다.

감사합니다.

답변

7

많은 프로그램이 입력을 반영합니다. 예를 들어, date 명령을 쉘에 보내면 date 문자열 다음에 날짜가 표시됩니다. 더 정확하게는 터미널에서 일반적으로 볼 수있는 모든 것을 볼 수 있습니다. 여기에는 서식도 포함됩니다.

send "date\r" 
expect -re $prompt 

명령은 상기 date\r\nFri Nov 7 20:47:32 IST 2014\r\nexpect_out (buffer) 세트로 끝난다. 더 중요한 것은 문자열 날짜가 에코되었습니다. 또한 각 행은 \r과 함께 전송 한 행을 포함하여 \r\n으로 끝납니다. 날짜의 반향은 send 명령과 아무 관련이 없습니다.

다른 말로하면, 문자열을 보내고 send가 그것을 처음에 반향하지 않으므로 echo하지 않는 것입니다. 생성 된 프로세스는 다음과 같습니다.

많은 경우, 스폰 된 프로세스는 실제로 터미널 드라이버에 에코 작업을 위임하지만 그 결과는 동일합니다. 즉, 프로세스의 입력을 프로세스의 출력으로 봅니다.

종종 에코 입력은 (다른 장소에서 사용한) log_user 만 사용하여 처리 할 수 ​​있습니다. 예를 들어 원격 호스트에 대한 연결이 생성되어 원격 날짜를 가져 오려고하지만 date 명령 자체가 표시되지 않는 경우를 가정 해보십시오. 일반적인 오류가 작성하는 것입니다 : 실행하면

log_user 0 ;# WRONG 
send "date\r" ;# WRONG 
log_user 1 ;# WRONG 
expect -re .*\n ;# WRONG 

log_user 명령은 expect 명령까지 에코 "날짜"를 읽지 않습니다 expect 때문에 효과가 없습니다. 단지 모든 처음에 반향을 사용하지 않도록 설정하는

send "date\r" 
log_user 0 
expect -re "\n(\[^\r]*)\r" ;# match actual date 

log_user 1 
puts "$expect_out(l,string)" ;# print actual date only 

원격 쉘에 명령을 많이 보내는 경우가 더 편리 할 수 ​​있습니다 다음과 같이이 문제를 해결하는 올바른 방법입니다. 쉘을 생성 한 다음 stty -echo 명령을 보내면 명령이 더 이상 반향 출력되지 않습니다. stty echo 에코가 활성화됩니다.

spawn ssh <host> 
stty -echo; # Disable 'echo' here 
expect something 

#Your further code here 

stty echo # Enable 'echo' here 

#Close of connection 

참조 : 대답에 대한 Exploring Expect

+0

감사합니다. 나는 이것을 시험해보고 내 글을 업데이트 할 것이다. 지금은 약간의 물건으로 바쁘다. – Bitdiot

+1

'log_user 1' 또는'stty echo'를 넣는 곳과 관계없이 여전히 암호가 누설됩니다. 따라서 인쇄를 다시 활성화 할 수는 없습니다. – Velkan

관련 문제