Net :: SSHとunix/linux以外のホスト?

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 `
'
1

2 答え

私はあなたが手動でシェルにログインするとうまくいくと思います。

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

UPDATE2。 (作業中)

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
追加された
私は後でそれを意味した。
追加された 著者 forker,
別のメソッド send_data があります。それを試してみてください。
追加された 著者 forker,
そして最後に \ n を忘れないでください。なぜなら、ssh接続で生成されるバイナリなので、実際にはシェルではなく、他のバイナリ/ in/err 。
追加された 著者 forker,
アップデートを参照してください。
追加された 著者 forker,
もう1つ:)
追加された 著者 forker,
別のupdate2を見てください:)
追加された 著者 forker,
それは物語の終わりでなければならない。完了したら、 channel.close を閉じてsshを閉じます。非同期の方法が嫌いなら、 response = channel.send_message( "何か; \ n")のようないくつかの同期メソッドを偽造することができます。
追加された 著者 forker,
さて、私はあなたがルビーの "env"コマンドを意味するのかどうか分かりません。またはホストに私はssh'edですか?後であれば、TL1だけを話すので、私はsshとしてデバイスにenvコマンドがありません。私はENVが何か変わったかどうかを見るためにppを使っているrubyに印刷してみました。
追加された 著者 Eric Seifert,
Net :: SSH :: Connection :: Sessionのsend_messageしかありませんでした。それは中止されませんが、何も起こらないようです、私は出力があれば、それを読む方法がわかりません。私はチャンネルのためのsend_dataを見ましたので、私もこれを試しました channel = ssh.open_channel do | ch | ch.send_data( "INH-MSG-ALL; \ n")end
追加された 著者 Eric Seifert,
これは私のコードです: channel = ssh.open_channel do | ch | channel.on_data do | ch、data |データを取得する:#{data.inspect} "end channel.send_data(" INH-MSG-ALL; \ n ")end
追加された 著者 Eric Seifert,
また、2回目のアップデートを試して、ハングアップします: ssh.open_channel do | channel | channel.on_data do | ch、data |データを取得する:#{data.inspect} "end channel.send_data(" INH-MSG-ALL; \ n ")end
追加された 著者 Eric Seifert,
ああ、それは働いた...
追加された 著者 Eric Seifert,

あなたのアップデートのためのforkerに感謝します)

もう一つ、

あなたのコードからこれを作る方法

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

シェルに送られた各コマンドのデータを出力するには?

このコードは各コマンドが完了するのを待ちますか?

ありがとう。

0
追加された