알려진 고정 사용자 이름과 비밀번호를 사용하여 직렬 포트를 통해 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...
\r
send \"\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