2013-07-30 32 views
0

我想使用system("insert shell command here")並傳入腳本。但是,該腳本需要用戶輸入。我也想傳入用戶輸入。我該怎麼做呢?如何使用system()命令傳入用戶輸入?

我想:

system('./script') 
system('input1') 
system('input2') 

然而,紅寶石等待直到第一個系統調用完成,然後只有繼續去下一個。

可以做到這一點嗎?我試過system('./script', 'input1'),但那也沒用。 也不要用exec

+0

你想管什麼用戶的輸入應該是腳本?這個腳本是如何檢索輸入的?如果是身份驗證,那通常會失敗,因爲密碼輸入通常只能從TTY或KBD設備接受,而不是STDIN。 –

回答

1

您應該從Ruby stdlib中查找Open3 library。它可以讓你更好地控制「炮擊」。

output, status = Open3.capture2("./script", :stdin_data => "I am STDIN") 
+0

嗯,好吧,但是如果不使用外部庫,這是不可能的? – user1530318

+1

什麼是外部庫? Open3是Ruby的一部分。 –

+0

這個*應該*工作,除非被調用的腳本在進行身份驗證,否則OP是SOL,除非有辦法欺騙來自KBD或TTY設備的輸入。 –

-1
#!/usr/bin env ruby 

input1 = ARGV[0] 
input2 = ARGV[1] 

system("./script #{input1} #{input2}") 
+0

當'ARGV [0]'是'時會發生什麼? rm -rf /'?請不要試圖看到它的作用。 –

+0

好點。是的,要小心。可以放一個if條件以避免rm -rf /命令。拇指的規則是定義什麼是可以接受的,然後拒絕其他的一切。也可以看一下Shellwords.escape – eastafri

+1

爲什麼當['system'](http://ruby-doc.org/core-2.0/Kernel.html#method-i-system)可以繞過shell徹底?用於構建'system'命令的字符串插值幾乎不是一個好主意,就像使用SQL的字符串插值幾乎不是一個好主意。 –

相關問題