所以我一直在尝试使用Net :: SSH :: Multi使用via SSH登录多台机器,然后使用session.exec(“some_command”)在远程机器上执行shell命令。
守则:
#!/usr/bin/ruby
require 'rubygems'
require 'net/ssh'
require 'net/ssh/multi'
Net::SSH::Multi.start do |session|
# Connect to remote machines
### Change this!!###
session.use 'user@server'
loop = 1
while loop == 1
printf(">> ")
command = gets.chomp
if command == "quit" then
loop = 0
else
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
end
end
end
我目前遇到的问题是,当我在交互式提示符中输入命令时,“session.exec”没有返回输出util我退出程序,我想知道是否有人遇到过这个问题可以告诉我如何解决这个问题?
答案 0 :(得分:4)
在session.exec之后添加session.loop允许程序等待输出。
如:
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
session.loop
# Or session.wait also does the same job.
答案 1 :(得分:0)
看看here。 exec
方法似乎将结果提供给提供的块。
文档中的示例:
session.exec("command") do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
免责声明:我自己没有测试过。它可能工作与否。告诉我们什么时候有效!
答案 2 :(得分:0)
删除while循环并在调用exec后调用session.loop。像这样:
Net::SSH::Multi.start do |session|
# Connect to remote machines
### Change this!!###
session.use 'user@server'
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
# Tell Net::SSH to wait for output from the SSH server
session.loop
end