2

我目前正在尝试制作一个方便的工具,你看我是一名网络管理员,我的老板告诉我他希望我监控网络并阻止某些网站和某些游戏服务器的 IP,所以对于监控部分,我们将进行将网络上的所有流量重定向到服务器,我们可以在将流量发送到网关之前对其进行监控。

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

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

2 回答 2

2

I have never used gksudo, but I googled it and it says it's a GUI version of sudo. I'm guessing that you just launched a GUI app which does not write anything to stdout and which does not return. If so, then the code is doing what I would expect. It is blocking until the process writes a line of text that it can read - which never occurs so it blocks indefinitely.

First test your ProcessBuilder code using a trivial command like "echo" to make sure your Java code is working as expected. Then work your way back. Try running your program as root so you don't need the sudo argument and see if that works. Then finally try to run it using sudo instead of gksudo.

于 2012-10-07T02:23:33.960 回答
0

我认为@user 走在了正确的轨道上,但还有其他一些可能的解释。

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

  2. 如果“gksudo”或您正在使用“gksudo”的命令无法启动,它很有可能会将错误消息写入其“stderr”流。但是您不是在阅读“stderr”。

为了帮助诊断这一点,您需要尝试以下操作:

  • 查看“sudo”的日志文件 - 在我的盒子上是“/var/log/secure”。
  • 使用“ps -efl”(或类似的)来查看在您的应用程序被阻塞等待输出时存在哪些进程。(如果发生这种情况......)
  • 查看“gksudo”是否在意想不到的地方提示输入密码。
  • 尝试临时调整“sudoers”文件以允许“arpspoof”命令在没有密码的情况下被“sudo”编辑。
于 2012-10-07T02:50:45.013 回答