GNU 화면을 사용하여 Linux 직렬 포트에 자동으로 로그인하기 위해 대화형 셸 전에 키 입력을 보내는 방법은 무엇입니까?

GNU 화면을 사용하여 Linux 직렬 포트에 자동으로 로그인하기 위해 대화형 셸 전에 키 입력을 보내는 방법은 무엇입니까?

알려진 고정 사용자 이름과 비밀번호를 사용하여 직렬 포트를 통해 Linux 개발 보드에 로그인해야 하는 경우가 종종 있습니다.

일반적인 명령은 다음과 같습니다:

screen /dev/ttyS0 115200

그러면 screen내부 세션은 다음과 같습니다.

<enter>
somehost login: root<enter>
Password: root<enter>
user@host#

매번 사용자 이름과 비밀번호를 입력할 필요가 없도록 이 로그인 프로세스를 자동화하려면 어떻게 해야 합니까?

필요하다면 나도 그것을 사용할 수 있다 expect. 나는 시도했다:

expect -c "spawn screen /dev/ttyS${1:-0} ${2:-115200}; send "\r"; expect \"* login: \"; send \"root\"; expect \"Password: \"; send \"root\"; interact"

하지만 내 expect기술로는 문제가 완전히 해결되지 않고 허공에 떠 있을 뿐입니다.

또한 즉시 로그아웃하고 로그인하면 두 번째로 비밀번호를 묻지 않고 바로 프롬프트로 이동합니다.

user@host#

따라서 스크립트에서도 이 점을 고려해야 합니다. 또한보십시오:https://stackoverflow.com/questions/9464887/modify-expect-based-ssh-script-to-work-on-machines-that-dont-require-a-password

SSH에 대한 비슷한 질문:https://stackoverflow.com/questions/459182/using-expect-to-pass-a-password-to-ssh

답변1

expect옵션을 추가하면 디버깅을 도울 수 있습니다 -d. 귀하의 예에서는 수행 중인 작업 자체 가 큰따옴표 외부에 있기 "...send "\r"..."때문에 쉘에 의해 평가되는 것을 볼 수 있습니다 . 다른 상황으로 바꿔보세요 . 또한 다음과 같이 각 전송 끝에 캐리지 리턴을 넣어야 합니다 ....send r...\rsend \"\r\"send \"root\r\"

작은 셸 스크립트 파일을 작성하거나 작은 따옴표를 사용하여 ${1:-0}보간해야 하는 내용을 큰 따옴표로 변환하는 것이 더 깔끔할 것입니다.

expect -c 'spawn screen /dev/ttyS'"${1:-0} ${2:-115200}"'; send \r; expect " login: ";...'

이 전체 스크립트(셸을 사용하지 않음)는 이미 로그인한 경우도 처리합니다.

#!/bin/expect --
set tty 0
set baud 115200
if { $argc >= 1 } {
 set tty [lindex $argv 0]
}
if { $argc >= 2 } {
 set baud [lindex $argv 1]
}
spawn screen /dev/ttyS$tty $baud
send \r
expect {
      "login: " {
           send root\r
           expect "Password: "
           send root\r
       }
       "#" 
    }
interact

관련 정보