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