在Ruby中获取system()函数的输出

19 浏览
0 Comments

在Ruby中获取system()函数的输出

如果我在Ruby中使用Kernel#system调用命令,如何获取它的输出?

system("ls")

admin 更改状态以发布 2023年5月21日
0
0 Comments

要注意,所有传递包含用户提供值的字符串给system%x[]等的解决方案都是不安全的!不安全实际上意味着:用户可能触发程序在上下文和所有权限下运行的代码。

据我所知,只有Ruby 1.8中systemOpen3.popen3提供了安全/转义变量。在Ruby 1.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命令或系统调用

0
0 Comments

我想对chaos的答案进行扩展和澄清。

如果你用反引号将命令括起来,那么你就不需要(显式)调用system()。反引号执行命令并将输出作为字符串返回。然后你可以将值分配给变量,如下所示:

output = `ls`
p output

或者

printf output # escapes newline chars

0