第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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

3 回答

?
縹緲止盈

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊

我想擴(kuò)大和澄清混沌回答有點(diǎn)。

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

output = `ls`p output

printf output # escapes newline chars


查看完整回答
反對(duì) 回復(fù) 2019-07-11
?
滄海一幻覺(jué)

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊

請(qǐng)注意,將包含用戶(hù)提供值的字符串傳遞給system%x[]等等都不安全!不安全實(shí)際上意味著:用戶(hù)可能觸發(fā)代碼在上下文中運(yùn)行,并具有程序的所有權(quán)限。

據(jù)我所知systemOpen3.popen3在Ruby1.8中確實(shí)提供了一個(gè)安全/轉(zhuǎn)義變體。在Ruby1.9中IO::popen也接受數(shù)組。

只需將每個(gè)選項(xiàng)和參數(shù)作為數(shù)組傳遞到這些調(diào)用之一。

如果您不僅需要退出狀態(tài),還需要可能要使用的結(jié)果。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

注意,塊表單將自動(dòng)關(guān)閉stdin、stdout和stderr,否則它們必須是封閉顯式.

這里有更多信息:在Ruby中形成衛(wèi)生shell命令或系統(tǒng)調(diào)用


查看完整回答
反對(duì) 回復(fù) 2019-07-11
?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊

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

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

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

這個(gè)system相反,函數(shù)正確地轉(zhuǎn)義參數(shù)。如果使用正確:

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

問(wèn)題是,它返回退出代碼而不是輸出,而捕獲輸出則是復(fù)雜和混亂的。

到目前為止,這個(gè)線(xiàn)程中最好的答案提到了Open3,但沒(méi)有提到最適合該任務(wù)的函數(shù)。Open3.capture2capture2ecapture3干得像system,但返回兩個(gè)或三個(gè)參數(shù):

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()..語(yǔ)法可能很笨拙,因?yàn)樗枰粋€(gè)數(shù)組作為輸入,但它也能工作:

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

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

## 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')

產(chǎn)生以下結(jié)果:

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


查看完整回答
反對(duì) 回復(fù) 2019-07-11
  • 3 回答
  • 0 關(guān)注
  • 1634 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)