java执行多个ssh命令并获取每个命令的结果
我已经在Android上开启了与jsch的对话,方式如下:
SshObjects Connect(String username, String password, String hostname, int port)
{
JSch jsch=new JSch();
try
{
sshObjects._session = jsch.getSession(username, hostname, port);
}
catch (JSchException e)
{
e.printStackTrace();
return null;
}
sshObjects._session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
sshObjects._session.setConfig(config);
try
{
sshObjects._session.connect();
}
catch (JSchException e)
{
e.printStackTrace();
return null;
}
try
{
sshObjects._channel = (ChannelExec) sshObjects._session.openChannel("exec");
}
catch (JSchException e)
{
e.printStackTrace();
return null;
}
connected = true;
return sshObjects;
}
然后,为了在打开的会话上执行一些命令并获得结果,我做了以下操作:
private String ExecuteCommand(SshCommandsEnum cmdType)
{
String result = "";
switch (cmdType)
{
case SERVER_INFO:
sshObjects._channel.setCommand("uname --all");
break;
.......
}
try
{
BufferedReader in=new BufferedReader(new InputStreamReader(sshObjects._channel.getInputStream()));
//sshObjects._channel.disconnect();
try
{
sshObjects._channel.connect();
}
catch (JSchException e)
{
e.printStackTrace();
}
String msg=null;
try
{
while((msg=in.readLine())!=null)
{
System.out.println(msg);
result += msg;
}
sshObjects._channel.disconnect();
}
catch (IOException e)
{
e.printStackTrace();
}
}
catch (IOException e)
{
return "";
}
return result;
}
所以我只想打开我的会议一次。然后在其上以“exec”的形式执行命令。它适用于连接后执行的第一个命令——一切似乎都正常,我可以成功地得到结果。但当我再次调用“执行命令”时,它就不再工作了。我的线程挂在sshObjects._channel.connect();
上,什么都不起作用。当我尝试断开连接(关闭通道和会话)并再次连接时,也是一样。只有在我甚至不尝试执行命令的情况下,我才能毫无问题地连接和断开连接
然而,如果没有这一点,我不会遇到这个问题:
BufferedReader in=new BufferedReader(new InputStreamReader(sshObjects._channel.getInputStream()));
但是,显然我需要它来获得我的命令输出。那有什么问题?你知道我做错了什么吗
# 1 楼答案
ChannelExec不可重用,因此需要为每个命令实例化它