我正在使用 Ganymede ssh 库(http://www.ganymed.ethz.ch/ssh2/ http://www.ganymed.ethz.ch/ssh2/)
连接到 ssh 服务器(显然;))。
通常,在使用 bash 时,当用户按键盘上的 TAB 键时,会出现可能的命令完成列表。我想实现相同的行为,但手动发送制表符。不幸的是我不知道如何做到这一点。发送“\t”不起作用。
Edit:该解决方案必须是一个通用的,它不仅可以在 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();
}
}
};
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)