Jsch in shell mode i want to execute commands sequentially. I tried using the below code. Problem with the code is code waits on readLine(). Can anybody suggest a solution. If you can please fix the below code
Note: i want to execute the commands in shell mode only
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();
}
}
if i change two methods of the above code i was able to achieve what i want, the problem with the approach is i need to put a Thread.sleep after creating the buffer other wise it will not print any thing.
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){
}
}