所以我一直在尝试使用 Net::SSH::Multi 通过 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
Run Code Online (Sandbox Code Playgroud)
我目前遇到的问题是,当我在交互式提示中输入命令时,“session.exec”不会返回输出 util 我退出程序,我想知道是否有人遇到过这个问题并可以告诉我我该如何解决这个问题?
我对使用perl编写脚本非常新.我试图ssh到服务器并执行一些命令.我必须提供用户名和密码.
尝试运行我到目前为止的脚本(下面列出的代码).我收到以下错误.
我假设这意味着我需要安装/制作Net/SSH/Perl.pm,但是,当我按照我在网上找到的说明和教程时,没有一个有效.
有人可以帮助我.我曾尝试CPAN和ppm,CPAN说,它无法找到net::ssh::perl或字符串的其他变化.而且ppm甚至不会跑的,我没有看到它在我的Perl目录.任何帮助是极大的赞赏!
// The code
#!/usr/bin/perl
use Net::SSH::Perl;
$uName = "username";
$pWord = "password";
$unitIp = $ARGV[0];
my $ssh = Net::SSH::Perl->new($unitIp, 35903);
$ssh->login($uName, $pWord);
my $out = $ssh->cmd("java -version");
print $out;
Run Code Online (Sandbox Code Playgroud)
// the error that is returned
Can't locate Net/SSH/Perl.pm in @INC (@INC contains: /usr/lib/perl5/5.8.5/i386-linux-thread-multi /usr/lib/perl5/5.8.5 /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 …Run Code Online (Sandbox Code Playgroud) 我想使用net-ssh库在我的服务器上执行一些远程命令.
我有以下示例:
Net::SSH::start(host, user, options = {:keys => '~/.ssh/id_rsa'}) do |ssh|
puts ssh.exec!("echo $PATH")
ssh.loop
end
Run Code Online (Sandbox Code Playgroud)
结果是:/ usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games
我的问题是我没有应该加载我的PATH.
我还应该有一些RVM路径,以及定义到我的.zshrc中的自定义路径.
我怎么能改变这种行为让net-ssh使用我的.zshrc加载我的默认环境?
解:
puts ssh.exec!("source ~/.zshrc; echo $PATH")
Run Code Online (Sandbox Code Playgroud) 我一直试图使端口转发与Net :: SSH一起正常使用。据我了解,如果我希望能够从同一个Ruby程序中使用Net :: SSH会话,则事件处理循环实际上可以处理通过连接发送的数据包。但是,这会导致您在下面看到的丑陋:
#!/usr/bin/env ruby -w
require 'net/ssh'
require 'httparty'
require 'socket'
include Process
log = Logger.new(STDOUT)
log.level = Logger::DEBUG
local_port = 2006
child_socket, parent_socket = Socket.pair(:UNIX, :DGRAM, 0)
maxlen = 1000
hostname = "www.example.com"
pid = fork do
parent_socket.close
Net::SSH.start("hostname", "username") do |session|
session.logger = log
session.logger.sev_threshold=Logger::Severity::DEBUG
session.forward.local(local_port, hostname, 80)
child_socket.send("ready", 0)
pidi = fork do
msg = child_socket.recv(maxlen)
puts "Message from parent was: #{msg}"
exit
end
session.loop do
status = waitpid(pidi, Process::WNOHANG)
puts "Status: #{status.inspect}"
status.nil? …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我想exec!在指定的时间后终止SSH连接的命令.
我发现:timeout了Net::SSH.start命令,但文档以下这只是初始连接.是否有相同的exec命令?
我的第一个猜测是没有使用,exec!因为这将等到命令完成,但是使用exec并围绕调用,循环检查每次迭代的执行状态,并在给定的时间后失败.
如果我正确理解文档,那就是这样的:
server = NET::SSH.start(...)
server.exec("some command")
start_time = Time.now
terminate_calculation = false
trap("TIME") { terminate_calculation = ((Time.now - start_time) > 60) }
ssh.loop(0.1) { not terminate_calculation }
Run Code Online (Sandbox Code Playgroud)
然而这对我来说似乎很脏.我期待类似的东西server.exec("some command" { :timeout=>60}).也许有一些内置功能来实现这个功能?
通过搜索在Openshift上访问我的Postgres数据库,我目前面临使用net-ssh的问题.
为了能够从我的本地DB IDE访问DB,我需要执行:
rhc port-forward myappname
但执行会返回此错误: Checking available ports ... Could not parse PKey: no start line
正如你在这篇文章中看到的那样(另一个例如这个),修复是回到net-ssh的稳定版本.2.9.2.我成功完成了什么.
但是现在,运行rhc port-forward myappname会给我以下错误:.../2.2.0/rubygems/core_ext/kernel_require.rb:54:in 'require': cannot load such file
而解决办法是升级净SSH到2.9.3-beta1版(看到这个帖子).
这真是太奇怪了!似乎"蛇正在咬自己的尾巴"(不知道法语表达是否有英文翻译).
请注意,我已尝试使用新的ssh key gen(自动和手动)进行干净设置.我的系统运行'Win 7 64bits.
我卸载/安装了最新版本的Ruby.重新安装rhc.最新版本在rhc-1.36.4上运行.问题还在继续.
你能帮我吗?我应该安装旧版本的ssh-net和/或Ruby(由于新版本的rhc,我不允许使用ssh-net 2.5.2)?
(对不起,我的英语不好)
我在用ruby 1.8.7 (2013-06-27 patchlevel 374) [i686-darwin14].当我尝试安装capistrano gem时,我收到以下错误:
sudo gem install capistrano -v2.13.5
ERROR: Error installing capistrano:
net-ssh requires Ruby version >= 2.0.
Run Code Online (Sandbox Code Playgroud)
AFAIK capistrano 2.13.5应该兼容ruby 1.8.7
我怎么才能安装capistrano v2.13.5使用ruby 1.8.7(<2.0),装?
多年来,我一直在使用 Capistrano 成功部署我的 Rails 3.2.13 应用程序。但是就在今天,我ArgumentError: Could not parse PKey: no start line在连接到服务器时遇到了可怕的情况。
我从其他帖子中了解到,这实际上是net-sshCapistrano 用来建立连接的gem的问题。显然,较旧net-ssh版本的 OpenSSH 与较新版本的 OpenSSH 创建的密钥文件不兼容。(例如,请参见此处和此处。)
这种诊断得到以下支持:(a)我仍然可以从命令行通过 SSH 连接到我的服务器,以及(b)以下小irb会话:
irb(main):006:0> require 'net/ssh'
=> true
irb(main):007:0> Net::SSH::KeyFactory.load_private_key('~/.ssh/id_rsa')
ArgumentError: Could not parse PKey: no start line
Run Code Online (Sandbox Code Playgroud)
我想我最近在更改密码时更新了我的私钥文件,现在它与我的版本net-ssh(v2.7.0)不兼容。
我无法升级,net-ssh因为我一直在使用 Ruby 1.9.3。
有没有办法恢复到旧的/兼容版本的私钥文件?或者其他一些解决方案?
我试图创建一个使用红宝石(及净:: SSH)连接到服务器,并执行一些任务的程序.服务器的详细信息将提供为:
ssh://user:pass@host:port (for a host that does not yet have SSH keys)
Run Code Online (Sandbox Code Playgroud)
要么
user@host
Run Code Online (Sandbox Code Playgroud)
Net :: SSH需要以下格式:
Net::SSH.start('host', 'user', :password => "password")
Run Code Online (Sandbox Code Playgroud)
是否有gem/stdlib可以将URL处理为这种格式?还是一个可以匹配不同部分的简单正则表达式?
注意:我知道并使用了capistrano但在这种情况下我需要更低级别的控制.
我正在使用SCP将文件上传到远程服务器,但在这样做之前,查看该文件是否存在的正确方法是什么?
net-ssh ×10
ruby ×8
ssh ×3
capistrano ×2
file-upload ×1
forward ×1
openshift ×1
openssh ×1
perl ×1
perl-module ×1
port ×1
postgresql ×1
rubygems ×1
scp ×1
url ×1
windows ×1