Ruby在反引号表达式中限制字符串替换?

时间:2013-06-15 00:54:11

标签: ruby limit runtime-error backticks string-interpolation

好的,我正在尝试执行以下代码:

`#{@daemon_path} --name=#{@app_name} --command=#{@java_path} -- -jar #{jetty_jar} #{@war_path} #{random_port}`
sleep(10) #give war time to error out and die if its going to
`#{@daemon_path} --running --name=#{@app_name}`

变量值为:

  • @daemon_path = path / to / daemon(对我的系统更正)
  • @app_name = foobarbazquux
  • @command = path / to / java(对我的系统也是正确的)
  • jetty_jar =一种返回自立jar的路径的方法 一个独立的码头集装箱(经测试;工程)
  • @war_path = / path / to / helloworld / war(在独立的码头容器中测试;有效)
  • random_port =一个返回10000到65535之间随机端口号的方法(暂时将其更改为8000或22,具体取决于我是否想要开始战争)

我收到此错误(在bash中检查命令,它们工作正常):

  

无效参数:未提供命令

     

用法:守护进程[选项] [ - ] [cmd arg ...]

我修改了上述错误,在上面的命令中加上引号如下:

"`#{@daemon_path} --name=#{@app_name} --command=#{@java_path} -- -jar #{jetty_jar} #{@war_path} #{random_port}`"

"`#{@daemon_path} --running --name=#{@app_name}`"

好的,所以代码执行后,我用$检查输出?并注意0返回代码。它应该是1.我在bash中运行它,我得到1.如果我手动放置每个变量的所有正确值,它可以正常工作。

此外,如果我执行一个脚本,传递所有值,如:

`./daemon_script_file #{@daemon_path} #{@app_name} #{@java_path} #{jetty_jar} #{@war_path} #{random_port}`

到脚本守护程序脚本文件:

#!/bin/bash
set -x

d_bin=$1
name=$2
cmd=$3
jar=$4
war=$5
port=$6

$d_bin --name=$name --command=$cmd -- -jar $jar $war $port

sleep 10

$d_bin --name=$name --running

result=$?

exit $result

我得到以下调试跟踪输出:

+ d_bin=/usr/bin/daemon
+ name=
+ cmd=
+ jar=
+ war=
+ port=
+ /usr/bin/daemon --name= --command= -- -jar
+ sleep 10
+ /usr/bin/daemon --name= --running
+ result=1
+ exit 1
sh: 2: foobarbazquux: not found
invalid file (bad magic number): Exec format error

有没有人有任何关于为什么的线索?我在这里做了一件非常愚蠢的事吗?

正如旁注,字符串:

"#{@daemon_path} --name=#{@app_name} --command=#{@java_path} -- -jar #{jetty_jar} #{@war_path} #{random_port}"

解析为:

"/usr/bin/daemon  --name=foobarbazquux --command=/usr/java/jdk1.7.0_21/bin/java  -- -jar /home/nterry/JettyContainer-1.0.b4-jar-with-dependencies.jar /home/nterry/helloworld.war 8080"

哪个是完全正确的

2 个答案:

答案 0 :(得分:3)

将字符串插入命令以将system()与单独的参数而不是反引号一起使用时,这是一个好主意。为反引号中的命令中的每个非引用空间添加一个新参数。例如:

system(@daemon_path, "--name=#{@app_name}", "--command=#{@java_path}", '--', '-jar', jetty_jar, @war_path, random_port)
sleep(10) #give war time to error out and die if its going to
system(@daemon_path, '--running', "--name=#{@app_name}")

通过向system发送单独的参数(您无法使用反引号),它将确保所有shell特殊字符,例如;#"等等直接传递给正在运行的命令,而不是由shell解释。当命令的任何部分来自用户输入时,这对于安全性非常重要。

@Casper建议检查这些变量中的无效字符也很好,因为你可能不想将这些字符传递给你的守护进程。

答案 1 :(得分:1)

@Casper:你是对的。 @daemon_path以无效字符结束非常感谢你。