我需要在我的ruby脚本中运行一个管道bash命令。
因此我需要将参数传递给bash命令并将其转义以防止命令注入。这个问题与bash命令本身无关,所以我会尝试简化它。
bash命令:command1 arg1 | command2 arg2
如果我在系统方法中运行此命令,我会得到预期的结果,但参数不会被转义。
system("command1 #{arg1} | command2 #{arg2}")
如果我将多个字符串传递给系统方法,则第一个字符串将充当命令,其他字符串将作为参数添加。这是一种防止红宝石命令注入的流行方法。
system('command1', arg1, '| command2', arg2)
我的问题是,如果我需要逃避它们,我就失去了管道bash命令的能力。 (在这种情况下,command2也将充当参数。)
有人有解决方案吗?
更新
std_out = Open3.capture2('command1', arg1)[0]
result = Open3.capture2('command2', arg2, stdin_data: std_out)[0]
Open3提供了几种定义stdin和stdout的方法。