#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}"
выводить данные для каждой команды, отправляемой в оболочку?
Ожидает ли этот код завершения каждой команды?
Спасибо.