SSHパスワードベースのログイン(およびログイン後の一連の操作)を自動化しようとしています。
SSHパスワードプロンプトがSTDINをバイパスすることを知っています。これを行うために、迅速な予想スクリプトを作成しました。
spawn ssh -o StrictHostKeyChecking=No $USERNAME@$HOST
expect {
timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
eof { send_user "\nSSH failure for $HOST\n"; exit 1 }
"*assword"
}
send "Pasword123\r"
expect {
timeout { send_user "\nLogin failed. Password incorrect.\n"; exit 1}
"*\$ "
}
sleep 1
send "echo 002-READY\r"
interact
これは私の期待通りに動作するようです。ただし、「相互作用」の後に実行中のスクリプトのSTDINに追加のコマンドを入力すると、SSHセッションに到達できないようです。
$ cat feed.sh
#!/bin/bash
sleep 3; echo "cat /etc/hosts"
$ ./feed.sh | ./ssh_expect_script
ただし、EOFを検出してセッションを終了します。
(解決策はキーペアを使用しているとは言わないでください。インタラクティブパスワードは理由のために特定の制約です。)
Expectを介して入力をリモートセッションにルーティングする方法は?
または、どのようにパスワードをSSHに送信できますか?
(代替の質問については、制御メカニズムとしてPHPを使用しています。最後の手段として、予想されるスクリプト全体を動的に生成できます。ttyに直接書き込もうとしましたが、画面に戻りました。また見ました。ssh-askpassにあります文書にはパスワードフレーズのみが記載されています。/デスクトップ環境に依存せずに実行されているバージョンが見つかりません。
答え1
Tcl と Expect は stdin を使用して自動的に操作を実行しません。積極的に読んでください。
send "echo 002-READY\r"
expect -re {\$ $}
fconfigure stdin -blocking no
while {[gets stdin line] != 0} {
# prevent an infinite loop waiting for data on stdin
if {$line eq ""} break
send "$line\r"
expect -re {\$ $}
}
# finished sending the input: now log off gracefully
send "exit\r"
expect eof
情報sleep
- 通常、何かを送信した後に眠る必要はありません。expect
パターンが正しい場合。expect -d program.exp
パターンが一致することを確認するためにスクリプトを開発するときにこれを使用することをお勧めします。
答え2
ああ - NLの代わりにCRが必要です。
echo -e "cat /etc/hosts\r"
(しかし誰かが私の2番目の質問に答えることができるなら...)