我想在 Ruby 女巫 net::ssh 中编写代码,在远程 linux 机器上一一运行命令并记录所有内容(在 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 行中获得有关执行命令的完整 LOG 女巫信息。问题是 linux 上的状态,在从 cmds 数组执行命令之间,没有保存(所以我必须在运行正确的命令之前重复“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)”程序来做到这一点并像以前一样记录一切(comand,stdout,stdin)?