标签: net-ssh

在rails应用程序的前端获取实时日志

在rails 3.x应用程序中,我使用net :: ssh并向远程pc运行一些命令.我想将实时日志显示给用户的browser.like,如果有两个命令在net :: ssh中运行执行即echo "Hello",echo "Bye"被传递,然后"你好"应显示在其execution.Here后立即整理浏览器是我使用了SSH连接,并在轨道上运行的应用程序在Ruby中命令代码

Net::SSH.start( @servers['local'] , @machine_name, :password => @machine_pwd, :timeout => 30) do |ssh|      
  ssh.open_channel do |channel|
    channel.request_pty         
    channel.exec("echo 'ssh started'")                                   
    channel.exec("ruby -v") 
    channel.exec("rails -v") 
    channel.exec("echo 'ssh Finished'") 


    channel.on_close do |ch|
      puts "****shell terminated****"
    end

    channel.on_eof do |ch|
      puts "****remote end is done sending data****"            
    end
    channel.on_extended_data do |ch, type, data|
      puts "****got stderr****: #{data.inspect}"
    end
    channel.on_data do |channel, data|
      puts "****ondata****: #{data} \n"                    
      puts "****channel****: #{channel} \n"          
      $logs << …
Run Code Online (Sandbox Code Playgroud)

ruby ssh ruby-on-rails net-ssh eventmachine

6
推荐指数
1
解决办法
843
查看次数

找不到有效的gem:证书验证失败

我正在尝试建立一个到远程服务器的ssh隧道,如下所述:从Heroku到Mysql Db的远程服务器的SSH

但我只是想下载宝石而挂断电话.我补充说:

# file: Gemfile
...
gem 'net-ssh-gateway', '~> 1.2.0'
Run Code Online (Sandbox Code Playgroud)

但是当我这样做bundle install(或者甚至只是gem install net-ssh在命令行上)时,我得到:

ERROR:  Could not find a valid gem 'net-ssh' (>= 0), here is why:
        Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/latest_specs.4.8.gz)
Run Code Online (Sandbox Code Playgroud)

