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?
3 answers
Usa require 'shellwords'
y Shellwords.escape
, que arreglarán este tipo de cosas para ti:
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
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]}"`
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