I’m trying to login to remote session using JSch Channel shell and execute simple shell command and trying to read the command output with the following code –
private static Session getSession() {
if (session == null || !session.isConnected()) {
session = connect(hostname, username, password);
}
return session;
}
private static Channel getChannel() {
if (channel == null || !channel.isConnected()) {
try {
channel = (ChannelShell) getSession().openChannel("shell");
channel.connect();
} catch (Exception e) {
System.out.println("Error while opening channel: " + e);
}
}
return channel;
}
private static Session connect(String hostname, String username, String password) {
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);
System.out.println("Connecting SSH to " + hostname + " - Please wait for few seconds... ");
session.connect();
System.out.println("Connected!");
} catch (Exception e) {
System.out.println("An error occurred while connecting to " + hostname + ": " + e);
}
return session;
}
static void executeCommands(List<String> commands) {
try {
Channel channel = getChannel();
System.out.println("Sending commands...");
sendCommands(channel, commands);
readChannelOutput(channel);
System.out.println("Finished sending commands!");
} catch (Exception e) {
System.out.println("An error ocurred during executeCommands: " + e);
}
}
private static void sendCommands(Channel channel, List<String> commands) {
try {
PrintStream out = new PrintStream(channel.getOutputStream());
out.println("#!/bin/bash");
for (String command : commands) {
out.println(command);
}
out.println("exit");
out.flush();
} catch (Exception e) {
System.out.println("Error while sending commands: " + e);
}
}
private static void readChannelOutput(Channel channel) {
byte[] buffer = new byte[1024];
try {
InputStream in = channel.getInputStream();
String line = "";
while (true) {
while (in.available() > 0) {
int i = in.read(buffer, 0, 1024);
if (i < 0) {
break;
}
line = new String(buffer, 0, i);
System.out.println(line);
}
if (line.contains("logout")) {
break;
}
if (channel.isClosed()) {
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
} catch (Exception e) {
System.out.println("Error while reading channel output: " + e);
}
}
It is not printing the corresponding command output whose logic is there in readChannelOutput
method. Does anyone have any idea what may be happening here?
I’m expecting to get command output of the remotely executed command. For e.g. if I’m executing ls -l it should list all subdirectories/files of that machine.
Update 1
Adding the output which I am getting for above code by giving one simple ls -l
command –
Connecting SSH to 17x.xx.xx.xx - Please wait for few seconds...
Connected!
Sending commands...
]0;c:windowssystem32cmd.exeMicrosoft Windows [Version 10.0.17763.3770]
(c) 2018 Microsoft Corporation. All rights reserved.
abcadministrator@xyz28 C:UsersAdministrator>#!/bin/bashls -lexit
]0;Administrator: c:windowssystem32cmd.exe
This scenario is specific where I need to ssh from the Unix based client to windows server.
Update 2
Here, my basic requirement is to ssh from the Unix based client to windows server programmatically, execute some powershell commands and read their corresponding output with or without any library.
vishr is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
4