根据net-ssh的README(https://github.com/net-ssh/net-ssh),我检查了我的OpenSSL绑定Ruby - 看起来没问题:

$ ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 1.0.1j 15 Oct 2014
Run Code Online (Sandbox Code Playgroud)

我不确定这是否相关,但是当我尝试下载.pem文件以获得gemfile的高安全性下载时:

$ curl -O https://raw.github.com/net-ssh/net-ssh/master/gem-public_cert.pem
Run Code Online (Sandbox Code Playgroud)

...它没有下载.pem文件,直接访问该URL会导致"未找到".

其他信息:

$ rake about
About your …
Run Code Online (Sandbox Code Playgroud)

ruby ssh openssl ruby-on-rails net-ssh

6
推荐指数
2
解决办法
6370
查看次数

输入密码后,Net :: SSH sudo命令挂起

我一直在尝试使用Thor编写一个小型库来帮助我快速创建新项目和站点.我写了这个小方法:

def ssh(cmd)
  Net::SSH.start( server_ip, user, :port => port) do |session|
    session.exec cmd
  end
end
Run Code Online (Sandbox Code Playgroud)

在需要时帮助我在远程服务器上运行快速命令.

问题是当我需要在远程端的sudo下运行一个命令时,脚本似乎挂在我身上.例如,当执行此...时

ssh("sudo cp #{file_from_path} #{file_to_path}" )
Run Code Online (Sandbox Code Playgroud)

该脚本将提示我输入密码

[sudo] password for user:
Run Code Online (Sandbox Code Playgroud)

但是输入之后整个事情都会变得很糟糕.

有人会碰巧知道为什么它会完全挂起,我可以做些什么来在Net :: SSH(或其他替代方案)下的远程服务器上运行sudo命令?

*注意:在建议之前,我最初开始将这个库作为Capistrano下的食谱编写,直到我遇到Thor,并认为这是一个尝试它的好机会.如果需要的话,我不反对将整个事情切换回Capistrano,但如果没有一种简单的方法在远程服务器上运行sudo命令,我会感到非常惊讶.

ruby sudo net-ssh sudoers thor

5
推荐指数
4
解决办法
1万
查看次数

使用ruby gem net-ssh-multi一次在多个服务器上执行sudo命令

在上一个问题中, 我想出了如何在多个服务器上启动经过密码验证的ssh会话来运行单个命令.现在我需要能够执行"sudo"命令.问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:

[127.0.0.1:stderr] sudo:对不起,你必须有一个tty来运行sudo

根据文档,可以使用对通道对象的方法调用来分配伪终端,但是,以下代码不起作用:它生成上面的"no tty"错误:

require 'net/ssh'
require 'net/ssh/multi'

Net::SSH::Multi.start do |session|


  # define the servers we want to use
  my_ticket.servers.each do |session_server|
    session.use session_server , :user =>  user_name ,  \
                              :password => user_pass
  end


 # execute commands on all servers
  session.exec 'sudo ls /root' do |channel, stream, data|
   if data =~ /^\[sudo\] password for user:/
     channel.request_pty # <- problem must be here.
     channel.send_data user_pass
   end

  end

 # run the aggregated event loop
 session.loop
end
Run Code Online (Sandbox Code Playgroud)

$ …

ruby sudo net-ssh

5
推荐指数
1
解决办法
5110
查看次数

Ruby Net:SSH控制大师?

我目前有一个Ruby(Rails)应用程序,需要进行大量的短SSH连接.使用Ruby Net :: SSH库可以正常工作,除了每次我想要发出命令时应用程序必须登录并协商密钥,这太慢了.

有没有办法用Ruby Net :: SSH启用Control Master?在命令行测试中,这使得登录(在第一个之后)非常快,因为连接已经打开(密钥被协商等).

如果用Net :: SSH无法做到这一点,那么有人可以建议一个可以做到的替代库吗?

我想这必须是一个共同的要求,所以希望有人可以提供帮助.

谢谢!

ruby ssh ruby-on-rails net-ssh

5
推荐指数
1
解决办法
1295
查看次数

Ruby NET :: SCP包含通配符

我需要每天从我有SCP而不是SSH访问的客户端下载文件.

文件名将始终为 /outgoing/Extract/visit_[date]-[timestamp].dat.gz'

例如昨天的文件被调用 visits_20130604-090003.dat.gz

我不能依赖时间戳总是相同的事实,但日期应始终是昨天的日期:

我到目前为止的设置:

我的主目录包含名为downloads_fullname和的子目录downloads_wildcard.

它还包含一个名为的简单ruby脚本foo.rb.

foo.rb的内容是这个`

#! /usr/bin/ruby
require 'net/ssh'
require 'net/scp'
yesterday = (Time.now - 86400).strftime('%Y%m%d')

Net::SCP.start('hostname', 'username') do |scp|
  scp.download!('/outgoing/Extract/visits_' + yesterday + '-090003.dat.gz', 'downloads_fullname')
  scp.download!('/outgoing/Extract/visits_' + yesterday + '-*.dat.gz', 'downloads_wildcard')
end
Run Code Online (Sandbox Code Playgroud)

运行时,downloads_fullname目录包含该文件,但该downloads_wildcard目录不包含该文件.

有没有办法在Net :: SCP中使用通配符?或者有人有任何狡猾的解决方法吗?我试着\*无济于事.

ruby scp net-ssh

5
推荐指数
1
解决办法
1555
查看次数

如何将SIGINT发送到Net :: SSH会话中的进程startet?

我使用Net :: SSHv2连接到服务器并在该服务器上启动脚本.到目前为止它正在工作,但我想在脚本运行超过10分钟或输出文件太大时中断脚本.收到中断后,脚本将关闭并输出一些统计信息.

我当前的代码如下所示:

File.open(filename, "w") do |f|
  Net::SSH.start(host, user, password: password) do |ssh|
    ssh.exec! "do_work"  do |channel, stream, data|
      f << "data"
      #break if f.size > 1024 * 1024 * 100 #file size > 100 MB
      #channel.send_data "^C" if f.size > 1024 * 1024 * 100 #file size > 100 MB
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我尝试了一些其他的事情,为通道打开一个块并请求一个shell,但它没有用.

ruby net-ssh

5
推荐指数
1
解决办法
308
查看次数

Ruby net-ssh wirth 代理命令导致冻结

我想通过另一台使用 ruby​​ 连接到远程计算机。

该方案如下:

本地->代理->远程

我有这段代码正在执行直接访问的工作:

require 'net/ssh'
Net::SSH.start(remote_host, remote_user) do |ssh|
    puts ssh.exec!'hostname'
end
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用代理时,命令“主机名”被执行并且正确,但随后代码冻结,如果我调用 ssh.close 也是如此。

这是代码:

require 'net/ssh'
require 'net/ssh/proxy/command'

proxy_cmd = Net::SSH::Proxy::Command.new('ssh proxy_user@proxy_host nc %h %p')
Net::SSH.start(remote_host, remote_user, :proxy => proxy) do |ssh|
    puts ssh.exec!'hostname'
end
Run Code Online (Sandbox Code Playgroud)

借助 rsa 密钥,无需密码即可登录。并且 proxy 命令正在工作(我之前在 bash 中使用过它)

有人知道我做错了什么吗?

非常感谢您的关注,

编辑:这是日志中的最后一行,它在那里阻塞:

I, [2013-10-16T23:01:19.304778 #3785]  INFO -- net.ssh.connection.session[4555128]: closing remaining channels (0 open)
Run Code Online (Sandbox Code Playgroud)

ruby ssh ruby-on-rails net-ssh

5
推荐指数
1
解决办法
952
查看次数

Rails +延迟作业:SSH连接池

目前的情况:我有一个铁路应用程序与N延迟工作工人.每当我想向某台机器发送SSH请求时,我都会为该工作者创建一个任务.工人执行类似的事情:

Net:SSH.start(hostname, username, :password => pass) do |ssh|
  ssh.exec!(command)
end
Run Code Online (Sandbox Code Playgroud)

有时我会创建50个这样的任务,逐个执行,或者彼此在5-10分钟内完成.在这种情况下,每个任务都会打开单独的连接,这种连接无效,有时由于连接太多而被目标服务器阻止.

我想要的:打开连接存储在某处并由每个工作人员重用.这样每个工人都会以某种方式获得连接,然后才能运行

ssh.exec!(command)
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

  • 在文件/数据库/缓存中存储连接看起来是不可能的,因为它们不可序列化
  • 尝试使用具有在初始化器下实例化的全局变量的单例类.但是,每个worker的类对象都不同(后来发现全局变量不能作为选项).

有办法解决吗?还有其他想法吗?谢谢!!

ruby ruby-on-rails net-ssh delayed-job

5
推荐指数
1
解决办法
636
查看次数

使用Net :: SSH.start()登录时需要忽略HostKeyMismatch

:paranoid => false 在Net :: SSH.start()似乎不起作用

net-ssh

4
推荐指数
1
解决办法
2060
查看次数

标签 统计

net-ssh ×10

ruby ×9

ruby-on-rails ×5

ssh ×4

sudo ×2

delayed-job ×1

eventmachine ×1

openssl ×1

scp ×1

sudoers ×1

thor ×1