Ruby witch net::ssh で、リモート Linux マシンでコマンドを 1 つずつ実行し、すべてをログに記録するコードを書きたい (Linux マシンではコマンド、stdout、stderr と呼ばれる)。
だから私は関数を書く:
def rs(ssh,cmds)
cmds.each do |cmd|
log.debug "[SSH>] #{cmd}"
ssh.exec!(cmd) do |ch, stream, data|
log.debug "[SSH:#{stream}>] #{data}"
end
end
end
たとえば、リモートLinuxで新しいフォルダーとファイルを作成したい場合:「./verylongdirname/anotherlongdirname/a.txt」、そのディレクトリにファイルをリストし、そこでfirefoxを見つけます(これは少しばかげています:P)ので、呼び出します上記の手順は次のとおりです。
Net::SSH.start(host, user, :password => pass) do |ssh|
cmds=["mkdir verylongdirname", \ #1
"cd verylongdirname; mkdir anotherlongdirname, \ #2
"cd verylongdirname/anotherlongdirname; touch a.txt", \ #3
"cd verylongdirname/anotherlongdirname; ls -la", \ #4
"cd verylongdirname/anotherlongdirname; find ./ firefox" #5 that command send error to stderr.
]
rs(ssh,cmds) # HERE we call our function
ssh.loop
end
上記のコードを実行すると、#1、#2、#3、#4、#5 の実行コマンドに関する完全なログ ウィッチ情報が得られます。問題は、cmds 配列からの実行コマンド間の Linux の状態が保存されないことです (したがって、適切なコマンドを実行する前に「cd」ステートメントを繰り返す必要があります)。そして、私はそれに満足していません。
私の目的は、次のような cmds テーブルを持つことです。
cmds=["mkdir verylongdirname", \ #1
"cd verylongdirname", \
"mkdir anotherlongdirname", \ #2
"cd anotherlongdirname", \
"touch a.txt", \ #3
"ls -la", \ #4
"find ./ firefox"] #5
ご覧のとおり、各コマンドの実行間の状態は Linux マシンに保存されます (適切なコマンドを実行する前に、適切な「cd」ステートメントを繰り返す必要はありません)。"rs(ssh,cmds)" 手順を変更して、以前のようにすべて (コマンド、標準出力、標準入力) をログに記録するにはどうすればよいですか?