2012-01-27 48 views
0

我至少在一個問題上坐在這裏,真的讓我失望了!Linux shell命令對於Runtime.exec()(屏幕命令)來說會表現得很奇怪

我正在寫一個簡單和小型的java程序,輕鬆地將任何命令傳遞給(linux)屏幕會話。

Shell command: bash -c "screen -p 0 -S sessionname -X eval 'stuff \"some command\"\015'"

當我在命令行中輸入這個命令時,它一切正常! 但是,如果我讓一個Java程序做到這一點,就什麼都不會發生!甚至沒有消息或錯誤或提示!根本沒有! 我讓程序回顯生成的屏幕命令,如果我把這個輸出粘貼到shell中,它就可以工作。

這裏是我的Java代碼:



    static public void screenCmd() throws IOException 
    { 
    String command = "bash -c \"screen -p 0 -S screenname -X eval 'stuff \\\"cmd\\\"\\015'\""; 

    System.out.println("debug: '" + command + "'"); //output would work 
                //when copy and paste it to the shell 

    InputStreamReader isr = new InputStreamReader(
     Runtime.getRuntime().exec(command).getInputStream() 
    ); 

    //for debug output 
    BufferedReader br = new BufferedReader(isr); 
    String line = ""; 
    while ((line = br.readLine()) != null) 
     System.out.println(line); 
    } 

最有趣的是,所有其他的shell命令都在工作。 我嘗試了Java執行尾巴,whoi,cp,ls,...沒有任何問題。爲什麼不屏幕?

Java程序由啓動屏幕會話的同一用戶啓動。

如果有人有一個甚至小想法請報告!我在這裏瘋狂駕駛!

p.s .:屏幕會話還運行一個java程序! (可能是問題的一部分?)

謝謝。

回答

0

真正的問題是在解析命令行的方式:的Java的Runtime.exec不跟隨與Bash相同的引用規則。您應該使用,而不是API的數組版本:

String[] command = {"bash", "-c", 
    "screen -p 0 -S screenname -X eval 'stuff \\\"cmd\\\"\\015'"}; 
Runtime.getRuntime().exec(command); 

可以減少一些亂七八糟的報價,如果你EXEC屏幕的情況下直接通過慶典準備:

String[] command = {"screen", "-p", "0", 
    "-S", "10624.pts-2.koivu", "-X", "eval", "stuff \"cmd\"\\015"}; 
+0

你爲我做了一天!那是真實的! – Seraph 2012-01-27 13:22:43

+0

好的,謝謝任何人在這裏寫的,特別是Joni Salonen! ) 我現在做這樣的: 公共無效doCommand(字符串命令)拋出IOException異常,InterruptedException的 { 字符串[] CMD = { 「屏幕」, 「-p」, 「0」, 「-S」 ,「screenname」,「-X」,「eval」,「stuff \」「+ command +」\「\\ 015」}; \t \t process = new ProcessBuilder(cmd)。開始(); retVal = process.waitFor(); } – Seraph 2012-01-27 13:40:27

2
+0

不,這是偉大的。謝謝你,安德魯。 – duffymo 2012-01-27 10:31:26

+0

嗨duffymo,感謝您的快速建議!但是這並不能幫助我!使用ProcessBuilder,我也可以得到相同的結果!我現在用一些回聲組成了一個bash腳本來進行調試。所有調試消息都發送到控制檯。但它只是跳過屏幕命令! – Seraph 2012-01-27 10:51:40