2010-08-02 11 views
30

मैं कोड का एक टुकड़ा है, बस एक दूरस्थ सर्वर पर एक स्क्रिप्ट निष्पादित करने के लिए, घटना में है कि यह विफल में की कोशिश कर रहा है, मैं एक अनुवर्ती कॉल करना चाहते हैं, इस कल्पना:रुबी के नेट :: एसएसएच लाइब्रेरी के साथ बाहर निकलने की स्थिति कैसे प्राप्त करें?

require 'rubygems' 
require 'net/ssh' 
require 'etc' 

server = 'localhost' 

Net::SSH.start(server, Etc.getlogin) do |ssh| 
    puts (ssh.exec("true") ? 'Exit Success' : "Exit Failure") 
    puts (ssh.exec("false") ? 'Exit Success' : "Exit Failure") 
end 

मैं उम्मीद करेगा (उस स्टडआउट और स्टडर को अनदेखा कर दिया गया है) - लेकिन पहली पंक्ति 0 से बाहर निकलना चाहिए, जो मुझे उम्मीद है कि रुबी false के रूप में इंटरपरेट करेगा और "बाहर निकलने में विफलता" प्रदर्शित करेगा (निश्चित रूप से, तर्क गलत है, तीसरी जरूरतों फ़्लिप करने के लिए) - लेकिन दूसरी पंक्ति विपरीत स्थिति के साथ बाहर निकलना चाहिए, और यह नहीं है।

मुझे यह कैसे करना है इसके बारे में प्रलेखन में कुछ भी नहीं मिला है, और मैं थोड़ा चिंतित हूं कि मैं इसे गलत कर रहा हूं ?!

उत्तर

66

मुझे नेट :: एसएसएच के साथ प्रक्रियाओं को चलाने का निम्नलिखित तरीका बहुत उपयोगी है। यह आपको अलग stdout और stderr, exit code और exit signal प्रदान करता है।

require 'rubygems' 
require 'net/ssh' 
require 'etc' 

server = 'localhost' 

def ssh_exec!(ssh, command) 
    stdout_data = "" 
    stderr_data = "" 
    exit_code = nil 
    exit_signal = nil 
    ssh.open_channel do |channel| 
    channel.exec(command) do |ch, success| 
     unless success 
     abort "FAILED: couldn't execute command (ssh.channel.exec)" 
     end 
     channel.on_data do |ch,data| 
     stdout_data+=data 
     end 

     channel.on_extended_data do |ch,type,data| 
     stderr_data+=data 
     end 

     channel.on_request("exit-status") do |ch,data| 
     exit_code = data.read_long 
     end 

     channel.on_request("exit-signal") do |ch, data| 
     exit_signal = data.read_long 
     end 
    end 
    end 
    ssh.loop 
    [stdout_data, stderr_data, exit_code, exit_signal] 
end 

Net::SSH.start(server, Etc.getlogin) do |ssh| 
    puts ssh_exec!(ssh, "true").inspect 
    # => ["", "", 0, nil] 

    puts ssh_exec!(ssh, "false").inspect 
    # => ["", "", 1, nil] 

end 

उम्मीद है कि इससे मदद मिलती है।

+0

वाह, यह अच्छा है। धन्यवाद। – sarnold

+0

फ्लिट्जवाल्ड, यह कमाल है - काश मैं पीछे से एक उपहार या कुछ जोड़ सकता हूं! आपका बहुत बहुत धन्यवाद! –

+0

आपको बहुत बहुत धन्यवाद। यह पूरी तरह से काम करता है। यह नेट :: एसएसएच में होना चाहिए। –

6

flitzwald द्वारा उत्तर पर बिल्डिंग - मैं बंदर Net :: SSH (रूबी 1.9+) में इस के अपने संस्करण समझौता किया है

class Net::SSH::Connection::Session 
    class CommandFailed < StandardError 
    end 

    class CommandExecutionFailed < StandardError 
    end 

    def exec_sc!(command) 
    stdout_data,stderr_data = "","" 
    exit_code,exit_signal = nil,nil 
    self.open_channel do |channel| 
     channel.exec(command) do |_, success| 
     raise CommandExecutionFailed, "Command \"#{command}\" was unable to execute" unless success 

     channel.on_data do |_,data| 
      stdout_data += data 
     end 

     channel.on_extended_data do |_,_,data| 
      stderr_data += data 
     end 

     channel.on_request("exit-status") do |_,data| 
      exit_code = data.read_long 
     end 

     channel.on_request("exit-signal") do |_, data| 
      exit_signal = data.read_long 
     end 
     end 
    end 
    self.loop 

    raise CommandFailed, "Command \"#{command}\" returned exit code #{exit_code}" unless exit_code == 0 

    { 
     stdout:stdout_data, 
     stderr:stderr_data, 
     exit_code:exit_code, 
     exit_signal:exit_signal 
    } 
    end 
end 
+0

क्या आपने इसे पैच अप-स्ट्रीम के रूप में भेजने पर विचार किया था? –

+0

मैं वर्तमान में एक परियोजना पर काम कर रहा हूं जो इस समारोह पर निर्भर करता है - एक बार जब मैंने इसे परीक्षण किया है तो मैं करूँगा। ऐसे अवसर हैं जहां सफल निष्पादन के बावजूद निकास कोड> 0 है, इसलिए मैं वैकल्पिक रूप से वैकल्पिक – Mikey

+0

@ माइकी को संशोधित करने के लिए संशोधित करता हूं, यह कौन सी स्थितियां होगी? क्या एक nonzero निकास कोड होगा क्योंकि खोल, एसएसएच या पुस्तकालय संचार समस्या या कमांड nonzro निकास कोड वापस करेगा, लेकिन यह काम किया? – Phillipp

संबंधित मुद्दे