Я хочу написать код на Ruby witch net :: ssh, который будет запускать команды одну за другой на удаленной машине Linux и регистрировать все (называемые командами, stdout и stderr на машине Linux).
Так я пишу функцию:
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. Проблема в том, что состояние в 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), как раньше?