Net :: SSH с хостом, отличным от unix / linux?

#ruby

#ruby

Вопрос:

Я пытаюсь использовать библиотеку Net :: SSH для входа в систему и управления хостом, поддерживающим ssh. Это часть телекоммуникационного оборудования, и поэтому говорит TL1. Кажется, я могу успешно войти в систему, но когда я пытаюсь что-то выполнить в ssh.exec, он прерывается, сообщая, что не удалось выполнить команду. Вот мой простой код:

 require 'net/ssh'

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

Если я укажу тот же код на сервере Linux и предоставлю команду, такую как «ls -l /», она работает нормально. Мне интересно, могу ли я использовать эту библиотеку ssh? Нужно ли мне использовать другую команду вместо exec?

Это вывод ошибки:

 /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 `<main>'
  

Ответ №1:

Я предполагаю, что это работает нормально, когда вы входите в оболочку вручную.

Чтобы понять, в чем разница при подключении через net / ssh, соберите вывод env команды в обоих случаях и сравните.

Скорее всего, вы увидите разницу, которая приведет вас к решению или, по крайней мере, даст вам грязный трюк.

Обновить. (Не работает)

 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
  

ОБНОВЛЕНИЕ2. (Работает)

 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. Хорошо, я не совсем уверен, что вы подразумеваете под командой «env» в ruby? или на хосте, на который я подключен по ssh? Если позже, на устройстве, к которому я подключаюсь по ssh, нет команды env, поскольку она говорит только на TL1. Я попытался распечатать ENV в ruby, используя pp, чтобы посмотреть, изменится ли что-то там, и это не так.

2. Существует другой метод send_data . Попробуйте.

3. И не забывайте n , в конце концов, потому что, скорее всего, это какой-то двоичный файл, который появляется при подключении по ssh, так что на самом деле вы разговариваете не с оболочкой, а с каким-то другим двоичным входом / выходом / ошибкой.

4. Хм, для Net ::SSH::Connection::Session есть только send_message, и я попробовал это. Он не прерывается, но, похоже, ничего не происходит, я не знаю, как прочитать вывод, если он есть. Я видел send_data для канала, поэтому я тоже попробовал это, channel = ssh.open_channel do |ch| ch.send_data("INH-MSG-ALL;n") end но это просто зависает

5. хм, это тоже зависает, это мой код: channel = ssh.open_channel do |ch| channel.on_data do |ch, data| puts "got data: #{data.inspect}" end channel.send_data("INH-MSG-ALL;n") end

Ответ №2:

Спасибо forker за ваши обновления),

Еще одна вещь,

из вашего кода, как это сделать

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

выводить данные для каждой команды, отправляемой в оболочку?

Ожидает ли этот код завершения каждой команды?

Спасибо.