Ruby escape ARGV argumento o cadena como argumento al comando shell


Ok esto me está volviendo loco:

`ls #{"/media/music/Miles Davis"}`

Falla debido al espacio entre "Miles" y "Davis"

Digamos que escribo un script ruby y un usuario pasa la ruta del archivo como argumento. ¿Cómo puedo escapar de él y alimentar a un comando de shell-out. Sí, sí, lo sé, los bombardeos deben evitarse. Pero este es un ejemplo artificial, todavía necesito esto.

Haría system("ls", ARGV[0]), pero no devuelve la salida stdout de ls como una cadena, que es lo que los backsticks hacen bien.

¿Cómo escapar ¿lo que sea que inserte en un shellout?

Author: glenn jackman, 2011-08-03

3 answers

Usa require 'shellwords' y Shellwords.escape, que arreglarán este tipo de cosas para ti:

Http://apidock.com/ruby/Shellwords/shellescape

 51
Author: Casper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-03 06:06:44

Manténgase alejado de la construcción de cadenas de shell siempre que sea posible, es un vector fino para la ejecución de código arbitrario.

En este caso, puedes usar popen, que hace el escape por ti:

IO.popen(['printf', 'a b']) do |f|
  var = f.read
end
 6
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-10 14:38:38

Las comillas dobles también funcionan:

`ls "#{'/media/music/Miles Davis'}"`

O

`ls "#{ARGV[0]}"`
 -2
Author: fetsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-07 09:50:46