用Java发送TAB控制字符

| 我正在使用Ganymede ssh库(http://www.ganymed.ethz.ch/ssh2/) 连接到ssh服务器(显然是;))。 通常,使用bash时,当用户按键盘上的TAB键时,会出现可能的命令完成列表。我想实现相同的行为,但是手动发送制表符。不幸的是,我不知道该怎么做。发送\“ \\ t \”不起作用。 编辑:解决方案必须是通用的,不仅可以在bash中使用,而且还可以在其他程序中使用,例如octave(带命令行的开源matlab实现,只是不能应用bash命令的示例)。     
已邀请:
正如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();
            }
        }
    };
}
    
您可以使用以下命令:
compgen -c
它列出了外壳程序中所有可能的命令。您可以添加
grep <something> 
过滤输出     
您所说的不是依赖于命令外壳程序吗?我不认为\'\\ t \'有效,因为那是制表符,而不是由您的shell解释为列出可能的命令补全的命令的制表键。 由于这是您要询问的库,在我看来,您想要的是,您必须实现自己,因为Shell通常会处理该问题。     

要回复问题请先登录注册