小弟最近遇到一个头疼万分的问题,修改一个程序,具体功能是先从本地连接到服务器A,然后再从A连接到B,然后再投入命令执行,比如 ls 。
原先都是telnet连接,现在按照要求改成都是ssh2连接,
先连接A,使用的是jsch-0.1.39.jar, /**
* ssh connect
* @param user
* @param host
* @param pwd
* @param command
*/
public void connectSshByJsch(String user, String host, String pwd,
String command)
throws Exception {
jsch = new JSch();
// user & host
session = jsch.getSession(user, host);
// password
session.setPassword(pwd);
session.setUserInfo(MyUserInfo);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config); session.connect();
channel = session.openChannel("shell"); channel.connect(); // Get input and output stream references
in = channel.getInputStream();
//
out = new PrintStream(channel.getOutputStream());
}然后在A上投入命令 ssh username@hostB
接着password
这个时候出现类似控制台的界面。
然后由用户输入命令比如 ls问题出来了,A与B都可以成功连接上,然后等待操作者输入命令,这时报错连接失败,在cmd命令下ssh A再ssh B却不会有这问题。
最奇怪的是连接成功后,在内部投入命令却可以实施,我曾经试过20次“ll”都没断开ireader = new InputStreamReader(in);
int intChar = ireader.read();//这里 结果intChar =-1,表明连接已经丢失但是telnet时候却没有任何问题。
是什么原因呢?inputStream问题?还是jsch的session.connect();channel.connect()问题
望各位高手解答。
原先都是telnet连接,现在按照要求改成都是ssh2连接,
先连接A,使用的是jsch-0.1.39.jar, /**
* ssh connect
* @param user
* @param host
* @param pwd
* @param command
*/
public void connectSshByJsch(String user, String host, String pwd,
String command)
throws Exception {
jsch = new JSch();
// user & host
session = jsch.getSession(user, host);
// password
session.setPassword(pwd);
session.setUserInfo(MyUserInfo);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config); session.connect();
channel = session.openChannel("shell"); channel.connect(); // Get input and output stream references
in = channel.getInputStream();
//
out = new PrintStream(channel.getOutputStream());
}然后在A上投入命令 ssh username@hostB
接着password
这个时候出现类似控制台的界面。
然后由用户输入命令比如 ls问题出来了,A与B都可以成功连接上,然后等待操作者输入命令,这时报错连接失败,在cmd命令下ssh A再ssh B却不会有这问题。
最奇怪的是连接成功后,在内部投入命令却可以实施,我曾经试过20次“ll”都没断开ireader = new InputStreamReader(in);
int intChar = ireader.read();//这里 结果intChar =-1,表明连接已经丢失但是telnet时候却没有任何问题。
是什么原因呢?inputStream问题?还是jsch的session.connect();channel.connect()问题
望各位高手解答。
这个为什么要这样呢,可以简化,为什么还要再次连接到B,然后投入命令执行呢
http://www.trilead.com/Download/Trilead_SSH_for_Java/我过去几个项目都用这个,挺好用的。
channel.write(foo, start[0], length[0]);
String t = new String(foo, start[0], length[0]);
} catch (Exception e) {
try {
channel.disconnect();//这里调用了disconnect方法
//抛出的Exception是PipedInputStream的checkStateForReceive()方法的
//if (readSide != null && !readSide.isAlive()) {
//throw new IOException("Read end dead");
} catch (Exception ee) {
}
break;
}对于IOException("Read end dead");有什么好的解决方法么,向各位求教
write方法里out.println(value);
out.flush();//这里会走到8楼的代码里
in这个参数 能确定不是空的吗