【发布时间】:2015-06-04 12:51:43
【问题描述】:
我的要求是使用 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) 时通道会断开连接。有没有其他方法可以一一执行命令,以便我可以获取上一个命令的输出并执行第二个命令?
【问题讨论】:
-
您能否编辑您的问题以显示您如何创建通道对象,以及您如何为要运行的每个命令调用
runCommand()?