2011-04-13 73 views
2

我正在使用Ganymede ssh庫(http://www.ganymed.ethz.ch/ssh2/) 連接到ssh服務器(顯然;))。在Java中發送TAB控制字符

正常情況下,當使用bash時,當用戶按下鍵盤上的TAB鍵時,會出現可能的命令完成列表。我想實現相同的行爲,但手動發送製表符。不幸的是,我不知道如何做到這一點。發送「\ t」不起作用。

編輯:該溶液必須是通用的,其確實在bash不僅工作,而且在其他程序,如八度(開源matlab實現與命令行中,只是一個例子,其中的bash命令不能被應用)。

+0

有機會,你開始彈任何通過該連接不會使他們的互動功能,除非有附着在你結束一個終端。因此,要麼找到這些外殼的開關,以強制他們啓用該行爲,要麼通過請求終端對他們「撒謊」。 – 2011-04-13 07:46:43

回答

2

正如約阿希姆·紹爾說,這可能是因爲您的會話沒有終端連接,因此如猛砸程序的行爲就好像他們已經被稱爲非-interactively。

Ganymede ssh庫的文檔意味着調用session.requestPTY(...)將要求SSH服務器將僞TTY附加到會話。這就像將「-t」標誌傳遞給ssh命令一樣。

代碼示例:

import java.io.IOException; 
import java.io.InputStream; 

import ch.ethz.ssh2.Connection; 
import ch.ethz.ssh2.Session; 


public class Main { 
    public static void main(String[] args) throws Exception { 
     new Main().test(); 
    } 

    private Session sess; 

    public void test() throws IOException, InterruptedException { 
     Connection c = new Connection("myserver", 22); 
     c.connect(); 
     boolean OK = c.authenticateWithPassword("user", "pass"); 
     if (!OK) throw new IOException("Bad password"); 
     sess = c.openSession(); 
     sess.requestPTY("vt220"); 
     new Thread(stdoutLogger).start(); 
     sess.execCommand("/bin/bash"); 
     Thread.sleep(2000); 
     sess.getStdin().write("echo Hello\n".getBytes()); 
     sess.getStdin().write("ls -l /tm\t".getBytes()); 
     Thread.sleep(4000); 
     sess.close(); 
     c.close(); 
    } 

    Runnable stdoutLogger = new Runnable() { 
     public void run() { 
      InputStream is = sess.getStdout(); 
      int b; 
      try { 
       while ((b = is.read()) != -1) { 
        System.out.println("Read " + b + " - " + (char)b); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
} 
+0

是的,我試過了requestPTY方法。但如何繼續呢?我應該發送什麼來發布TAB按鍵? – Erik 2011-04-13 13:20:24

+0

我認爲只是發送一個製表符如你所建議的應該工作。以下適用於我: sess = c.openSession(); sess.requestPTY( 「VT220」); sess.execCommand( 「/斌/慶典」); sess.getStdin()。write(「ls -l/tm \ t」.getBytes()); – 2011-04-13 18:26:08

+0

謝謝。這工作得很好。你也可以發送字節'9'兩次,這是TAB控制字符的表示。我不知道爲什麼我自己找不到解決方案,非常簡單;) – Erik 2011-04-15 08:09:07

0

不是你說的依賴於命令shell?我不認爲'\ t'是可以工作的,因爲這是製表符,而不是tab鍵,它會被shell解釋爲列出可能的命令完成的命令。因爲這是一個你正在問的庫,在我看來你想要什麼,你必須實現你自己,因爲shell通常會處理它,我想。

1

你可以使用這個命令:

compgen -c 

它列出了殼的所有可能的命令。您可以添加

grep <something> 

過濾輸出

+0

這對我有什麼幫助? – Erik 2011-04-13 08:48:19

+0

@Erik:看到你特意寫了你想模擬一個* tab *到你的話,*「......可能的命令完成列表......」*,並看到* compgen *列出所有可能的命令,StKiller認爲這會幫助你。你可能沒有足夠好地說出你的問題/例子。 – SyntaxT3rr0r 2011-04-13 08:54:27

+0

好吧,我明白了。非常感謝這一點。我試圖澄清我的問題,看我的帖子。 – Erik 2011-04-13 09:03:51

相關問題