2012-08-24 59 views
2

我正在嘗試一種新的方法來解決一直困擾我的問題。我沒有使用expect4j作爲我的SSH連接,(我無法找出阻止消費者運行和關閉問題的方法,如果您對此有所瞭解並感到聖潔,請參閱過去的帖子以獲取更多信息),我將嘗試使用期望腳本。我有一個運行時編碼到一個button.onclick,見下文。爲什麼我獲得127退出價值?我基本上只是需要這個期望腳本ssh,運行一組期望和發送,給我的讀數,這就是它...Java拋出進程exitValue:127當運行期望腳本

我正在使用cygwin。不知道這是否與爲什麼這不起作用有關......是我的sh-bang線指向正確的地方?我的cygwin安裝是一個完整安裝,所有軟件包位於C:\ cygwin。

爲什麼我得到127退出值而不是從我的服務器讀取數據,以及如何減輕這個影響?

try 
    {    
     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec(new String [] {"C:\\cygwin\\bin\\bash.exe", "C:\\scripts\\login.exp"}); 
     InputStream stdin = proc.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(stdin); 
     BufferedReader br = new BufferedReader(isr); 
     String line = null; 
     System.out.println("<OUTPUT>"); 
     while ((line = br.readLine()) != null) 
      System.out.println(line); 
     System.out.println("</OUTPUT>"); 
     int exitVal = proc.waitFor();    
     System.out.println("Process exitValue: " + exitVal); 
    } catch (Throwable t) 
     { 
     t.printStackTrace(); 
     } 







#!/usr/bin/expect -f 
spawn ssh [email protected] password 
match_max 100000 
expect "/r/nDestination: " 
send -- "xxxxxx\r" 
expect eof 
+0

而你的問題是?我在這裏沒有看到錯誤消息或任何其他描述,當您嘗試此操作時會發生什麼。 – bmargulies

+0

對不起:爲什麼我得到127退出值而不是從我的服務器讀取數據,我該如何減輕這個影響? –

+1

爲什麼你期望bash,而不是'expect',能夠成功運行期望腳本? – bmargulies

回答

4

問題是您使用bash執行期望腳本。你需要使用expect來執行期望腳本,或者bash通過shell命令行來執行期望腳本(這將是Process proc = rt.exec(new String [] {"C:\\cygwin\\bin\\bash.exe", "-c", "C:\\scripts\\login.exp"});,請注意我已經插入的"-c"),它使用你的頂部的魔術shebang腳本。或者更好的是,只使用shebang:Process proc = rt.exec(new String [] {"C:\\scripts\\login.exp"});

127的退出值是一個特殊的退出值,並告訴你「命令未找到」。如你所期望的,腳本包含許多沒有系統二進制文件或shell內建函數的單詞。

+0

我只是將它指向C:\\ cygwin \\ bin?我沒有看到expect.exe指向任何地方! –

+1

忘記了我們在窗戶上。我不知道如何在Windows上使用shebang線。但直接調用expect [Process proc = rt.exec(new String [] {「C:\\ cygwin \\ bin \\ expect.exe」,「C:\\ scripts \\ login.exp」});'should工作(確保預期的路徑是正確的)。 –

+0

@JoSo,你應該根據你最後的評論編輯你的答案。 –