ProcessBuilder没有正确执行程序

时间:2012-10-07 00:07:17

标签: java linux processbuilder

嘿家伙我目前正试图制作一个小工具,你看我是网络管理员,我的老板告诉我他要我监视网络并阻止某些网站和ip用于某些游戏服务器,所以对于监控部分我们将把网络上的所有流量重定向到服务器,在那里我们可以监控流量,然后再将其发送到网关......

为此我们将在linux中使用arpspoof并且我已经完成了阻止站点和服务器的解决方案,我将要做的是一个GUI,使我更容易处理和控制这些事情和当我尝试使用ProcessBuilder从java运行arpspoof它不起作用,我没有输出? O.o

它也没有进入while循环:/我真的不能想更多写atm,但如果我能想到更多我会更新这个帖子

我的代码:

new Thread() {
        public void run() {
            try {
                System.out.println("running arpspoof...");
                Process prb = new ProcessBuilder("gksudo", "arpspoof", "-i", "wlan0", Gateway).start();
                InputStream is = prb.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);

                String line;

                while ((line = br.readLine()) != null) {
                    System.out.println("Output: " + line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();

2 个答案:

答案 0 :(得分:2)

我从来没有使用过gksudo,但是我用谷歌搜索它,它说它是sudo的GUI版本。我猜你刚刚推出了一个GUI应用程序,它不会向stdout写任何东西而且不会返回。如果是这样,那么代码正在做我期望的事情。它会阻塞,直到进程写入一行可以读取的文本 - 这种情况永远不会发生,因此会无限期地阻塞。

首先使用像“echo”这样的简单命令测试您的ProcessBuilder代码,以确保您的Java代码按预期工作。然后继续前进。尝试以root身份运行您的程序,这样您就不需要sudo参数,看看是否有效。然后最后尝试使用sudo而不是gksudo来运行它。

答案 1 :(得分:0)

我认为@user是正确的,但还有其他一些可能的解释。

  1. gksudo命令可能要求输入密码。我不确定它会问什么,但很有可能它不会成为“gksudo”流程的“stdout”流。

  2. 如果“gksudo”或您“gksudo”-ing的命令无法启动,则很可能会向其“stderr”流写入错误消息。但你不是在读“stderr”。

  3. 为了帮助诊断,您需要尝试以下方法:

    • 在日志文件中查找“sudo” - 我的盒子上是“/ var / log / secure”。
    • 使用“ps -efl”(或类似的)查看应用程序被阻止等待输出时存在哪些进程。 (如果发生这种情况......)
    • 查看“gksudo”是否在意外的地方提示输入密码。
    • 尝试暂时调整“sudoers”文件,以允许“arpspoof”命令在没有密码的情况下显示为“sudo”。