如何在Ruby中转义终端的字符串?

时间:2013-07-04 18:30:56

标签: ruby escaping command-line-interface

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

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

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

2 个答案:

答案 0 :(得分:37)

Shellwords应该适合你:)

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

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

require "shellwords"

但是在ruby 2.0.x中,我没有明确要求它。

答案 1 :(得分:15)

请永远不要使用exec的“单一命令行”形式,让您对所有常见的引用和注入问题持开放态度并毫无意义地启动shell。来自fine manual

  

exec(cmdname,arg1,...)

     

命令名和一个或多个参数(无shell)

因此,不要使用引用和转义,而是使用无壳版本:

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

完全绕过shell。同样适用于system