Quiero escribir el código en Ruby witch net :: ssh que ejecuta los comandos uno por uno en la máquina remota de Linux y registra todo (llamado comando, stdout y stderr en máquina de linux).Ruby, ejecuta los comandos de Linux uno por uno, mediante SSH y LOG todo
Por lo tanto, la función de escribir:
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
Por ejemplo, si quiero crear en Linux remota nuevas carpetas y archivos: "./verylongdirname/anotherlongdirname/a.txt", y archivos de lista en que direcotry, y encontrar firefox allí (que es tonto un poco: P) para que yo llamo el procedimiento anterior así:
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
Después de ejecutar código anterior voy a tener información de brujas registro completo sobre ejecuciones comandos en la línea # 1, # 2, # 3, # 4, # 5. El problema es que el estado en Linux, entre los comandos de ejecución de cmds array, no se guarda (así que debo repetir la instrucción "cd" antes de ejecutar el comando correcto). Y no estoy satisfecho con eso.
Mi objetivo es tener tablas CMDS así:
cmds=["mkdir verylongdirname", \ #1
"cd verylongdirname", \
"mkdir anotherlongdirname", \ #2
"cd anotherlongdirname", \
"touch a.txt", \ #3
"ls -la", \ #4
"find ./ firefox"] #5
Como se ve, te estado entre la ejecución de cada comando es ahorrar en la máquina Linux (y que no es necesario repetir apropriate "cd" declaración antes de ejecutar el comando correcto). ¿Cómo cambiar el procedimiento "rs (ssh, cmds)" para hacerlo y LOG TODO (comand, stdout, stdin) como antes?
1. En http: // drnicwilliams. com/2006/09/22/remote-shell-with-ruby/vemos: 'shell = session.shell.sync' Thad web es de 2006. Hoy en ruby shell.sync no funciona. Shell probablemente haya caído de develop net :: ssh (no sé por qué). Existe un paquete alternativo net-ssh-shell pero es joven para usarlo (no se implementan muchas funciones allí). –
2. Leí http://net-ssh.github.com/ssh/v1/chapter-5.html antes. Cuando trato de usar canales con sus funciones on_data (para stdout), on_extended_data (para stderr) y send_data (para enviar comandos uno a uno en bucle), pero no puedo forzar el registro secuencial (para registrar comandos secuenciales1, stdout1, stderr1) , command2, stdout2, stderr2, command3, stdout3, sterr3 ...). El motivo es que en send_data, todos los comandos se enviaron antes de ejecutarse primero en la máquina remota (de modo que en el registro vemos: comando1, comando2, comando3, ..., stdout1, stderr1, stdout2, stderr2, stdout3, stderr3 ... .) –
@ user860099 - Ver mi edición. – Casper