Centos 7を搭載したPCで実行され、Centos7を搭載した別のPCに接続するスクリプトを作成する必要がありますsshを使用して、コンソールコマンド(「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プログラム?
コメント
回答
これを行うためにexpect
を使用する必要はありません。ssh
コマンドは、SSH接続を介して実行するコマンドの追加の引数を取ることができます。
ステップ#1
SSHキーペアをセットアップし(google it)、SSHをコピーしますリモートサーバーへのキー。これを行うには、ssh-copy-id
を使用することをお勧めします。このU & LQ & Aタイトル:を正しくコピーする方法に対する私の回答を参照してください。 sshを使用して接続できるように、リモートサーバーからローカルマシンへの秘密鍵。
ステップ#2
これで、鍵を使用してサーバーにSSHで接続できるようになりました。 、上記の問題は次のようになります。
$ ssh [email protected] "ls -la; ps -af"
ここでドキュメント(ヒアドキュメント別名 。here-docs)この手法をさらに強化します。
$ ssh [email protected] <<EOF > ls -la > ps -af > EOF
または、コマンドをファイルに入れて:
$ ssh [email protected] < my.cmds
コメント
- ここで質問する理由 unix.stackexchange.com/questions/458801/ … は重複としてマークされましたか?パスワードだけでなくユーザー名を入力するように昇格させたいので、'は違うと思います。
回答
ありがとうございます
次の行を置き換えてスクリプトを変更しました:
spawn ssh [email protected]
あなたが私に言うように、これと一緒に:
spawn ssh [email protected] “ls -la; ps -af”
これで、画面にコマンド出力が表示されます。ファイルにリダイレクトできます。
次に、このスクリプトを適応させて、Ciscoのようなスイッチ(Ciscoではありませんが互換性があります)である別のマシンでコマンドを実行しようとしました。
sshを使用してスイッチに接続するスクリプトは次のとおりです。
**#!/ usr / bin / expect -f
set timeout 120
spawn ssh [email protected] “show vlan 500”
expect “assword:”
send “PASSWORD \ r”
expect “prompt # “
sleep 5
puts” Closing the ssh session \ r “
send” exit \ r “**
これはスイッチでは機能せず、次のエラーが発生します:
spawn ssh [email protected] show vlan 501
[email protected] “s password:
imish:invalid option-” c “
詳細については` imish–help “を試してください
send:spawn id exp6 not open
while executing
“send” exit \ r “”
(file "./ssh_script_v3.exp" line 7)
したがって、「send」を使用してコマンドを送信するexpectスクリプトを使用する必要があります:
!/ usr / bin / expect
spawn ssh [email protected]
expect “assword:”
send “user \ r”
expect “>”
sleep 5
send “sh vlan 500 \ r”
sleep 5
send “exit \ r”
エラーは発生しませんが、画面に何も表示されません。
これを読みましたLinuxおよびUNIXシステムは、非対話的に実行されている場合、出力を自動的にバッファリングするために発生します。 Expectは、プログラムが「unbuffer」によってインタラクティブに実行されていると思わせることができると思いますが、「unbuffer」と「send」の使用方法がわかりません。これをしようとすると、うまくいきません。
spawn ssh [email protected] ls -la>Ls
のようなコマンドを試しましたか?expect -d ssh_connection.exp
そして問題がどこにあるかを確認します。 'が最初にお勧めするのは、すべてのスリープをexpect "prompt#"