2012-10-07 69 views
3

嘿家伙即时尝试做一个litlle方便的工具,你看我是一个网络管理员,我的老板告诉我,他希望我监控网络和阻止某些网站和一些游戏服务器的IP ,所以对于监控部分,我们将重定向网络上的所有流量到服务器,在那里我们可以在将流量发送到网关之前监控流量...ProcessBuilder没有正确执行程序

为此,我们将在Linux和i中使用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(); 

回答

2

我从来没有使用gksudo,但我GOOGLE了它,它说这是一个GUI版本的sudo。我猜你刚刚启动了一个GUI应用程序,它不会向stdout写入任何内容,也不会返回。如果是这样,那么代码正在做我期望的。它会阻塞,直到进程写入一行可以读取的文本 - 永远不会发生,因此它会无限期地阻塞。

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

0

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

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

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

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

  • 看在日志文件中,对于“命令” - 这是“/无功/日志/安全”在我的箱子。
  • 使用“ps -efl”(或类似)来查看在应用程序被阻塞等待输出时存在哪些进程。 (如果发生这种情况......)
  • 看看“gksudo”是否在意想不到的地方提示输入密码。
  • 尝试暂时调整“sudoers”文件以允许“arpspoof”命令在没有密码的情况下“sudo”。