Java ProcessBuilder未正确执行程序

Java ProcessBuilder未正确执行程序,java,linux,processbuilder,Java,Linux,Processbuilder,我目前正在尝试制作一个方便的工具,你看,我是一名网络管理员,我的老板告诉我,他想让我监控网络,阻止某些网站和某些游戏服务器的ip,因此,对于监控部分,我们将把网络上的所有流量重定向到服务器,在服务器上我们可以监控流量,然后再将其发送到网关 为此,我们将在linux中使用Arpsopoof,我已经完成了一个站点和服务器阻塞的解决方案,我将制作一个GUI,使我能够更轻松地处理和控制这些事情。当我尝试使用ProcessBuilder从java运行Arpsopoof时,它不起作用,我没有得到任何输出 它

我目前正在尝试制作一个方便的工具,你看,我是一名网络管理员,我的老板告诉我,他想让我监控网络,阻止某些网站和某些游戏服务器的ip,因此,对于监控部分,我们将把网络上的所有流量重定向到服务器,在服务器上我们可以监控流量,然后再将其发送到网关

为此,我们将在linux中使用Arpsopoof,我已经完成了一个站点和服务器阻塞的解决方案,我将制作一个GUI,使我能够更轻松地处理和控制这些事情。当我尝试使用ProcessBuilder从java运行Arpsopoof时,它不起作用,我没有得到任何输出

它也不会进入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();

我从未使用过gksudo,但我在谷歌上搜索过它,它说它是sudo的GUI版本。我猜您刚刚启动了一个GUI应用程序,它不会向stdout写入任何内容,也不会返回。如果是这样的话,那么代码就是我所期望的。它一直处于阻塞状态,直到进程写入一行它可以读取的文本——这永远不会发生,所以它会无限期地阻塞


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

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

  • gksudo命令可能要求输入密码。我不确定它会问到哪里,但很有可能它不会是“gksudo”过程的“stdout”流

  • 如果“gksudo”或您正在执行的“gksudo”-ing命令未能启动,则很有可能会将错误消息写入其“stderr”流。但你不是在读《标准差》

  • 要帮助诊断此问题,您需要尝试以下操作:

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