我正在连接服务器,想要运行命令并打印输出。这是代码:
def log_in
Net::SSH.start('hostname', 'username', :password => "password") do |ssh|
ssh.open_channel do |channel|
output = channel.exec "ls" do |ch, success, data|
if success then
alert "Result: #{output} #{success} #{data}"
end
end
end
end
end
结果是“输出”为空列表[],“成功”为真,“数据”为空。显然,情况并非如此,因为当我通过终端登录并点击“ls”命令时,列出了几个文件/文件夹。哪里是我的错?
有趣的是,如果我发送乱码作为命令,例如而不是“ls”,我发送“asdfgh”,它返回相同的([],true,空)。 使用Shoes / Ruby。
答案 0 :(得分:1)
看看docs。作为exec
方法的第二个参数传递的块只需要两个参数ch
和success
。您需要确保添加一个在数据可用时触发的回调。例如:
channel.on_data do |ch, data|
puts "got stdout: #{data}"
end
您也可以使用ssh.exec
方法。
答案 1 :(得分:1)
这有效:
Net::SSH.start('hostname', username, :password => password) do |ssh|
ssh.open_channel do |channel|
output = channel.exec "ls" do |ch, success, data|
if success then
channel.on_data do |ch, data|
alert "#{data}"
end
end
end
end
ssh.loop
end
问题是,登录时存在欢迎消息(并且它的第一行是空白的)。 " ssh.loop"允许通过欢迎信息的所有行,最后,通过" ls"命令。