我正在使用Ganymede ssh库(http://www.ganymed.ethz.ch/ssh2/) 连接到ssh服务器(显然;))。
通常,在使用bash时,当用户按下键盘上的TAB键时,会出现可能的命令完成列表。我想实现相同的行为,但手动发送制表符。不幸的是我不知道该怎么做。发送“\ t”不起作用。
编辑:解决方案必须是通用的,它不仅可以在bash中工作,而且还可以在其他程序中工作,例如octave(使用命令行的开源matlab实现,只是bash命令不能的示例)应用)。
答案 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通常会处理它,我认为。