Chcę napisać kod w sieci Ruby: net ssh, który uruchamia komendy jeden po drugim na zdalnym komputerze linuxowym i rejestruje wszystko (polecenia, stdout i stderr na maszyna linuxowa).Ruby, uruchamiaj komendy linuksowe jeden po drugim, SSH i LOG wszystko, co chcesz
Więc funkcję napisać:
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
Na przykład, jeśli chcesz utworzyć na zdalny linux nowych folderów i plików: „./verylongdirname/anotherlongdirname/a.txt” oraz lista plików w tym direcotry, i znaleźć firefox nie (co jest głupie trochę: P), więc zgłoszę powyżej procedury tak:
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
Po kodzie wykonywania wyżej będę miał pełny raport informacje czarownica o egzekucjach komendy w linii # 1, # 2, # 3, # 4, # 5. Problem polega na tym, że stan w systemie Linux, pomiędzy poleceniami execude z tablicy cmds, nie jest zapisywany (więc muszę powtórzyć instrukcję "cd" przed uruchomieniem odpowiedniego polecenia). I nie jestem z tego zadowolony.
Moim celem jest mieć CMDS tabele tak:
cmds=["mkdir verylongdirname", \ #1
"cd verylongdirname", \
"mkdir anotherlongdirname", \ #2
"cd anotherlongdirname", \
"touch a.txt", \ #3
"ls -la", \ #4
"find ./ firefox"] #5
Jak widać, te państwa między metę każda komenda jest zaoszczędzić na maszynie Linux (i nie musimy powtarzać odniesieniu do odpowiednich „CD” oświadczenie przed uruchomieniem odpowiedniego polecenia). Jak zmienić "rs (ssh, cmds)" aby to zrobić i ZALOGUJ SIĘ WSZYSTKO (comand, stdout, stdin) jak wcześniej?
1. http: // drnicwilliams. com/2006/09/22/remote-shell-with-ruby/widzimy: 'shell = session.shell.sync' Thad web jest z 2006 roku. Dzisiaj w ruby shell.sync nie działa. Shell prawdopodobnie został usunięty z develop net :: ssh (nie wiem dlaczego). Jest trochę alternatywnego pakietu net-ssh-shell, ale jest młody, aby go użyć (nie ma tam wiele funkcji). –
2. Czytam wcześniej http://net-ssh.github.com/ssh/v1/chapter-5.html. Kiedy próbuję użyć kanałów z jego danymi wyjściowymi (dla stdout), on_extended_data (dla stderr) i send_data (dla poleceń wysyłania jeden po drugim w pętli) funkcje - ale nie mogę wymusić dziennika sekwencyjnego (aby logować sekwencyjne polecenie1, stdout1, stderr1 , command2, stdout2, stderr2, command3, stdout3, sterr3 ...). Powodem jest to, że w send_data - wszystkie polecenia były wysyłane zanim pierwsze z nich zostaną wykonane na zdalnym komputerze (tak w logu widzimy: command1, command2, command3, ..., stdout1, stderr1, stdout2, stderr2, stdout3, stderr3 .. .) –
@ user860099 - Zobacz moją edycję. – Casper