在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) 我正在尝试建立一个到远程服务器的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) 我一直在尝试使用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命令,我会感到非常惊讶.
在上一个问题中, 我想出了如何在多个服务器上启动经过密码验证的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(Rails)应用程序,需要进行大量的短SSH连接.使用Ruby Net :: SSH库可以正常工作,除了每次我想要发出命令时应用程序必须登录并协商密钥,这太慢了.
有没有办法用Ruby Net :: SSH启用Control Master?在命令行测试中,这使得登录(在第一个之后)非常快,因为连接已经打开(密钥被协商等).
如果用Net :: SSH无法做到这一点,那么有人可以建议一个可以做到的替代库吗?
我想这必须是一个共同的要求,所以希望有人可以提供帮助.
谢谢!
我需要每天从我有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中使用通配符?或者有人有任何狡猾的解决方法吗?我试着\*无济于事.
我使用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 连接到远程计算机。
该方案如下:
本地->代理->远程
我有这段代码正在执行直接访问的工作:
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) 目前的情况:我有一个铁路应用程序与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)
我尝试过的:
有办法解决吗?还有其他想法吗?谢谢!!
:paranoid => false 在Net :: SSH.start()似乎不起作用
net-ssh ×10
ruby ×9
ssh ×4
sudo ×2
delayed-job ×1
eventmachine ×1
openssl ×1
scp ×1
sudoers ×1
thor ×1