在Ruby中获取system()调用的输出

在Ruby中获取system()调用的输出

如果我使用核#系统在Ruby中,我如何获得它的输出?

system("ls")


Smart猫小萌
浏览 1585回答 3
3回答

缥缈止盈

我想扩大和澄清混沌回答有点。如果用backticks包围命令,那么根本不需要(显式)调用system()。backticks执行命令,并以字符串的形式返回输出。然后,可以将该值赋值给如下所示的变量:output = `ls`p output或printf output # escapes newline chars

沧海一幻觉

请注意,将包含用户提供值的字符串传递给system, %x[]等等都不安全!不安全实际上意味着:用户可能触发代码在上下文中运行,并具有程序的所有权限。据我所知system和Open3.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命令或系统调用

holdtom

正确和安全地这样做的简单方法是使用Open3.capture2(),&nbsp;Open3.capture2e(),或Open3.capture3().用红宝石的后背和它的%x别名是在任何情况下都不安全如果与不受信任的数据一起使用。它是危险简单明了:untrusted&nbsp;=&nbsp;";&nbsp;date;&nbsp;echo"out&nbsp;=&nbsp;`echo&nbsp;#{untrusted}`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;BADuntrusted&nbsp;=&nbsp;'";&nbsp;date;&nbsp;echo"'out&nbsp;=&nbsp;`echo&nbsp;"#{untrusted}"`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;BADuntrusted&nbsp;=&nbsp;"';&nbsp;date;&nbsp;echo'"out&nbsp;=&nbsp;`echo&nbsp;'#{untrusted}'`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;BAD这个system相反,函数正确地转义参数。如果使用正确:ret&nbsp;=&nbsp;system&nbsp;"echo&nbsp;#{untrusted}"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#&nbsp;BADret&nbsp;=&nbsp;system&nbsp;'echo',&nbsp;untrusted&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#&nbsp;good问题是,它返回退出代码而不是输出,而捕获输出则是复杂和混乱的。到目前为止,这个线程中最好的答案提到了Open3,但没有提到最适合该任务的函数。Open3.capture2,&nbsp;capture2e和capture3干得像system,但返回两个或三个参数:out,&nbsp;err,&nbsp;st&nbsp;=&nbsp;Open3.capture3("echo&nbsp;#{untrusted}")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;BADout,&nbsp;err,&nbsp;st&nbsp;=&nbsp;Open3.capture3('echo',&nbsp;untrusted)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;goodout_err,&nbsp;st&nbsp;&nbsp;=&nbsp;Open3.capture2e('echo',&nbsp;untrusted)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;goodout,&nbsp;st&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Open3.capture2('echo',&nbsp;untrusted)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#&nbsp;goodp&nbsp;st.exitstatus另一位提到IO.popen()..语法可能很笨拙,因为它需要一个数组作为输入,但它也能工作:out&nbsp;=&nbsp;IO.popen(['echo',&nbsp;untrusted]).read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;#&nbsp;good为了方便起见,你可以把Open3.capture3()在一项职能中,例如:##&nbsp;Returns&nbsp;stdout&nbsp;on&nbsp;success,&nbsp;false&nbsp;on&nbsp;failure,&nbsp;nil&nbsp;on&nbsp;error#def&nbsp;syscall(*cmd) &nbsp;&nbsp;begin &nbsp;&nbsp;&nbsp;&nbsp;stdout,&nbsp;stderr,&nbsp;status&nbsp;=&nbsp;Open3.capture3(*cmd) &nbsp;&nbsp;&nbsp;&nbsp;status.success?&nbsp;&&&nbsp;stdout.slice!(0..-(1&nbsp;+&nbsp;$/.size))&nbsp;#&nbsp;strip&nbsp;trailing&nbsp;eol &nbsp;&nbsp;rescue &nbsp;&nbsp;endend例子:p&nbsp;system('foo')p&nbsp;syscall('foo')p&nbsp;system('which',&nbsp;'foo')p&nbsp;syscall('which',&nbsp;'foo')p&nbsp;system('which',&nbsp;'which')p&nbsp;syscall('which',&nbsp;'which')产生以下结果:nilnilfalsefalse/usr/bin/which&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<—&nbsp;stdout&nbsp;from&nbsp;system('which',&nbsp;'which')true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<-&nbsp;p&nbsp;system('which',&nbsp;'which')"/usr/bin/which"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<-&nbsp;p&nbsp;syscall('which',&nbsp;'which')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Ruby