gpt4 book ai didi

java - 无法从 su - 运行 cmd

转载 作者:行者123 更新时间:2023-11-30 05:56:28 25 4
gpt4 key购买 nike

我尝试使用这样的cmd从jboss用户(当前用户 - root)连接到JBoss:

protected static final String CONNECT = "--connect";
protected static final String EXECUTOR = "/bin/jboss-cli.sh";
protected static final String CONTROLLER = "--controller";
protected static final String SU_CMD = "su";
protected static final String SHELL_FLAG = "-c";


protected static final String COLON = ":";
protected final static String SPACE = " ";
protected final static String QUOTE = "\"";
protected final static String DASH = "-";

public String[] getCommandWithController(String serverPath, String server_path, String server_port) {
String[] cmd = {SU_CMD, DASH, JBoss.getUsername(), SHELL_FLAG, serverPath + EXECUTOR + SPACE + CONNECT + SPACE + CONTROLLER + "=" + server_path + COLON + server_port, this.getCommand()};
return cmd;
}

因此,对于 Runtime.getRuntime().exec(anCmdArr) ,它看起来像:

su - jboss -c/jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller=localhost:10999 :read-resource(recursive=true, recursive-深度=10,包含运行时=true)

但是我的控制台挂起。同时,如果我手动运行它,它将起作用:

# su - jboss -c "/jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller=localhost:10999"

[standalone@localhost:10999 /] :read-resource(recursive=true, recursive-depth=10, include-runtime=true)

我认为问题出在cmd上。我已经厌倦了引号、字符串连接,例如:

1)

String[] cmd = {SU_CMD + SPACE + DASH + SPACE + JBoss.getUsername() + SPACE + SHELL_FLAG + QUOTE + serverPath + EXECUTOR + SPACE + CONNECT + SPACE + CONTROLLER + "=" + server_path + COLON + server_port + QUOTE, this.getCommand()}

看起来像:

su - jboss -c "/jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller=localhost:10999"

2)

String[] cmd = {SU_CMD, DASH, JBossTaskConstants.getUsername(), SHELL_FLAG, QUOTE + serverPath + EXECUTOR + SPACE + CONNECT + SPACE + CONTROLLER + "=" + server_path + COLON + server_port + QUOTE, this.getCommand()};

外观:

su - jboss -c "/jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller=localhost:10999":read-resource(recursive=true,递归深度=10,包括运行时=true)

但我所能得到的是:

error = 2, No such file or directory

例如:错误消息::read-resource(recursive=true, recursive-depth=10, include-runtime=true):/jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller=本地主机:10999:没有这样的文件或目录

我可以改变什么?

最佳答案

当我们使用-c参数时,bash只需要一个命令。因此,我的旧cmd是错误的,因为它由两个单独的cmd组成:

  1. /jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller=localhost:10999 命令已发送至 jboss session 。
  2. 但是:read-resource(recursive=true, recursive-depth=10, include-runtime=true)只是root session 的一个参数。

所以我应该将 1 和 2 像一个参数一样发送给 -c 选项。我删除了一个逗号,然后将 2cmd 转义到引号中:

String[] cmd = {SU_CMD, DASH, JBossTaskConstants.getUsername(), SHELL_FLAG, serverPath + EXECUTOR + SPACE + CONNECT + SPACE + CONTROLLER + "=" + server_path + COLON + server_port + SPACE + "\'" + this.getCommand() + "\'"};

什么是:

su - jboss -c/jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller=localhost:10999 ':read-resource(recursive=true, 递归-深度= 10,包括运行时= true)'

要手动运行它,应使用双引号,因为单引号具有更高的优先级:

su - jboss -c "/jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller=localhost:10999 ':read-resource(recursive=true,递归深度=10,包括运行时=true)'"

关于java - 无法从 su - <user> 运行 cmd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53081444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com