我有一段代码,只是试图在远程服务器上执行一个脚本,如果它失败了,我想打个电话跟进,想象一下:
require 'rubygems'
require 'net/ssh'
require 'etc'
server = 'localhost'
Net::SSH.start(server, Etc.getlogin) do |ssh|
puts (ssh.exec("true") ? 'Exit Success' : "Exit Failure")
puts (ssh.exec("false") ? 'Exit Success' : "Exit Failure")
end
Run Code Online (Sandbox Code Playgroud)
我希望(忽略stdout和stderr打印在我的设计示例中) - 但是第一行应该退出0,我希望Ruby会与之交互false并显示"退出失败"(当然,逻辑是错误的,三元需要被翻转) - 但第二行应以相反的状态退出,但事实并非如此.
我甚至无法在文档中找到有关如何执行此操作的任何内容,我有点担心我可能做错了吗?!
我正在研究需要生成SSH密钥对的Ruby/Rack应用程序.尽管我想ssh-keygen从应用程序调用,但我不能,因为它设计为在Heroku上运行,并且它们不支持调用该命令.
我已经能够在Ruby标准库中使用OpenSSL获取私有/公共RSA密钥,执行以下操作:
key = OpenSSL::PKey::RSA.generate(2048)
# => -----BEGIN RSA PRIVATE KEY----- ....
key.public_key
# => -----BEGIN RSA PUBLIC KEY----- ....
Run Code Online (Sandbox Code Playgroud)
遗憾的是,RSA公钥和SSH公钥不是一回事,即使它们可以使用相同的RSA密钥生成.SSH公钥类似于以下内容:
ssh-rsa AAAAB3NzaC1yc2EAAAABIwA.....
Run Code Online (Sandbox Code Playgroud)
是否可以在Ruby中生成SSH密钥或将RSA密钥转换为SSH而不使用ssh-keygen?
我无法使用'net-ssh'gem通过ssh从ruby连接,获得Net :: SSH :: AuthenticationFailed.代码如下
require 'net/ssh'
keys = ["path_to_private_key"]
Net::SSH.start('host', 'user',:keys => keys, :verbose => :debug) do |ssh|
#ssh code
end
Run Code Online (Sandbox Code Playgroud)
直接从命令行使用ssh工作:
ssh -i <path_to_private_key> user@host
Run Code Online (Sandbox Code Playgroud)
我的ssh API有问题吗?我尝试了'user @ host'和'user'作为用户名,结果相同.
这是调试输出:
D, [2011-07-26T19:42:00.135148 #3511] DEBUG -- net.ssh.transport.session[140b040]: establishing connection to host:22
D, [2011-07-26T19:42:00.164190 #3511] DEBUG -- net.ssh.transport.session[140b040]: connection established
I, [2011-07-26T19:42:00.164344 #3511] INFO -- net.ssh.transport.server_version[140a3fc]: negotiating protocol version
D, [2011-07-26T19:42:00.192092 #3511] DEBUG -- net.ssh.transport.server_version[140a3fc]: remote is `SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu3'
D, [2011-07-26T19:42:00.192177 #3511] DEBUG -- net.ssh.transport.server_version[140a3fc]: local is `SSH-2.0-Ruby/Net::SSH_2.1.4 x86_64-linux'
D, …Run Code Online (Sandbox Code Playgroud) 我已经在这几天挣扎了......
当我尝试从视图中调用帮助器中的方法来执行ssh时,它会抛出该错误.
"加载以下文件时发生此错误:net/ssh"
但是当我将代码复制到test.rb文件中并从提示符执行时,ruby test.rb它会完美地连接.
可能是什么问题呢 ?我尝试了另一台计算机和相同的结果.
非常感谢,这就像我完成项目之前的最后一步!
问候,
application_helper.rb:
module ApplicationHelper
def title(value)
unless value.nil?
@title = "#{value} | Eucc"
end
end
def execute
require 'rubygems'
require 'net/ssh'
@hostname = "smtlmon02"
@username = "gcaille"
@password = "qaz1234"
@cmd = "ls -al"
@cmd2 = "sudo su - -c 'ls;date'"
ssh = Net::SSH.start(@hostname, @username, :password => @password)
res = ssh.exec!(@cmd)
res2 = ssh.exec!(@cmd2)
ssh.close
File.open("output.txt", 'w') {|file| file.write(res2)}
end
end
Run Code Online (Sandbox Code Playgroud) 有没有办法禁用或设置ruby Net-SSH连接的页面长度,所以我们不必更改远程设备上的设置?
在Cisco路由器中,我们将使用参数"终端长度0"来完成此操作,但在其他服务器上,我们不能使用任何类似的命令.可以通过Net-SSH lib设置吗?
有问题的代码
Net::SSH.start('server name', 'user')
Run Code Online (Sandbox Code Playgroud)
这返回"非绝对的家"."用户"实际上确实有一个主目录.一种建议的方法是使用IdentityFile的完整路径修改〜/ .ssh/config.这并没有解决问题.
这个疯狂的部分是,如果通过irb或控制台调用代码可以正常工作.我们尝试从类方法(使用相同的代码)调用它时,它返回"非绝对主页"错误.
'user'也可以通过命令行ssh进入服务器而不会出现问题.服务器正在运行Ubuntu.
UPDATE
感谢@Phrogz - 解决这个问题的方法是将ENV ['HOME']设置为'/ home/deploy'.但是,我还没弄清楚为什么$ HOME被设置为"." 在服务器上.所以,在我或其他人明白这一点之前,我会在没有"答案"的情况下提出这个问题.必须手动设置HOME感觉更像是一个"黑客"而不是一个合适的解决方案,但它确实有效.
使用rvm和一个空的gemset,我得到这个:
$ gem install chef --no-ri --no-rdoc
ERROR: While executing gem ... (Gem::DependencyError)
Unable to resolve dependencies: chef requires net-ssh (~> 2.2.2); net-ssh-multi requires net-ssh (>= 2.6.5); net-ssh-gateway requires net-ssh (>= 2.6.5)
Run Code Online (Sandbox Code Playgroud)
我已经尝试通过安装早期版本的net-ssh-gateway和net-ssh-multi来解决它,但net-ssh-multi版本1.1通过安装1.1.2使我感到困惑.
我已经阅读了net-ssh文档,我仍然感到困惑.我可以手动验证(使用ssh -i ...),也可以将密钥放在文件中并使用:keys参数.但是,我不想使用:keys参数,我想使用:key_data参数.谁能举一个有效的例子?由于某种原因,直接将字符串输入:key_data不起作用,并且它给出错误:"既不是PUB键也不是PRIV键::嵌套asn1错误".当然我用Google搜索了,它基本上告诉我要确保密钥是PEM格式的.而且,当然是.有任何想法吗?如果需要,我可以提供更详细的信息......
在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) net-ssh ×10
ruby ×9
ssh ×5
chef-infra ×1
eventmachine ×1
openssl ×1
rubygems ×1
ssh-keys ×1
ubuntu-11.10 ×1