많은 프로그램이 입력을 반영합니다. 예를 들어, date
명령을 쉘에 보내면 date 문자열 다음에 날짜가 표시됩니다. 더 정확하게는 터미널에서 일반적으로 볼 수있는 모든 것을 볼 수 있습니다. 여기에는 서식도 포함됩니다.
send "date\r"
expect -re $prompt
명령은 상기 date\r\nFri Nov 7 20:47:32 IST 2014\r\n
에 expect_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
감사합니다. 나는 이것을 시험해보고 내 글을 업데이트 할 것이다. 지금은 약간의 물건으로 바쁘다. – Bitdiot
'log_user 1' 또는'stty echo'를 넣는 곳과 관계없이 여전히 암호가 누설됩니다. 따라서 인쇄를 다시 활성화 할 수는 없습니다. – Velkan