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技術では問題が完全に解決されず、虚空に浮かんでいるだけです。

また、すぐにログアウトしてログインすると、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...\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

おすすめ記事