在Java中发送TAB控制字符

时间:2011-04-13 07:41:13

标签: java ssh inputstream

我正在使用Ganymede ssh库(http://www.ganymed.ethz.ch/ssh2/) 连接到ssh服务器(显然;))。

通常,在使用bash时,当用户按下键盘上的TAB键时,会出现可能的命令完成列表。我想实现相同的行为,但手动发送制表符。不幸的是我不知道该怎么做。发送“\ t”不起作用。

编辑:解决方案必须是通用的,它不仅可以在bash中工作,而且还可以在其他程序中工作,例如octave(使用命令行的开源matlab实现,只是bash命令不能的示例)应用)。

3 个答案:

答案 0 :(得分:2)

正如Joachim Sauer所说,这可能是因为你的会话没有连接终端,所以像Bash这样的程序会表现得好像是非交互式的。

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();
            }
        }
    };
}

答案 1 :(得分:1)

您可以使用此命令:

compgen -c

它列出了shell中所有可能的命令。你可以添加

grep <something> 

过滤输出

答案 2 :(得分:0)

你所说的不是依赖于命令shell吗?我认为'\ t'不起作用,因为它是制表符,而不是tab键,它被shell解释为列出可能的命令完成的命令。

由于这是一个你要问的库,在我看来你想要什么,你必须实现自己,因为shell通常会处理它,我认为。