如何解开系统命令的执行

时间:2010-01-29 01:53:06

标签: ruby exec

我有一个可以被不受信任的用户调用的脚本,我们需要按照这个组成的例子进行调用:

system 'somescript ' + data

我们需要确保data == 'filename; dosomethingelse'然后是;是转义(或任何其他特殊字符。结果是shell命令运行实际上是somescript filename\;\ dosomethingelsesomescript "filename; dosomethingelse"

有没有一种标准方法可以做到这一点?

2 个答案:

答案 0 :(得分:6)

system 'somescript', data

system的多参数调用不会传递给shell进行处理。

答案 1 :(得分:1)

Shellwords模块(标准库的一部分)将对shell命令进行适当的转义:

#!/usr/bin/ruby1.8

require 'shellwords'

command = ['cat', 'filename with spaces', '"quoted_filename"'].shelljoin
puts command    # => cat filename\ with\ spaces \"quoted_filename\"
system(command)
# => this file has spaces in its name
# => this file has a quoted filename

shellwords还为String添加了shellescape方法。

这些方法不在online API documentation中。它们部分记录在1.9镐中,并且已知存在于MRI 1.8.7中。实际文件(在我的框中,在/usr/lib/ruby/1.8/shelljoin.rb中)得到很好的评论。