以下代码包含命令和字符串:
files = `ls /tmp`
我希望/tmp
是变量而不是静态字符串,理想情况下它应该像:
dir = '/tmp'
command = 'ls ' + dir
files = `command`
实现此目的的正确Ruby语法是什么?
答案 0 :(得分:3)
使用字符串插值:
dir = '/tmp'
files = `ls #{dir}`
答案 1 :(得分:2)
files = `#{command}`
这就是你要找的东西吗?
答案 2 :(得分:2)
使用标准shellwords库。它将负责正确的转义,这将有助于保护您免受shell注入攻击。
require 'shellwords'
command = [
'ls',
dir
].shelljoin
files = `#{command}`
如果 dir 来自不受信任的输入,则上述代码仍允许某人查看您系统上的任何目录。但是,使用shelljoin可以防止有人注入,例如“删除我硬盘上的所有文件”命令。
在列出目录的特定情况下,内置类Dir会做得相当好:
files = Dir[File.join(dir, '*')]
这里我们使用File::join将glob添加到目录的末尾。 Dir::[]然后返回该目录中文件的路径。