2012-10-07 118 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」。