Ruby, запускайте команды linux одну за другой, с помощью SSH и ЗАПИСЫВАЙТЕ все

Я хочу написать код на 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), как раньше?

8
задан Kamil Kiełczewski 24 July 2011 в 10:07
поделиться