Выполнить сценарий оболочки с другим интерпретатором

Я пытаюсь выполнить скрипт Python, используя JSch, я хочу запустить скрипт Python из файла .sh, используя другой интерпретатор (shebang).

Вот содержимое моего файла сценария оболочки (fileExec.sh):

#!/usr/bin/env python
print 'hello from python'

Похоже, что Шебанг нельзя изменить, так как я получил:

bash: команда печати не найдена

Вот мой код Java:

session = newSessionFor(user, host, port);
Channel channel = session.openChannel("exec");

File shFile = new File("fileExec.py");
FileWriter writer = new FileWriter(shFile);
writer.write(shebang + "\n");
writer.write(command);
writer.close();

PrintWriter printWriter = new PrintWriter(shFile);
printWriter.println(shebang);
printWriter.println(command);
printWriter.close();

((ChannelExec) channel).setCommand(FileUtils.readFileToByteArray(shFile));

3 ответа

Шебанг используется только ОС при выполнении файла.

Вы не выполняете файл, вы просто копируете содержимое файла Python в приглашение оболочки.

Если вы не хотите хранить и выполнять файл на сервере, вы можете запустить команду Python из оболочки с помощью python -c yourcommand, Вот как это выглядит в терминале, не стесняйтесь попробовать:

user@host ~$ python -c 'print "hello world"'
hello world

Чтобы сделать это в вашей программе, добавьте метод для экранирования произвольной строки в оболочках:

static String escapeForShell(String s) {
  return "'" + s.replaceAll("'", "'\\\\''") + "'";
}

затем беги

((ChannelExec) channel).setCommand("python -c " + escapeForShell(command));

где String command = "print 'hello from python'";

Я не очень хорош с Java, но это может быть проверка расширения файла перед проверкой hashbang. Вы должны изменить файл на fileExec.py чтобы убедиться, или просто fileExec,

(Вы также, кажется, вызываете неправильный файл в коде Java?)

Расширения файлов не должны быть релевантными, но для согласованности вы обычно не вызываете скрипт на python fileExec.sh,

Если вы тестируете fileExec.sh из командной строки, предполагая, что вы установили разрешение на выполнение, он должен работать:

$ chmod +x fileExec.sh
$ ./fileExec.sh
hello from python

Однако нет необходимости полагаться на shebang и изменение прав доступа к файлам, просто сделайте следующее:

$ python fileExec.sh

из командной строки и из вашей Java-программы тоже

((ChannelExec)channel).setCommand("/usr/bin/python /path/to/fileExec.sh");
Другие вопросы по тегам