好的,我正在尝试执行以下代码:
`#{@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}`
变量值为:
我收到此错误(在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"
哪个是完全正确的
答案 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以无效字符结束非常感谢你。