SSH 비밀번호 기반 로그인(및 로그인 후 일련의 작업)을 자동화하려고 합니다.
SSH 비밀번호 프롬프트가 STDIN을 우회한다는 것을 알고 있습니다. 이를 위해 빠른 예상 스크립트를 작성했습니다.
spawn ssh -o StrictHostKeyChecking=No $USERNAME@$HOST
expect {
timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
eof { send_user "\nSSH failure for $HOST\n"; exit 1 }
"*assword"
}
send "Pasword123\r"
expect {
timeout { send_user "\nLogin failed. Password incorrect.\n"; exit 1}
"*\$ "
}
sleep 1
send "echo 002-READY\r"
interact
이것은 내 예상대로 작동하는 것 같습니다. 그러나 "상호작용" 후에 실행 중인 스크립트의 STDIN에 추가 명령을 입력하면 SSH 세션에 도달하지 못하는 것 같습니다.
$ cat feed.sh
#!/bin/bash
sleep 3; echo "cat /etc/hosts"
$ ./feed.sh | ./ssh_expect_script
그러나 EOF를 감지하고 세션을 종료합니다.
(해결책이 키 쌍을 사용하는 것이라고 말하지 마십시오. 대화형 암호는 이유 때문에 특정 제약 조건입니다.)
Expect를 통해 입력을 원격 세션으로 라우팅하는 방법은 무엇입니까?
또는 어떻게 비밀번호를 SSH로 보낼 수 있나요?
(대체 질문에 관해서는 제어 메커니즘으로 PHP를 사용하고 있습니다. 최후의 수단으로 전체 예상 스크립트를 동적으로 생성할 수 있습니다. tty에 직접 쓰려고 시도했지만 화면으로 반환되었습니다. 또한 살펴보았습니다. ssh-askpass에 있지만 문서에는 암호 문구만 언급되어 있습니다./데스크톱 환경에 의존하지 않고 실행되는 버전을 찾을 수 없습니다.
답변1
Tcl과 Expect는 stdin을 사용하여 자동으로 작업을 수행하지 않습니다. 적극적으로 읽어야 합니다.
send "echo 002-READY\r"
expect -re {\$ $}
fconfigure stdin -blocking no
while {[gets stdin line] != 0} {
# prevent an infinite loop waiting for data on stdin
if {$line eq ""} break
send "$line\r"
expect -re {\$ $}
}
# finished sending the input: now log off gracefully
send "exit\r"
expect eof
정보 sleep
– 일반적으로 무언가를 보낸 후 잠을 잘 필요가 없습니다.expect
패턴이 맞다 면. expect -d program.exp
패턴이 일치하는지 확인하기 위해 스크립트를 개발할 때 이것을 사용하는 것이 좋습니다 .
답변2
아 - NL 대신 CR이 필요해
echo -e "cat /etc/hosts\r"
(하지만 누군가 내 두 번째 질문에 대답할 수 있다면...)