0

以下代码包含一个命令和一个字符串:

files = `ls /tmp`

我想/tmp成为一个变量而不是静态字符串,并且理想情况下希望它像:

dir = '/tmp'
command = 'ls ' + dir
files = `command`

实现此目的的正确 Ruby 语法是什么?

4

3 回答 3

3

使用字符串插值:

dir   = '/tmp'
files = `ls #{dir}`
于 2013-04-18T14:18:21.600 回答
2
files = `#{command}`

那是你要找的吗?

于 2013-04-18T14:18:21.763 回答
2

使用标准的shellwords库。它将负责正确的转义,这将有助于保护您免受 shell 注入攻击。

require 'shellwords'

command = [
  'ls',
  dir
].shelljoin
files = `#{command}`

如果dir来自不受信任的输入,上面的代码仍然允许某人查看您系统上的任何目录。但是,使用 shelljoin 可以保护您免受他人注入,例如,“删除我硬盘上的所有文件”命令。

在列出目录的特殊情况下,内置类Dir会做得很好:

files = Dir[File.join(dir, '*')]

在这里,我们使用File::join在目录末尾添加一个 glob 。 Dir::[]然后返回该目录中文件的路径。

于 2013-04-18T14:39:59.203 回答