在Ruby中获取system()函数的输出
要注意,所有传递包含用户提供值的字符串给system
、%x[]
等的解决方案都是不安全的!不安全实际上意味着:用户可能触发程序在上下文和所有权限下运行的代码。
据我所知,只有Ruby 1.8中system
和Open3.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命令或系统调用
我想对chaos的答案进行扩展和澄清。
如果你用反引号将命令括起来,那么你就不需要(显式)调用system()。反引号执行命令并将输出作为字符串返回。然后你可以将值分配给变量,如下所示:
output = `ls` p output
或者
printf output # escapes newline chars