在shell模式下的Jsch我想按顺序执行命令。我尝试使用以下代码。代码问题是代码在readLine()上等待。任何人都可以提出解决方案。如果可以,请修改以下代码
注意:我想只在shell模式下执行命令
public class SSHClient1 {
private Session session;
private ChannelShell channel;
private String username = "";
private String password = "";
private String hostname = "";
public SSHClient1(String username, String password, String hostname) throws Exception {
super();
this.username = username;
this.password = password;
this.hostname = hostname;
startSession();
intializeChannel();
}
private void startSession() throws Exception{
if(session == null || !session.isConnected()){
session = connect(hostname,username,password);
}
}
private void intializeChannel() throws Exception{
if(channel == null || !channel.isConnected()){
try{
channel = (ChannelShell)session.openChannel("shell");
channel.setPty(false);
channel.connect();
}catch(Exception e){
}
}
}
private Session connect(String hostname, String username, String password) throws Exception{
JSch jSch = new JSch();
try {
session = jSch.getSession(username, hostname, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(password);
session.connect();
System.out.println("Connected successfully to host "+ hostname);
}catch(Exception e){
}
return session;
}
public void executeCommands(List<String> commands) throws Exception{
PrintStream out = null;
try{
out = new PrintStream(channel.getOutputStream());
for(String command : commands){
out.println(command);
out.flush();
printResult();
}
}catch(Exception e){
} finally{
if(out != null)
out.close();
}
}
private void printResult() throws IOException{
try{
InputStream in = channel.getInputStream();
String line = "";
BufferedReader br =new BufferedReader(new InputStreamReader(in));
while((line = br.readLine()) != null){
System.out.println(line);
}
}catch(Exception e){
}
}
public void close(){
if(channel != null)
channel.disconnect();
if(session != null)
session.disconnect();
}
public static void main(String[] args) throws Exception{
SSHClient1 ssh = new SSHClient1("admin", "password", "192.168.2.9");
List<String> commands = new ArrayList<String>();
commands.add("enable");
commands.add("configure terminal");
commands.add("show running-config");
ssh.executeCommands(commands);
ssh.close();
}
}
如果我改变上面代码的两个方法我能够实现我想要的,那个方法的问题是我需要在创建缓冲区之后放一个Thread.sleep,否则它将不会打印任何东西。
public void executeCommands(List<String> commands) throws Exception{
PrintStream out = null;
try{
out = new PrintStream(channel.getOutputStream(),true);
for(String command : commands){
out.println(command);
out.flush();
printResult();
}
}catch(Exception e){
} finally{
if(out != null)
out.close();
}
}
private void printResult() throws IOException{
try{
InputStream in = channel.getInputStream();
BufferedReader br =new BufferedReader(new InputStreamReader(in));
Thread.sleep(10000);
boolean ready = false;
int c = 0;
StringBuilder line = new StringBuilder();
while((ready = br.ready()) == true){
ready = br.ready();
c = br.read();
System.out.print(String.valueOf((char)c));
}
}catch(Exception e){
}
}
答案 0 :(得分:1)
如果包装命令是一个选项,你可以这样做:
# cat /usr/bin/your-enable
#!/bin/bash
enable
echo "#END#"
更改主要(示例):
commands.add("/usr/bin/your-enable");
更改printResult:
while((line = br.readLine()) != null){
if (line.equals("#END#")) {
break;
} else {
System.out.println(line);
}
}
希望它有所帮助。
答案 1 :(得分:0)
能够找到解决方案。在br.ready()为真之前已经进行了一次忙碌的旋转。我们还需要在放置忙循环之前放置一个Thread.sleep