GNUスクリーンでLinuxシリアルポートログインを自動化するために、対話型シェルの前にキーストロークを送信する方法は?


4

シリアルポート経由で既知の固定ユーザー名とパスワードを使用して、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


私はこのような何かが働くと信じています:screen -X at "ttyS0" stuff "root\n$PASSWORD\n"しかし、私はそれをテストするためのシリアルポートを持っていません。
カスパード

@kasperd -X簡単に試してみましたが、動作しませんでした。後でもう少し試すかもしれません。
Ciro Santilli新疆改造中心法轮功六四事件

回答:


5

expectオプションを追加することでデバッグを支援できます-d。あなたの例"...send "\r"..."では、二重引用符の外側にある...send r...ため、シェルによって評価されていることがわかります\rsend \"\r\"他の場合と同じように変更してみてください。また、各sendの最後に同様のキャリッジリターンを配置する必要があります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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.