Выполнить сценарий оболочки с другим интерпретатором
Я пытаюсь выполнить скрипт 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");