Не удалось выполнить python исполняемый файл с аргументами, который содержит символ # (ха sh), используя Java Процесс - PullRequest
0 голосов
/ 16 апреля 2020

По заголовку вопроса, не удалось успешно выполнить приведенную ниже команду.

Обновлено : - когда я удаляю символы # из путей к файлам, команда работает нормально. Но это условие, и я не могу его изменить.

Код, выполненный с Java:

param = "install list \\\"-i /export/home/test/ABC#XYZ#TEST/test.rpm:-i /export/home/test/ABC#XYZ#TEST/test2.rpm\\\";

String commandToRunArr[]={"/bin/sh","-c", "/usr/local/bin/test.py" + " " + param};

process = Runtime.getRuntime().exec(commandToRunArr);

Другая информация:

/ usr / local / bin / test.py - исполняемый файл.

Как я пытался решить проблему, изменив команду для запуска:

Первая команда: /bin/sh -c /usr/local/bin/test.py install list \"-i /export/home/test/ABC#XYZ#TEST/test.rpm:-i /export/home/test/ABC#XYZ#TEST/test2.rpm\"

Ошибка: ОШИБКА: sh: - c: строка 0: неожиданный EOF при поиске совпадения `" '

ОШИБКА: sh: - c: строка 1: синтаксическая ошибка: неожиданный конец файла

Код возврата 1

Вторая команда: /bin/sh -c -- /usr/local/bin/test.py install list \"-i /export/home/test/ABC#XYZ#TEST/test.rpm:-i /export/home/test/ABC#XYZ#TEST/test2.rpm\"

ОШИБКА: / bin / sh: -: недопустимая опция

ОШИБКА: Использование: / bin / sh [длинная опция GNU] [опция] ...

ОШИБКА: / bin / sh [длинная опция GNU] [опция] файл сценария ...

Код возврата 2

Третья команда: '/usr/local/bin/test.py set priorityList "-i /export/home/test/ABC#XYZ#TEST/test.rpm:-i /export/home/test/ABC#XYZ#TEST/test2.rpm"'

ОШИБКА: / bin / sh: -: недопустимая опция

ОШИБКА: Использование: / bin / sh [длинная опция GNU] [опция] ...

E RROR: / bin / sh [длинная опция GNU] [опция] файл сценария ...

Код возврата 2

Четвертая команда: /usr/local/bin/test.py set priorityList "-i /export/home/test/ABC#XYZ#TEST/test.rpm:-i /export/home/test/ABC#XYZ#TEST/test2.rpm"

Ошибка: ошибка = 2, нет такого файла или каталога

Причина: java .io.IOException: ошибка = 2, Нет такого файла или каталога

Код возврата -999

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Я обнаружил, что проблема не в скрипте python, не в коде Java или /bin/sh. Это был процесс создания двоичного файла скрипта python, который использовался в процессе превращения скрипта python в исполняемый файл в Makefile. Переданные аргументы в исполняемый файл проверяли список разрешенных символов, который не содержал ha sh символ #, следовательно, аргумент, передаваемый python, отклонял аргумент, состоящий из ha sh # символа.

0 голосов
/ 16 апреля 2020

Возьмите снаряд из л oop. Если вся ваша строка param является ровно одним аргументом:

String commandToRunArr[]={"/usr/local/bin/test.py", param}
process = Runtime.getRuntime().exec(commandToRunArr);

Если вместо этого есть несколько аргументов, поместите их в массив, разделив их точно так, как вы хотите (используя только Java синтаксис буквальной строки, без оболочки кавычки или экранирование). Ниже приведено одно предположение о том, каким было ваше истинное намерение:

String commandToRunArr[]={
  "/usr/local/bin/test.py",
  "install",                                     // sys.argv[1] in test.py
  "list",                                        // sys.argv[2] in test.py
                            // below string becomes sys.argv[3] in test.py
  "-i /export/home/test/ABC#XYZ#TEST/test.rpm:-i /export/home/test/ABC#XYZ#TEST/test2.rpm"
}
process = Runtime.getRuntime().exec(commandToRunArr);
...