Не может запустить cmd из su - <user>

Я пытался подключиться к JBoss от пользователя jboss (текущий пользователь - root), используя такой cmd:

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: ресурс чтения (рекурсивный = true, рекурсивная глубина = 10, включает- время выполнения = правда)

Но моя консоль зависает. В то же время, если я запустил его вручную, он будет работать:

# 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": ресурс чтения (рекурсивный = true, рекурсивная глубина = 10, include-runtime = истина)

Но все, что я мог получить, это:

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 = localhost: 10999: нет такого файла или каталога

Что я могу изменить?

Возможно, вы забыли двойные кавычки?

dnsiv 31.10.2018 11:46

Другая возможность заключается в том, что ваш java-код пытается выполнить эту команду в своем рабочем java-каталоге вместо вашего желаемого рабочего каталога, поскольку вы используете относительные пути.

dnsiv 31.10.2018 11:48

@dnsiv /usr/share/jboss-as-7.1.1.Final/bin/jboss-cli.sh - абсолютный путь. Вы говорите об этом пути?

Valeria 31.10.2018 11:57

вы уже пробовали использовать этот абсолютный путь?

dnsiv 31.10.2018 12:00

@dnsiv да, я могу подключиться при запуске этого cmd вручную.

Valeria 31.10.2018 12:07

Нет, я имею в виду следующее: если вы запустите свою программу Java, вы получите рабочий каталог, отличный от текущего каталога, в котором вы вводите команду в CMD. Вы должны распечатать System.getProperty("user.dir"), чтобы увидеть, работаете ли вы в том же рабочем каталоге, что и тот, в котором вы находитесь, когда вы вводите эту свою команду вручную.

dnsiv 31.10.2018 12:16

Поэтому, если System.getProperty("user.dir") не возвращает /usr/share/, который на самом деле является вашим желаемым рабочим каталогом, это означает, что вам нужно изменить текущий рабочий каталог в своем Java-коде или использовать абсолютный путь вместо этого относительного пути.

dnsiv 31.10.2018 12:19

@dnsiv Я попробовал System.getProperty("user.dir") и вручную запустил cmd из этого каталога. Ситуация повторяется. Также я не понимаю, как это может помочь. Поскольку все переменные (LAVA_HOME, JBOSS_HOME, ...) глобальные (идентичны для пользователей root и jboss), а cmd использует только один путь (и он абсолютный). У root и jboss достаточно разрешений для запуска этого cmd.

Valeria 31.10.2018 12:31

@dnsiv Я редактировал вопрос. /usr/share/jboss-as-7.1.1.Final/bin/jboss-cli.sh не является абсолютным путем. => /jboss-as-7.1.1.Final/bin/jboss-cli.sh сейчас

Valeria 31.10.2018 12:35
1
9
50
1

Ответы 1

Когда мы используем параметр -c, bash ожидает только одну команду. Следовательно, мой старый cmd был неправильным, потому что он состоит из двух отдельных cmd:

  1. Команда /jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller = localhost: 10999 была отправлена ​​сеансам jboss.
  2. Но : ресурс чтения (рекурсивный = истина, глубина рекурсии = 10, время выполнения = истина) был просто параметром для сеанса корень.

Поэтому я должен отправить 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, recursive-depth = 10, включая -runtime = true) '

Для запуска вручную следует использовать двойные кавычки, поскольку одинарные кавычки имеют более высокий приоритет:

su - jboss -c "/jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect --controller = localhost: 10999 ': read-resource (recursive = true, recursive-depth = 10, include-runtime = true) '"

Другие вопросы по теме