ssh connection over ruby script - ruby-on-rails

hy
i try to connect in the new server by ruby script
> 1.9.2p320 :038 > Net::SSH.start('192.168.10.80', 'root', :password => 'xxxxx')
> Net::SSH::AuthenticationFailed: root
> from /home/zyriuse/.rvm/gems/ruby-1.9.2-p320/gems/net-ssh-2.7.0/lib/net/ssh.rb:215:in > `start'
> from (irb):38
> from /home/zyriuse/.rvm/rubies/ruby-1.9.2-p320/bin/irb:16:in `<main>'
i dont understand why i get this error because when i try manually everything it's working
i try a lot of thing
require 'net/ssh'
require 'logger'
Net::SSH.start(
'localhost', 'zyriuse',
:keys => [ "~/.ssh/id_dsa.pub" ],
) do |session|
puts "hello "
end
~
zyriuse (Net::SSH::AuthenticationFailed)
Net::SSH.start( 'host',
:password=>'passord',
:port=>22,
:username=>'zyriuse',
... ) do |session|
puts "hello wordl"
end
`start': Net::SSH::AuthenticationFailed
i dont understand why i get all the time the same error

Make sure:
The account is correct
The password is correct
The IP is correct
that ssh root#192.168.10.80 works from your machine, typing the password
The error AuthenticationFailed means just that.

Related

Errno::ENOTTY Inappropriate ioctl for device when trying to send file to SFTP

I am using a rails webapp and trying to send an xml file to a sftp server, using the following script:
Net::SSH.start(SFTP_HOST, sftp_user, {:port => SFTP_PORT, :password => sftp_password}) do |ssh|
ssh.sftp.connect do |sftp|
sftp.upload!( measurements_xml_file_path( meas ).to_s ) do |event, uploader, *args|
case even
when :open
puts "Starting upload"
when :finish
puts "Finished upload"
return true
end
end
end
Nevertheless, I am always get an error "Errno::ENOTTY ... Inappropriate ioctl for device". Any help how to fix this error?

Rails + Redis : Redis::CommandError (NOAUTH Authentication required.):

I searched and found some post related about this problem, espacially this one NOAUTH Authentication required. Laravel + Redis, but it doesn't solved my problem.
Redis + Rails ( with dotenv-rails ) + Ubuntu
Errors:
Redis::CommandError (NOAUTH Authentication required.)
In development the app is OK, but in production ( deploy with cap ) got this error.
In production with Redis without password the app is OK, but add password got this error.
etc/redis/redis.conf :
bind 127.0.0.1
requirepass somepassword
.env
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=somepassword
REDIS_PORT=6379
config/initializers/redis.rb
Redis.current = Redis.new(:host => ( ENV["REDIS_HOST"] || '127.0.0.1'),
:port => ( ENV["REDIS_PORT"] || '6379').to_i,
:password => (ENV["REDIS_PASSWORD"] || ''))
And I test the ENV["REDIS_HOST"] in rails console, output is 127.0.0.1.
I want to know how to enable Redis's password in this situation?
Thanks
EDIT
I run auth the_password in redis-cli, the ouput is OK and same as the value of ENV["REDIS_PASSWORD"] from the production rails console.
And now the rails log display Redis::CommandError (ERR invalid password) .
I'm very confused about it.
Edit again
I changed redis.rb to below and it worked:
Redis.current = Redis.new(:host => ( ENV["REDIS_HOST"] ),
:port => ( ENV["REDIS_PORT"] ).to_i,
:password => ( ENV["REDIS_PASSWORD"] ))

How to run the commands in Ruby as a root

I am using net/ssh gem in Ruby.
By the following code I can enter into the server from my local machine. But I want to execute the commands on the server by entering as a ROOT.
Normally, I enter into the server as a ROOT by the command
sudo su -
Following is my code.
require 'rubygems'
require 'net/ssh'
list_of_servers = "servers.csv"
username="XYZ"
IO.readlines(list_of_servers).each do |line|
line.chomp!
server = line.split(',')[0]
password = line.split(',')[1]
puts "---- " + server
Net::SSH.start(server, username, :password => password,:verbose => Logger::DEBUG) do |ssh|
result=ssh.exec!("sudo su -")
puts result
end
end
Output I get after entering into server.
D, [2015-11-21T21:48:26.005576 #56654] DEBUG -- io[3fce29cc9548]: received packet nr 15 type 97 len 12
I, [2015-11-21T21:48:26.005628 #56654] INFO -- net.ssh.connection.session[3fce29ce9834]: channel_close: 0
D, [2015-11-21T21:48:26.005796 #56654] DEBUG -- io[3fce29cc9548]: queueing packet nr 11 type 97 len 28
sudo: no tty present and no askpass program specified
Note:
I can successfully log into the server from my local machine but I cannot run the ROOT command (sudo su -).
You have to start tty for that
scenario = []
scenario << ""
scenario << "su"
#session = Net::SSH.start(ip , user,
:password => pass,
:auth_methods => ['password'],
:timeout => 10
)
#session.open_channel do |channel|
channel.request_pty do |ch, success|
ch.send_channel_request("shell") do |shell, success|
shell.on_data do |c, data|
#output << data
end
scenario.each do |s|
cmd = "#{s}\r\n"
shell.send_data(cmd)
end
end
end
end
According to man sudo, if you specify -S before the command, sudo takes the password from stdin.
I tried this both on a terminal and from ruby with success:
(insert your password, and the command you wish to run in the generic example below.)
echo "password" | sudo -S "command"
works for me.

Remote Execute Command using SSH from Rails Application

I have a Rails Application from which I will call one Ruby Definition in the controller, like this.
ssh root#host "uptime" >> /tmp/output
When I doing this, only the /tmp/output is created but not the content.
When I running the same from simple Ruby script its working fine.
my controller definition
def chefclient1
`ssh root#host "uptime" >> /tmp/output`
#time = Time.now
end
my view
= link_to('Start uptime', host_chefclient1_path)
You can use net-ssh gem to access remote host via ssh fo a ruby app. Set your environment up to:
HOSTNAME = 'host'
USER = 'root'
PASS = 'password'
Add to your_helper.rb: something like:
def chefclient1
result = nil
Net::SSH.start( ENV[ 'HOSTNAME' ], ENV[ 'USER' ], :password => ENV[ 'PASS' ] ) do| ssh |
result = ssh.exec! 'uptime'
puts result
end
File.open( '/tmp/output', 'w' ) {| f | f.puts result }
end
And use the helper method as you with from a view.

