亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Ruby中獲取system()調用的輸出

在Ruby中獲取system()調用的輸出

Smart貓小萌 2019-07-11 14:59:33
在Ruby中獲取system()調用的輸出如果我使用核#系統在Ruby中,我如何獲得它的輸出?system("ls")
查看完整描述

3 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

我想擴大和澄清混沌回答有點。

如果用backticks包圍命令,那么根本不需要(顯式)調用system()。backticks執行命令,并以字符串的形式返回輸出。然后,可以將該值賦值給如下所示的變量:

output = `ls`p output

printf output # escapes newline chars


查看完整回答
反對 回復 2019-07-11
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

請注意,將包含用戶提供值的字符串傳遞給system%x[]等等都不安全!不安全實際上意味著:用戶可能觸發代碼在上下文中運行,并具有程序的所有權限。

據我所知systemOpen3.popen3在Ruby1.8中確實提供了一個安全/轉義變體。在Ruby1.9中IO::popen也接受數組。

只需將每個選項和參數作為數組傳遞到這些調用之一。

如果您不僅需要退出狀態,還需要可能要使用的結果。Open3.popen3:

require 'open3'stdin, stdout, stderr, wait_thr = Open3.popen3('usermod', '-p', @options['shadow'], 
@options['username'])stdout.gets(nil)stdout.close
stderr.gets(nil)stderr.close
exit_code = wait_thr.value

注意,塊表單將自動關閉stdin、stdout和stderr,否則它們必須是封閉顯式.

這里有更多信息:在Ruby中形成衛生shell命令或系統調用


查看完整回答
反對 回復 2019-07-11
?
holdtom

TA貢獻1805條經驗 獲得超10個贊

正確和安全地這樣做的簡單方法是使用Open3.capture2()Open3.capture2e(),或Open3.capture3().

用紅寶石的后背和它的%x別名是在任何情況下都不安全如果與不受信任的數據一起使用。它是危險簡單明了:

untrusted = "; date; echo"out = `echo #{untrusted}`                              
# BADuntrusted = '"; date; echo"'out = `echo "#{untrusted}"`                            
# BADuntrusted = "'; date; echo'"out = `echo '#{untrusted}'`                            
# BAD

這個system相反,函數正確地轉義參數。如果使用正確:

ret = system "echo #{untrusted}"                      
 # BADret = system 'echo', untrusted                         
 # good

問題是,它返回退出代碼而不是輸出,而捕獲輸出則是復雜和混亂的。

到目前為止,這個線程中最好的答案提到了Open3,但沒有提到最適合該任務的函數。Open3.capture2capture2ecapture3干得像system,但返回兩個或三個參數:

out, err, st = Open3.capture3("echo #{untrusted}")     
# BADout, err, st = Open3.capture3('echo', untrusted)       
# goodout_err, st  = Open3.capture2e('echo', untrusted)      
# goodout, st      = Open3.capture2('echo', untrusted)      
 # goodp st.exitstatus

另一位提到IO.popen()..語法可能很笨拙,因為它需要一個數組作為輸入,但它也能工作:

out = IO.popen(['echo', untrusted]).read              
 # good

為了方便起見,你可以把Open3.capture3()在一項職能中,例如:

## Returns stdout on success, false on failure, nil on error#def syscall(*cmd)
  begin
    stdout, stderr, status = Open3.capture3(*cmd)
    status.success? && stdout.slice!(0..-(1 + $/.size)) # strip trailing eol
  rescue
  endend

例子:

p system('foo')p syscall('foo')p system('which', 'foo')p syscall('which', 'foo')p system('which', 'which')p syscall('which', 'which')

產生以下結果:

nilnilfalsefalse/usr/bin/which         <— stdout from system('which', 'which')true               
    <- p system('which', 'which')"/usr/bin/which"       <- p syscall('which', 'which')


查看完整回答
反對 回復 2019-07-11
  • 3 回答
  • 0 關注
  • 1625 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號