Tôi muốn viết mã trong Ruby witch net :: ssh chạy từng lệnh một trên máy linux từ xa và đăng nhập mọi thứ (gọi là lệnh, stdout và stderr on máy linux).Ruby, chạy lệnh linux từng cái một, bằng SSH và LOG tất cả mọi thứ
Vì vậy, tôi viết hàm:
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
Ví dụ nếu tôi muốn tạo trên Linux từ xa các thư mục mới và tập tin: "./verylongdirname/anotherlongdirname/a.txt", và các tập tin danh sách trong direcotry đó, và tìm firefox ở đó (đó là ngu ngốc một chút: P) vì vậy tôi gọi trên thủ tục như thế:
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
Sau khi mã chạy trên tôi sẽ có thông tin phù thủy đầy đủ LOG về hành lệnh trong dòng # 1, # 2, # 3, # 4, # 5. Vấn đề là trạng thái trên linux, giữa các lệnh execude từ mảng cmds, không được lưu (vì vậy tôi phải lặp lại câu lệnh "cd" trước khi chạy lệnh thích hợp). Và tôi không thỏa mãn điều đó.
Mục đích của tôi là phải có bảng cmds như thế:
cmds=["mkdir verylongdirname", \ #1
"cd verylongdirname", \
"mkdir anotherlongdirname", \ #2
"cd anotherlongdirname", \
"touch a.txt", \ #3
"ls -la", \ #4
"find ./ firefox"] #5
Như bạn thấy, te trạng thái giữa chạy mỗi lệnh là lưu trên máy Linux (và chúng ta không cần lặp lại apropriate "cd" tuyên bố trước khi chạy lệnh thích hợp). Làm thế nào để thay đổi "rs (ssh, cmds)" thủ tục để làm điều đó và LOG tất cả mọi thứ (comand, stdout, stdin) như trước?
1. Trong http: // drnicwilliams. com/2006/09/22/remote-shell-with-ruby/chúng tôi thấy: 'shell = session.shell.sync' Web thứ hai là từ năm 2006. Hôm nay trong ruby shell.sync không hoạt động. Shell có thể bị rơi khỏi net phát triển :: ssh (Tôi không biết tại sao). Có một số gói phần mềm thay thế net-ssh-shell nhưng là để trẻ sử dụng nó (không có nhiều chức năng được thực hiện ở đó). –
2. Tôi đã đọc http://net-ssh.github.com/ssh/v1/chapter-5.html trước đây. Khi tôi cố gắng sử dụng các kênh với on_data của nó (cho stdout), on_extended_data (cho stderr) và send_data (để gửi lệnh một by one in loop) chức năng - nhưng tôi không thể lực lượng đăng nhập tuần tự (để đăng nhập tuần tự command1, stdout1, stderr1 , command2, stdout2, stderr2, command3, stdout3, sterr3 ...). Lý do là trong send_data - tất cả các lệnh được gửi trước khi nó được thực hiện trên máy từ xa (vì vậy trong log chúng ta thấy: command1, command2, command3, ..., stdout1, stderr1, stdout2, stderr2, stdout3, stderr3 .. .) –
@ user860099 - Xem chỉnh sửa của tôi. – Casper