run the shell script from rails application after login to the remote system

I want to run a shell script from my Rails application. The script is started on the remote server via the net-ssh Gem. Here is my code:
Net::SSH.start('localhost', 'user', :password => '1234', :port => port) do |session|
session.exec!("#{Rails.root}/script/myscript")
end
I have checked that the script is present in my local application. Script is taking about 1 hour for completion. I have two questions:
Is this the right way for doing this?
How can I run the script in the background?
The sample doc says that the simple, and quite proper way to run the Net::SSH session is the following:
HOST = '192.168.1.113'
USER = 'username'
PASS = 'password'
Net::SSH.start( HOST, USER, :password => PASS ) do| ssh |
result = ssh.exec! 'ls'
puts result
end
I recomment to pass at least password argument via shell environment to don't store it in the script plainly. Also you could use micro-optparse gem to pass other argument via command line. So it could be as follows:
require 'micro-optparse'
options = Parser.new do |p|
p.banner = "This is a fancy script, for usage see below"
p.version = "fancy script 0.0 alpha"
p.option :host, "set host", :default => 'localhost'
p.option :host, "set user", :default => ''
end.parse!
Net::SSH.start( options[ :host ], options[ :user ], :password => ENV[ 'PASSWORD' ] ) do| ssh |
result = ssh.exec! 'ls'
puts result
end
And run from command line:
$ bundle exec ./1.rb --host=111.ru --user=user
{:host=>"111.ru", :user=>"user"}
Of course the support for :port argument can be added in the same manner.
Use nohup or screen utitilies to run a script as a service in linux:
result = ssh.exec! "nohup #{Rails.root}/script/myscript"
Why shouldn't it be the right way?
To run a shell script in the background, append & to the command
For example:
session.exec!("#{Rails.root}/script/myscript&")

Resources