Net :: SSH met niet-unix/linux-host?

Ik probeer de Net :: SSH-bibliotheek te gebruiken om in te loggen en een host te beheren die ssh ondersteunt. Het is een stukje telecomapparatuur en dat is dus TL1. Ik lijkt in staat om succesvol in te loggen, maar als ik iets probeer te ssh.execken, wordt het afgebroken omdat het commando niet kan uitvoeren. Hier is mijn eenvoudige code:

require 'net/ssh'

Net::SSH.start('10.204.121.192', 'password', :password => "password") do |ssh|
  ssh.exec("INH-MSG-ALL;")
end

Als ik dezelfde code op een Linux-server richt en een opdracht als "ls -l /" geef, werkt het prima. Wat ik me afvraag is, kan ik deze ssh-bibliotheek gebruiken? Moet ik een ander commando gebruiken in plaats van exec?

Dit is de foutoutput:

/usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:322:in `block (2 levels) in exec': could not execute command: "INH-MSG-ALL;" (RuntimeError)
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/channel.rb:597:in `call'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/channel.rb:597:in `do_failure'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:586:in `channel_failure'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:456:in `dispatch_incoming_packets'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:213:in `preprocess'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:197:in `process'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:161:in `block in loop'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:161:in `loop'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:161:in `loop'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh/connection/session.rb:110:in `close'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/net-ssh-2.2.1/lib/net/ssh.rb:194:in `start'
from ssh_test.rb:3:in `
'
1

2 antwoord

Ik neem aan dat het goed werkt als je handmatig in de shell inlogt.

Om te begrijpen wat het verschil is wanneer u via net/ssh de uitvoer van de opdracht env in beide gevallen koppelt en vergelijkt.

Dat je waarschijnlijk een verschil zult zien dat je naar een oplossing zal leiden, of je tenminste een vuile truc zal bezorgen.

BIJWERKEN. (Werkt niet)

Net::SSH.start('10.204.121.192', 'password', :password => "password") do |ssh|
   ssh.open_channel do |channel|
        channel.on_data do |ch, data|
          puts "got data: #{data.inspect}"
        end
        channel.send_data("INH-MSG-ALL;\n")
   end
end

Update2. (Actief)

Net::SSH.start('10.204.121.192', 'password', :password => "password") do |ssh|
   ssh.open_channel do |channel|
        channel.send_channel_request "shell"
        channel.on_data do |ch, data|
          puts "got data: #{data.inspect}"
        end
        channel.send_data("INH-MSG-ALL;\n")
   end
end
1
toegevoegd
Ik bedoelde het later.
toegevoegd de auteur forker, de bron
Er is een andere methode send_data </​​code>. Probeer het.
toegevoegd de auteur forker, de bron
En vergeet niet \ n op het einde omdat het hoogstwaarschijnlijk een binair getal is dat spawnt op ssh-verbinding, zodat je eigenlijk niet tegen een shell praat maar tegen een ander binair in/uit/err .
toegevoegd de auteur forker, de bron
zie de update.
toegevoegd de auteur forker, de bron
en nog een :)
toegevoegd de auteur forker, de bron
zie nog een update2 :)
toegevoegd de auteur forker, de bron
Dat moet het einde van het verhaal zijn. sluit gewoon het kanaal channel.close wanneer je klaar bent en ssh zal dan sluiten. Als u niet van een asynchrone benadering houdt, kunt u een synchrone methode zoals response = channel.send_message ("do something; \ n") nep.
toegevoegd de auteur forker, de bron
Oké, ik weet niet precies wat je bedoelt met het commando "env", in robijn? of op de gastheer waar ik in ben? Als de laatste is, is er geen env-opdracht op het apparaat waar ik in sla, omdat het alleen TL1 spreekt. Ik heb geprobeerd om de ENV in ruby ​​uit te printen met behulp van pp om te zien of er iets verandert en dat doet het niet.
toegevoegd de auteur Eric Seifert, de bron
Hmm, er is alleen send_message voor Net :: SSH :: Connection :: Session en ik heb dit geprobeerd. Het wordt niet afgebroken, maar er lijkt niets te gebeuren, ik weet niet hoe ik de uitvoer moet lezen, als die er is. Ik heb send_data voor een kanaal gezien, dus ik heb dit ook geprobeerd channel = ssh.open_channel do | ch | ch.send_data ("INH-MSG-ALL; \ n") einde maar dit blijft hangen
toegevoegd de auteur Eric Seifert, de bron
hmm, dit hangt ook, dit is mijn code: channel = ssh.open_channel do | ch | channel.on_data do | ch, data | zet "got data: # {data.inspect}" end channel.send_data ("INH-MSG-ALL; \ n") end
toegevoegd de auteur Eric Seifert, de bron
Probeer ook gewoon je tweede update en hangt ook: ssh.open_channel do | channel | channel.on_data do | ch, data | zet "got data: # {data.inspect}" end channel.send_data ("INH-MSG-ALL; \ n") end
toegevoegd de auteur Eric Seifert, de bron
Aha, die werkte ...
toegevoegd de auteur Eric Seifert, de bron

Bedankt forker voor uw updates),

Nog een ding,

uit je code hoe dit te maken

puts "got data: #{data.inspect}"

om gegevens uit te voeren voor elk commando dat naar de shell wordt gestuurd?

Wacht deze code tot elke opdracht is voltooid?

Bedankt.

0
toegevoegd