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