32

我正在尝试启动 mplayer。我的文件名包含空格,这些应该被转义。这是我正在使用的代码:

@player_pid = fork do
   exec "/usr/bin/mplayer #{song.file}"
end

where#{song.file}包含类似的路径"/home/example/music/01 - a song.mp3"。如何正确转义此变量(以及标题可能包含的其他奇怪字符)以便终端接受我的命令?

4

2 回答 2

51

Shellwords应该为你工作:)

exec "/usr/bin/mplayer %s" % Shellwords.escape(song.file)

在 ruby​​ 1.9.x 中,看起来你必须require首先

require "shellwords"

但在 ruby​​ 2.0.x 中,我不必明确要求它。

于 2013-07-04T18:33:48.577 回答
22

请永远不要使用“单一命令行”形式exec,这会让您面临所有常见的引用和注入问题,并毫无意义地启动 shell。来自精美手册

exec(cmdname, arg1, ...)

命令名称和一个或多个参数(无外壳)

因此,与其胡乱引用和转义什么的,不如使用无壳版本:

exec '/usr/bin/mplayer', song.file

并完全绕过外壳。同样对于system

于 2013-07-04T19:08:39.627 回答