Ruby, ausführen, linux-Befehle nacheinander per SSH und LOG alles
Will ich schreiben von code in Ruby-Hexe net::ssh, das ausführen von Befehlen eins zu eins auf remote-linux-Maschine, und melden Sie alles, was (genannten Befehl, stdout und stderr auf der linux Maschine).
Also Schreibe ich-Funktion:
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
Zum Beispiel, wenn ich wollen zu erstellen, die auf remote-linux-neue Ordner und Datei: "./verylongdirname/anotherlongdirname/a.txt" und die Liste Dateien in diesem Verzeichnis nach, und finden firefox gibt es (das ist ein wenig dumm :P) also ich nenne die oben genannten Verfahren so:
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
After-run-code oben habe ich die volle LOG-Hexe Informationen über Ausführungen von Befehlen, die in Zeile #1,#2,#3,#4,#5. Das problem ist, dass der Staat auf linux -, zwischen execude Befehle aus der commands array, wird nicht gespeichert (so muss ich wiederholen, "cd" - Anweisung vor dem ausführen ordnungsgemäße Befehl). Und ich bin nicht zufrieden mit, dass.
Mein Zweck ist, um Befehle Tabellen so:
cmds=["mkdir verylongdirname", \ #1
"cd verylongdirname", \
"mkdir anotherlongdirname", \ #2
"cd anotherlongdirname", \
"touch a.txt", \ #3
"ls -la", \ #4
"find ./firefox"] #5
Wie Sie sehen, te Zustand zwischen jeden Befehl speichern auf dem linux-Rechner (und die wir nicht brauchen, wiederholen Sie die entsprechenden "cd" - Anweisung vor dem ausführen ordnungsgemäße Befehl). Wie zu ändern", rs(ssh commands)" Verfahren, es zu tun, und MELDEN Sie ALLES, was (comand,stdout,stdin) wie vorher?
InformationsquelleAutor Kamil Kiełczewski | 2011-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht versuchen Sie es mit einem ssh-Kanal statt zum öffnen einer remote shell. Das sollte preserve state zwischen Ihre Befehle als die Verbindung offen gehalten werden:
http://net-ssh.github.com/ssh/v1/chapter-5.html
Hier ist auch ein Artikel, der etwas ähnliches mit einer etwas anderen Ansatz:
http://drnicwilliams.com/2006/09/22/remote-shell-with-ruby/
Bearbeiten 1:
Ok. Ich sehe, was Sie sagen.
SyncShell
war entfernt von Net::SSH-2.0. Allerdings fand ich diese, das sieht aus wie es funktioniert ziemlich viel, wasSyncShell
haben:http://net-ssh-telnet.rubyforge.org/
Beispiel:
I. e.
Net::SSH::Telnet
synchron ist, und bewahrt Staat, denn es läuft in einen pty-mit dem remote-shell-Umgebung. Denken Sie daran, die richtige Eingabeaufforderung Erkennung, sonstNet::SSH::Telnet
erscheinen zu hängen, sobald Sie es aufgerufen wird (es ist zu finden versuchen, um die Eingabeaufforderung).2. Ich lese net-ssh.github.com/ssh/v1/chapter-5.html vor. Wenn ich versuche, die Kanäle mit Ihren on_data(für stdout), on_extended_data(für stderr) und send_data(für das senden von Befehlen nacheinander in Schleife) Funktionen - aber ich kann nicht zwingen, sequentielle log (log sequentielle command1,stdout1,stderr1,command2,stdout2,stderr2,command3,stdout3,sterr3...). Der Grund dafür ist, dass in der send_data - alle Befehle senden war vor der ersten der es ausgeführt werden, die auf remote-Maschine (also im log sehen wir: command1,command2,command3,...,stdout1,stderr1,stdout2,stderr2,stdout3,stderr3...)
Siehe mein edit.
3. Ok, danke U sehr viel - es ist, was ich wan nicht. 🙂 BTW: Mein linux-Eingabeaufforderung "/[$%# > ] \z/n" - und es ist Standard für net - /ssh - /telnet-Paket - so dass ich nicht brauchen, um verwenden Sie die "Eingabeaufforderung" option. Dank
InformationsquelleAutor Casper
Können Sie Rohr statt:
Check this link, rubyforge.org/projects/win32utils (
win32-popen3
)InformationsquelleAutor Victor Moroz
Ok, schließlich mit der Hilfe von @Casper ich das Verfahren (maby jemanden verwenden):
Wir nennen es im code:
Danke, bye.
InformationsquelleAutor Kamil Kiełczewski
Hier die wrapper-Net/ssh hier ist der Artikel http://ruby-lang.info/blog/virtual-file-system-b3g
Quelle https://github.com/alexeypetrushin/vfs
anmelden alle Befehle überschreiben die Box.die bash-Methode, und fügen Sie die Protokollierung gibt es
InformationsquelleAutor Alexey Petrushin