2014-10-30 65 views
1

遠程通信(ssh)我試圖從我的java代碼重新啓動遠程服務器。我有無密碼的ssh設置,並且sudoers文件具有參數,以便執行系統命令時不需要密碼。 我從運行「bash shell的」我的本地機器上,我的遠程系統shutsdown以下命令,來了就好了無法通過使用Runtime.Exec

ssh -t [email protected] 'sudo reboot' 

上面的命令重新啓動,但不檢查任何密碼的遠程服務器;現在我通過上面的命令直通Java代碼如下(我在特殊字符「包圍須藤重啓」,以使其作爲一個命令)

String cmd="ssh -t [email protected] \'sudo reboot\'"; 
log.info("Executing command.."+cmd); 
p = Runtime.getRuntime().exec(cmd); 
//open error stream and input stream and process 

不過,我得到以下錯誤

[2014-10-30 19:07:55,593] INFO Executing command..ssh -t [email protected] 'sudo reboot' 
[2014-10-30 19:07:57,070] ERROR ERROR while executing command: ssh -t [email protected] 'sudo reboot' 
[2014-10-30 19:07:57,070] ERROR Pseudo-terminal will not be allocated because stdin is not a terminal. 
bash: sudo reboot: command not found 

我在做什麼錯? 我想避免第三方庫(例如:JSch)。我使用centos6和Java 7

SOLUTION

1)取出由@hcs建議單引號。然後我得到另一個錯誤MESG「.. TTY ..」

2)更新sudoers文件中的鏈接https://serverfault.com/questions/15667/remotely-reboot-tomcat

+1

嘗試從各地''須藤reboot''去掉單引號,我認爲這是試圖運行命令,而不是以'reboot'作爲參數運行'sudo'。 – hcs 2014-10-30 19:03:09

+0

某些命令不能從Java完成。就是這樣。它可能是sudo,這需要安全性。或重新啓動,這應該沒問題。 Java不能處理CLI控制檯的所有內容。例如。使用回車來更改輸出的文本。原生應用程序可以,但Java始終存在此問題。有幾個控制檯類和一個bu太陽,但它仍然缺乏。 – ldmtwo 2014-10-30 19:14:56

+0

@ hcs。感謝解決它。發佈它作爲答案,我會接受它 – 2014-10-30 19:28:57

回答

0

從各地'sudo reboot'取下單引號,即試圖在中間的空間中運行一個命令,而不是reboot作爲參數運行sudo

什麼混淆我就是爲什麼它最初工作時,您可以直接在命令行中運行它...

+0

我認爲(?)有一些錯誤(或錯誤解釋命令字符串如何從Java內存空間傳遞給ssh)。這是一個這樣的討論http://stackoverflow.com/questions/2146727/runtime-getruntime-exec – 2014-10-30 19:37:05

2

建議我有時使用exec()方法,需要一個String數組有更多的運氣作爲參數,而不是單個字符串。字符串數組允許更好地指定不同的參數,這在我的經驗中更加穩定,特別是如果在參數中有空格的話。 所以請嘗試以下操作:

String[] cmd = new String[]{"ssh", "-t", "[email protected]", "sudo reboot"}; 
Runtime.getRuntime.exec(cmd);