Net :: unix/linux хостымен SSH?

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 /» сияқты пәрменді берсеңіз, ол жақсы жұмыс істейді. Менің ойымша, бұл кітапхананы пайдалана аламын ба? 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 пәрменін шығарыңыз және салыстырыңыз.

Мүмкін сіз шешім қабылдауға әкелетін айырмашылықты көресіз немесе, кем дегенде, сізді лас қиянат береді.

UPDATE. (Жұмыс істемейді)

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 </​​code> тағы бір әдісі бар. Қарап көріңіз.
қосылды автор forker, көзі
Және соңында \ n ұмытып кетпеңіз, себебі, ең алдымен, ssh байланысына қосылатын екілік екілік болса, сіз қабыға емес, басқа екілік кіріс/шығыс/қате туралы сөйлесіп жатырсыз .
қосылды автор forker, көзі
жаңартуды қараңыз.
қосылды автор forker, көзі
және тағы бір :)
қосылды автор forker, көзі
басқа жаңартуды қараңыз :)
қосылды автор forker, көзі
Бұл әңгіменің соңы болуы керек. Аяқтағаннан кейін ғана арна channel.close жабылады және ssh жабады. Егер сіз асинхронды емес тәсілді ұнатпасаңыз, response = channel.send_message («do something; \ n») сияқты кейбір синхронды әдістерді жасай аласыз.
қосылды автор forker, көзі
Жарайды, сіз «env» дегенді білдіреді, сіз рубю? немесе хостымның ішіне кірдім? Егер кейінірек, TLS құрылғымен сөйлесіп жатсам, ISH құрылғысында ENV пәрмені жоқ. Мен Ruby-де ENV-ні басып шығаруды PR-ті қолданып көрдім.
қосылды автор Eric Seifert, көзі
Hmm, тек Net :: SSH :: Connection :: Session үшін send_message бар және мен мұны істедік. Ол бас тартпайды, бірақ ештеңе болмайды, егерде бар болса, шығуды қалай оқуға болатынын білмеймін. Мен арна үшін send_data-ді көрдім, сондықтан мен оны channel = ssh.open_channel do | ch | ch.send_data («INH-MSG-ALL»; \ n «) соңы , бірақ бұл жай ғана жабылады
қосылды автор Eric Seifert, көзі
hmm, бұл сондай-ақ қалады, бұл менің код: channel = ssh.open_channel do | ch | channel.on_data do | ch, деректер | puts «data received: # {data.inspect} end channel.send_data (» INH-MSG-ALL; \ n «) end
қосылды автор Eric Seifert, көзі
Сондай-ақ, сіздің екінші жаңартуыңызды тексеріп көріңіз және сонымен қатар: ssh.open_channel do | channel | channel.on_data do | ch, деректер | puts «data received: # {data.inspect} end channel.send_data (» INH-MSG-ALL; \ n «) end
қосылды автор Eric Seifert, көзі
Аха, ол жұмыс істеді ...
қосылды автор Eric Seifert, көзі

Жаңартуларыңыз үшін рахмет.)

Тағы бір нәрсе,

сіздің кодыннан мұны қалай жасауға болады

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

қабықшаға жіберілген әрбір пәрмен үшін деректерді шығару керек пе?

Бұл код әр пәрменді аяқтауды күте ме?

Рахмет.

0
қосылды