正如約阿希姆·紹爾說,這可能是因爲您的會話沒有終端連接,因此如猛砸程序的行爲就好像他們已經被稱爲非-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();
}
}
};
}
有機會,你開始彈任何通過該連接不會使他們的互動功能,除非有附着在你結束一個終端。因此,要麼找到這些外殼的開關,以強制他們啓用該行爲,要麼通過請求終端對他們「撒謊」。 – 2011-04-13 07:46:43