2012-05-18 13 views
8

मुझे कमांड लाइन पर एक कमांड चलाने की आवश्यकता है जो उपयोगकर्ता प्रतिक्रिया मांगता है। मामले में यह मदद करता है आदेश है:रूबी में सिस्टम कमांड चलाएं और इसके साथ बातचीत करें

gpg --recipient "Some Name" --encrypt ~/some_file.txt 

जब आप इस चलाने के लिए, यह तो कुछ के बारे में चेतावनी दी है पूछते हैं:

इस कुंजी का प्रयोग करें वैसे भी? (वाई/एन)

'वाई' का जवाब देना सही ढंग से खत्म हो गया है। मैं open4 gem का उपयोग करने की कोशिश कर रहा हूं लेकिन मैं इसे 'वाई' सही तरीके से निर्दिष्ट करने में सक्षम नहीं हूं। यहां मैंने कोशिश की है:

Open4::popen4(cmd) do |pid, stdin, stdout, stderr| 
    stdin.puts "y" 
    stdin.close 

    puts "pid  : #{ pid }" 
    puts "stdout  : #{ stdout.read.strip }" 
    puts "stderr  : #{ stderr.read.strip }" 
end 

मैं क्या गलत कर रहा हूं? क्या मैं भी संभव कर रहा हूं?

+0

कुंद विकल्प 'करना है हाँ | gpg --recipient "कुछ नाम" --encrypt ~/some_file.txt', लेकिन वह सब कुछ के लिए "y" का उत्तर देगा। –

उत्तर

9

यूनिक्स तरह से इन स्थितियों को संभालने के लिए जो रूबी के लिए built-in support के साथ आता है, expect साथ है:

require 'pty' 
require 'expect' 

PTY.spawn("your command here") do |reader, writer| 
    reader.expect(/Use this key anyway/, 5) # cont. in 5s if input doesn't match 
    writer.puts('y') 
    puts "cmd response: #{reader.gets}" 
end 
+0

कोशिश की और यह सही है। धन्यवाद। – chrishomer

+0

कोई समस्या नहीं ... आदर्श 'writer.puts (' y ') 'एक ब्लॉक में होगा जो' reader.expect' को पास हो जाता है, और केवल इनपुट मिलान होने पर मूल्यांकन किया जाता है, लेकिन यह वास्तव में लाइब्रेरी काम करने का तरीका नहीं है । शायद उस के साथ झुकाव करना चाहते हैं ... –

4

gpg संभवतः उपयोगकर्ता से सवाल पूछने के लिए टर्मिनल डिवाइस खोल रहा है - यह एक सामान्य सुरक्षा दृष्टिकोण है जो पूरी तरह से फ़ाइलों से स्क्रिप्ट को चलाने से रोकने के लिए है। आप वास्तव में पर्याप्त चेतावनी के बारे में इसे पढ़ने के लिए परवाह नहीं है, तो

(कुछ इसी तरह अभी-पदावनत getpass(3) दिनचर्या देखें।), आप के रूप में अच्छी gpg आदेश पंक्ति विकल्प --yes उपयोग कर सकते हैं:

--yes Assume "yes" on most questions. 
+0

मेरे पास मेरे जीजीपी कमांड में एक विकल्प के रूप में नहीं है। मैक और उबंटू दोनों। – chrishomer

+0

वास्तव में? आपका उबंटू कितना पुराना है? यहां तक ​​कि [हार्डी संस्करण] (http://packages.ubuntu.com/hardy/gnupg) में '--yes' को एक विकल्प के रूप में दस्तावेज किया गया है ... – sarnold

+0

ठीक है जैसे यह ओएस स्तर पर मौजूद है लेकिन इससे इसका कारण नहीं है प्रश्न "हां" के रूप में उत्तर देने के लिए। यह अभी भी इसके लिए संकेत देता है। मैक पर वही (उबंटू 9.10) – chrishomer

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