我的要求是使用java通过ssh连接到远程机器。我正在使用jsch来做同样的事情。我有一系列要执行的命令,每个命令的执行取决于前一个命令的输出。
Fox示例,如果我正在执行:
ls -l
通过调用
登录我的远程机器后runCommand(“ls -l\n”);
根据我从上面步骤得到的输出,我需要创建一个目录:
runCommand(“mkdir test\n”);
执行此操作后,我得到了:
com.jcraft.jsch.JSchException: failed to send channel request
at com.jcraft.jsch.Request.write(Request.java:65)
at com.jcraft.jsch.RequestPtyReq.request(RequestPtyReq.java:76)
at com.jcraft.jsch.ChannelSession.sendRequests(ChannelSession.java:212)
at com.jcraft.jsch.ChannelShell.start(ChannelShell.java:44)
at com.jcraft.jsch.Channel.connect(Channel.java:152)
at com.apple.mailmove.ssh.ExecuteSecureShellCommand.runCommand(ExecuteSecureShellCommand.java:90)
at com.apple.mailmove.ssh.ExecuteSecureShellCommand.main(ExecuteSecureShellCommand.java:160)
这是runCommad
代码:
//Find below my method
public void runCommand(String command)
{
try{
is = new ByteArrayInputStream(command.getBytes());
channel.setInputStream(is);
channel.setOutputStream(baos);
channel.connect(15 * 1000);
// Wait three seconds for this demo to complete (ie: output to be streamed to us).
Thread.sleep(3*1000);
for (int timeout = 200000; timeout > 0; timeout--)
{
if(baos.size() != 0)
{
System.out.println(baos.toString());
break;
}
else
{
System.out.println("No output!!!!");
Thread.sleep(5000); // wait a bit then try again
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
使用
检查连接状态channel.isConnected
调用channel.conenct(15*1000)
之前的方法并显示true
。调用channel.conenct(15*1000)
后,通道连接状态将返回false。
我无法理解为什么在第二次调用channel.connect(15*1000)
时通道断开连接。有没有其他方法可以逐个执行命令,以便我可以获取上一个命令的输出并执行第二个命令?
答案 0 :(得分:1)
为了通过SSH运行一个或多个命令,我建议使用JSch提供的exec通道。有关完整示例,请参阅this page。
您必须更改代码才能为要运行的每个命令创建新通道:
public void runCommand(String command) {
ChannelExec channel = (ChannelExec)session.openChannel("exec");
channel.setCommand(command);
try (InputStream stdOut = channel.getInputStream();
InputStream stdErr = channel.getErrStream()) {
channel.connect(TIMEOUT);
// read from stdOut and stdErr
}
channel.disconnect();
}