2015-12-13 111 views
0

我試圖暫時禁止ip地址,如果有人試圖不通過代理服務器加入到我的服務器。Java Runtime.exec(「sleep 180; ...」)

String st = e.getRealAddress() + ""; 
if(!st.startsWith("/x.x.x.x")) { 
    Runtime runtime = Runtime.getRuntime(); 
    runtime.exec("iptables -A INPUT -s " + st.replace("/","") + " -j DROP"); 
    runtime.exec("sleep 180 ; iptables -D INPUT -s " + st.replace("/","") + " -j DROP"); 
} 

但由於某種原因只執行-A命令,並且在我等了三分鐘後,我無法連接。我做錯了什麼?

+0

Runtime.exec沒有啓動shell,你不能給它shell語法命令,如'sleep 180;等等'。 – pvg

+0

但是它爲什麼輸出第一個命令? –

+1

,因爲第一個命令就是這樣一個命令。在第二個例子中,你給了它兩個命令並期待類似shell的行爲。 Runtime exec不是一個shell,它一次只需要一個命令。只需使用Thread.sleep進行睡眠。 – pvg

回答

0

,您可以:

  • 分解自己的訂單在Java中:iptables的,等待,睡眠,iptables的,...

  • ,那麼你必須等待第一iptables來完成:

使用waitFor:

Process p = Runtime.getRuntime().exec("your command iptables"); 
p.waitFor(); 
+0

但是,如果minecraft服務器重新啓動,那麼它會執行命令或不? –

+0

它不是很清楚:它可以執行它,取決於你把這些行放在哪裏。 –

+0

如果minecraftserver重新啓動,它會退出服務器的每個tunning jar文件。所以我不認爲它會工作,我可以嘗試。 –