4

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

`#{@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 中检查命令,它们工作正常):

无效参数:未提供命令

用法:守护进程 [options] [--] [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"

这是完全正确的

4

2 回答 2

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 建议检查这些变量中的无效字符也很好,因为您可能不想将这些字符传递给您的守护程序。

于 2013-11-30T19:36:13.660 回答
1

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

于 2013-06-17T18:29:40.890 回答