我有一个可以被不受信任的用户调用的脚本,我们需要按照这个组成的例子进行调用:
system 'somescript ' + data
我们需要确保data == 'filename; dosomethingelse'
然后是;是转义(或任何其他特殊字符。结果是shell命令运行实际上是somescript filename\;\ dosomethingelse
或somescript "filename; dosomethingelse"
有没有一种标准方法可以做到这一点?
答案 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中)得到很好的评论。