私は単純な ssh ログイン ラッパー ツールを作成して、非常に多くのサーバーの 1 つに自動ログインできるようにしています。
最初にユーザー入力から説明を取得し、対応する (最も関連性の高い) サーバー IP とパスワードを抽出して、どこかに安全に保存されます。これを使用して、expect スクリプトを作成します。
期待スクリプトは次のようになります。
spawn ssh2 -q -t Bob@172.23.24.35 予想 { "assword:" {send "Bob123\r"} } 相互作用する
これをexpectにパイプすると(expectはstdinからスクリプトを読み取ることができる)、「interact」に到達するまですべてがうまくいきます。expectは、eofを受け取ってすぐに終了すると主張します。次に、これをtmp.expなどのファイルに保存すると、同じ問題が発生します「expect < tmp.exp」を実行しますが、「expect -f tmp.exp」を実行するとすべて問題ありません。
その理由は、「対話」が fd0 から入力を受け取り、プログラム (またはシェル) によってパイプにリダイレクトされるためだと思います。これは、「expect < xx.exp」のようなことをすると、interact を使用できないということですか? 「interact」コマンドの前に fd0 を実際の端末に再開する方法はありますか? 私はたくさんグーグルで検索しましたが、「close_on_eof 0」のようなものしか得られませんでした。意味も仕組みもわかりません。前もって感謝します!