我把这个问题提交给了 多个bash命令 并实现如下。我正在连接一个设备,第一个命令应该是 configure
然后,只有我会得到一个提示来执行所有其他命令。我没有得到任何命令的输出,控制也没有返回。
以下是在终端工作的命令。
ssh uname@ip
configure # this command changes prompt and enable following commands
move shared pre-rulebase security rules TEST top
commit
exit
exit
按照要求,如果我这样做,在输入密码后,控件不会返回。
ssh user@host configure
脚本...
String[] commands = new String[]{
"configure", "move shared pre-rulebase security rules TEST top", "commit", "exit"};
FileWriter fileOut = new FileWriter(outFileName, true);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.setConfig(config);
session.connect();
System.out.println("Connected");
System.out.println(commands[0]);
ChannelExec channel = (ChannelExec) session.openChannel("exec");
((ChannelExec) channel).setCommand(commands[0]);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
outStream = channel.getOutputStream();
channel.connect();
Thread.sleep(1000);
for(int i=1;i<commands.length;i++) {
System.out.println("Executing:"+commands[i]);
outStream.write((commands[i]+"\n").getBytes());
outStream.flush();
}
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0)
break;
resultString = new String(tmp, 0, i);
fileOut.write(resultString);
}
if (channel.isClosed()) {
if(in.available()>0) continue;
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channel.disconnect();
session.disconnect();
outStream.close();
fileOut.close();
你的设备上的 "exec "通道似乎被错误地实现了。所以你不能在 "exec "通道中使用你的代码。因为你可以 "ssh "到设备上,看来 "shell "通道是完全正常的。试着和你的服务器管理员沟通,让服务器得到修复。
如果修复服务器不可行,你将不得不恢复使用 "shell "通道,尽管它通常不是实现命令自动化的正确方法。请看 JSch中的 "shell "通道和 "exec "通道有什么区别?
JSch默认启用了 "shell "通道的终端仿真,这将带来很多不必要的副作用(参见 当使用JSch从SSH服务器读取命令输出时,得到不需要的字符。). 您可能需要通过调用 setPty
.
ChannelShell channel = (ChannelShell) session.openChannel("shell");
InputStream in = channel.getInputStream();
outStream = channel.getOutputStream();
channel.setPty(false);
channel.connect();
outStream.write('configure\n'.getBytes());
outStream.write('move shared pre-rulebase security rules TEST top\n'.getBytes());