web-dev-qa-db-ja.com

sshセッションからローカルマシンへのstdoutのキャプチャ

「showrunning-config」などのコマンドを実行し、出力をローカルマシン上のファイルに保存するために、デバイスにsshするスクリプトをまとめる必要があります。コマンドラインからこのような同様のタスクを実行し、ファイルをローカルシステムに保存しました。例えば、

ssh [email protected] ls > ls_from_remotes_sys

そして、ファイルls_from_remotes_sysは私のローカルシステムにあります。ただし、これをスクリプト化する必要があり、その方法を知る唯一の方法は、expectを使用することです。だから私はこれをまとめました:

#!/usr/bin/expect -f

spawn ssh [email protected] ls > ls_from_remotes_sys
expect "[email protected]'s password:"
send "password\r"
interact

期待スクリプトは機能しますが、ファイルはリモートシステムに保存されます。これは、私が望んでいることではありません。

質問1-ファイルがコマンドラインからローカルシステムに保存されるのはなぜですか?また、期待どおりにリモートシステムに保存されるのはなぜですか?

質問2-ファイルをローカルシステムに送信する方法はありますか? (ssh backはオプションではありません)

ファイルにリダイレクトする代わりに、スクリプトにコマンドの結果を画面に出力させることができるのではないかと考えていました。そう、

質問3-これを行う場合、リモートシステムから画面上のstdoutをキャプチャして、ローカルシステム上のファイルに送信するにはどうすればよいですか?

1
user53029

使用するexpectコマンド:

spawn ssh [email protected] ls > ls_from_remotes_sys

これは、効果的に呼び出します

exec("ssh","[email protected]","ls",">","ls_from_remotes_sys")

つまり、3つのパラメーター(ls>、およびファイル名)がリモートシステムに送信されます。つまり、リダイレクトはリモートシステムで発生します。

kludgeは、sh -c "ssh test@...."を介して呼び出すことができます。

もう1つの方法は、expectスクリプトの外部でリダイレクトを実行することです。

例:これを「get_ls」と呼んだ場合

#!/usr/bin/expect -f

spawn ssh [email protected] ls
expect "[email protected]'s password:"
send "password\r"
interact

次に、get_ls > ls_from_remotes_sysを実行できます。

4
Stephen Harris