예상치 못한 예상/ssh 문제

예상치 못한 예상/ssh 문제

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"

(하지만 누군가 내 두 번째 질문에 대답할 수 있다면...)

관련 정보