Centos 7がインストールされているPCで実行され、SSHを使用してCentos 7がインストールされている他のPCに接続し、「ls -la」などのコンソールコマンドを実行し、その出力をファイルに保存するスクリプトを作成する必要があります。後で出力してください。
私は次のようなEXPECTスクリプトを書いた:
ssh_connection.exp:
#!/usr/bin/expect -f
set timeout 120
spawn ssh [email protected]
expect "assword:"
send "PASSWORD\r"
expect "prompt#"
sleep 5
puts "Executing ls -la"
send "ls -la\r"
sleep 10
puts "Executing ps -af"
puts "ps -af\r"
sleep 10
puts "Closing the ssh session\r"
send "exit\r"
スクリプトはsshを介してIP = 129.0.0.10のコンピュータに正しく接続し、「puts」に表示される画面にメッセージを表示します。 ls -la 実行 ps -af 実行 ssh セッションを閉じる
ただし、sendに送信されたコマンドを実行した結果は表示されません。
ls -la
ps -af
このスクリプトにはどのような問題がありますか?
後でbashスクリプトまたはCプログラムを使用して分析できるように、前のコマンドの出力をファイルに保存するにはどうすればよいですか?
答え1
expect
を使用する必要はありません。このssh
コマンドは、SSH接続を介して実行するコマンドに追加の引数を使用できます。
ステップ1
SSHキーペア(google it)を設定し、SSHキーをリモートサーバーにコピーします。そのために、ssh-copy-id
次のU&L Q&Aへの回答をご覧ください。SSHを使用して接続できるように、リモートサーバーの秘密鍵をローカルコンピュータに正しくコピーするにはどうすればよいですか?。
ステップ2
これで、キーを使用してサーバーにSSHで接続する機能を使用すると、上記の問題は次のとおりです。
$ ssh [email protected] "ls -la; ps -af"
「いいね」を押してご利用ください。ここにあるドキュメント(heredocs、別名.here-docs)この技術をさらに強化してください。
$ ssh [email protected] <<EOF
> ls -la
> ps -af
> EOF
または、コマンドをファイルに入れて次に渡しますssh
。
$ ssh [email protected] < my.cmds
答え2
ありがとう、
スクリプトを修正し、次の行を置き換えました。
SSHの生成[Eメール保護]
あなたが私に言ったように:
SSHの生成[Eメール保護]"ls -la; ps -af"
これで、画面にコマンド出力が表示され、ファイルにリダイレクトできます。
次に、Ciscoに似たスイッチ(Ciscoではありませんが互換性)を使用して、他のシステムでコマンドを実行するようにこのスクリプトを変更しました。
SSHを使用してスイッチに接続するスクリプトは次のとおりです。
**#!/usr/bin/expect -f
タイムアウト設定 120
SSHの生成[Eメール保護]「VLAN 500 表示」
「パスワード:」が必要です。
"パスワード\r"を送信
「プロンプト#」を楽しみにしています
睡眠5
「sshセッションを閉じる\ r」と入力してください。
「終了\r」を送信**
>
スイッチでは動作しません。次のエラーが発生します。
SSHの生成[Eメール保護]VLAN 501の表示
[Eメール保護]パスワード:
imish: 無効なオプション - 'c'
詳細については、「imish --help」を試してください。
送信:生成ID exp6が開かれませんでした。
while executing
""終了\r"を送信"
(file "./ssh_script_v3.exp" line 7)
>
したがって、コマンドを送信するには「send」を使用するExpectスクリプトを使用する必要があります。
!/usr/bin/期待
SSHの生成[Eメール保護]
「パスワード:」が必要です。
「ユーザー\r」を送信
楽しみです>」
睡眠5
"sh vlan 500\r"を送信
睡眠5
"終了\r"を送信
>
これでエラーは発生しませんが、画面には何も表示されません。
私はLinuxとUNIXシステムが非対話型で実行されたときに出力を自動的にバッファリングするので、これが起こりました。私の考えでは、Expectは「unbuffer」を使ってプログラムがインタラクティブに実行されていると思うようにすることができると思いますが、「send」で「unbuffer」を使用する方法を知りません。私は成功せずにこれを試しました。