既知の固定ユーザー名とパスワードを使用してシリアルポートを介して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
技術では問題が完全に解決されず、虚空に浮かんでいるだけです。
また、すぐにログアウトしてログインすると、2番目にパスワードを要求せずにプロンプトに進みます。
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