communicate to virtual serial port after SSH - java

I want to communicate to a virtual Serial Port of my server . Steps involved in this is.
1.SSH in to iLO
2.enter vsp command
3.A virtual serial port session is opened
4.it asks for server credentials and then
it gives us a server terminal experience we can send any
command as we do in a terminal opened in the server itself
So my aim is to automate all the above steps in any way from java.
I have completed the first two steps via jsch but once it enters into virtual serial port session im not able to communicate .
I also tried automating the terminal commands using expect for linux in expect even I see the same pattern once it enters into VSP session I'm not able to communicate I tried autoexpect also it didn't work
Below is my jsch code
public static void main(String[] args) {
String host="10.10.100.209";
String user="administrator";
String password="2xR3M0t3$$";
String command1="vsp";
try{
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");
ChannelExec channel = (ChannelExec) session.openChannel("exec");
InputStream in = channel.getInputStream();
channel.setCommand("vsp");
OutputStream out = channel.getOutputStream();
channel.connect();
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
System.out.print("out"+new String(tmp, 0, i));
}
if(channel.isClosed()){
System.out.println("exit-status: "+channel.getExitStatus());
break;
}
}
channel.disconnect();
Now my question is how to communicate to virtual serial port after I ssh into my iLO.

Use ChannelShell instead of ChannelExec.
ChannelShell is like using interactive shell.
ChannelExec is like executing shell script.
Your use case seems to be interactive.

Related

Best way to make Android app execute python script on a remote computer and return a string output

I'm making an Android app for personal use. The goal is to give an input on my phone, send the input to a Python script on my PC, and return the output as a string.
What is the best way to make it connect to my Windows on PC, execute the python file, and return the result as simple string output?
Have the app write something to Firebase, have the Python script monitoring Firebase and react, then write back to Firebase which the app is monitoring
https://firebase.google.com/docs/android/setup
https://pypi.org/project/python-firebase/
https://firebase.google.com/docs/database
You can use SSH to run commands on a remote computer
for this purpose there are several libraries in Java, for example, you can use JSH Library
it's a simple example:
public static String executeRemoteCommand(
String username,
String password,
String hostname,
int port) throws Exception {
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostname, 22);
session.setPassword(password);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
// SSH Channel
ChannelExec channelssh = (ChannelExec) session.openChannel("exec");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
channelssh.setOutputStream(baos);
// Execute command
channelssh.setCommand("ls");
channelssh.connect();
channelssh.disconnect();
return baos.toString();
}
Resource link: SSH, execute remote commands with Android

How to pass control from local machine to Virtual machine through any scripting language?

I am trying to build a selenium(Java) script where it connects to virtual machine through RDP from local machine and I need to run some commands from current script in virtual machine after connecting to it. The problem I am facing is that control from local machine is not going into virtual machine because of which I am not able to run any scripts or commands in it.Please let me know how to pass control from local machine to virtual machine.To be more specific will my selenium script which is running in my local machine be able to perform any operations in the virtual machine which is opened by same selenium script running in local machine.
It may not be possible. your script may invoke RDP protocol to invoke VM but VM is the separate instance it has it own kernel and user space. The script you run will be in different kernel and user space. Both are not shared the same kernel and user space to access the value between the spaces.
If your VM is linux, you can take a control by using jcraft.
Note: You should have SSH enabled and local IP access to 22 port in VM.
Download jcraft from maven central repo https://mvnrepository.com/artifact/com.jcraft/jsch
public class ssh {
/**
* JSch Example Tutorial
* Java SSH Connection Program
*/
#Test
public static void connection(String host,String user, String password, String command) {
try{
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");
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in=channel.getInputStream();
channel.connect();
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
System.out.print(new String(tmp, 0, i));
}
if(channel.isClosed()){
System.out.println("exit-status: "+channel.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
channel.run();
channel.disconnect();
session.disconnect();
System.out.println("DONE");
}catch(Exception e){
}
}
}
Connect your VM by providing Host address of your server, username, password, and command you want to execute in it.
(Ex)
public class start{
static WebDriver driver;
public static void main(String[], args)
{
//connect your VM by using method from ssh class
ssh.connection("10.200.10.1", "userName", "password", "sudo service jenkins start");
//execute selenium command once application started
driver.findElement(By.xpath(".//*[#id='usr']")).sendKeys("Stack");
//execute another command inside VM
ssh.connection("10.200.10.1", "userName", "password", "cd /var/lib/jenkins/workspace && ls");
}
}

Jsch Java progam to pass arguements to a linux process

I have a binary executable file named as "datasimulator" that runs in a remote linux machine which starts an interactive process where a user can provide input and get its corresponding output like below -
[root#host]$ ./datasimulator
> set country USA //user passing this command
Country set to USA //response from process
> set country Canada
Country set to Canada
>exit
Thank you for using datasimulator.
[root#host]$
I am trying to automate this process using java jsch utility where through my java program I can pass input and get the output back to my program. Though I am able to start the datasimulator through jsch ssh connection but not able to pass input to this simulator process. Kindly help.
Below is the java program which I am trying to use -
JSch jsch = new JSch(); session = jsch.getSession(username, host, 22);
session.setPassword(password);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel=session.openChannel("shell");
OutputStream ops = channel.getOutputStream();
ps = new PrintStream(ops, true);
channel.connect();
ps.println("cd /path/To/datasimulator/ && ./datasimulator");
ps.println("Country set to USA");
Thread.sleep(5000);
ps.println("Country set to Canada");
Thread.sleep(5000);
ps.close();
channel.disconnect();
session.disconnect();
This program starts the datasimulator but not able to execute next consecutive commands successfully.

How to create a bot that simulate an SSH shell user interaction?

I'm trying to realize a bot that simulates an user that write/read on a ssh console in Java.
I'm using the JSCH library to manage the ssh connection.
This is the code from which I started:
JSch jsch = new JSch();
Session session = jsch.getSession(username, ipAddress, port);
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect(connectionTimeoutInMillis);
Channel channel = session.openChannel("shell");
InputStream is = new InputStream();
OutputStream out= new OutputStream();
channel.setInputStream(is);
channel.setOutputStream(out);
channel.connect();
channel.disconnect();
is.close();
out.close();
session.disconnect();
Obviously the InputStream and OutputStream in the code are wrong, I need to use something that the bot can use to send a String (a command line) and to receive a String(the result of the command execution), what type of streams should I use to obtain this?
Furthermore I noticed that if I send a command and use the System.out as output stream in many cases the output is empty because (I'm almost sure about this) the Java application terminates before that the command execution has produced the result. What is the best practice to tell to JSCH channel listener "wait till the command execution has completed" and then go on? I could use a Thread.sleep(someTime) after the command execution but I don't like much it for obvious reasons.
Consider using a third-party Expect-like Java library to ease the interaction with a remote shell. Here is a good set of options you can try:
Expect4J
ExpectJ
Expect-for-Java
You can also take a look at my own open source project which I created some time ago as the successor to the existing ones. It's called ExpectIt. The advantages of my library are stated on the project home page.
Here is an example of interacting with a public remote SSH service using JSch. It should be easy to adopt it for your use case.
JSch jSch = new JSch();
Session session = jSch.getSession("new", "sdf.org");
session.connect();
Channel channel = session.openChannel("shell");
Expect expect = new ExpectBuilder()
.withOutput(channel.getOutputStream())
.withInputs(channel.getInputStream(), channel.getExtInputStream())
.withErrorOnTimeout(true)
.build();
try {
expect.expect(contains("[RETURN]"));
expect.sendLine();
String ipAddress = expect.expect(regexp("Trying (.*)\\.\\.\\.")).group(1);
System.out.println("Captured IP: " + ipAddress);
expect.expect(contains("login:"));
expect.sendLine("new");
expect.expect(contains("(Y/N)"));
expect.send("N");
expect.expect(regexp(": $"));
expect.send("\b");
expect.expect(regexp("\\(y\\/n\\)"));
expect.sendLine("y");
expect.expect(contains("Would you like to sign the guestbook?"));
expect.send("n");
expect.expect(contains("[RETURN]"));
expect.sendLine();
} finally {
session.close();
ssh.close();
expect.close();
}
Here is the link to the complete workable example.

unable to execute a .sh script with Jsch

i'm trying to execute a script shell in a unix server from my java application (on my windows seven station) using the ssh api Jsch.
the script shell i'm using "start_lm" is a C binary.
this is the code i'm using (it's from the Jsch website exemples)
try{
JSch jsch=new JSch();
Session session=jsch.getSession(user, host, 22);
UserInfo ui=new MyUserInfo();
session.setUserInfo(ui);
session.connect();
String command="user/psi/start_lm";
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in=channel.getInputStream();
channel.connect();
while(true){
if(channel.isClosed()){
System.out.println("exit-status: "+channel.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
channel.disconnect();
session.disconnect();
}
the error i'm getting is
exit-status: -1 what does it mean
thanks for ure help.
There's the problem I believe
". ./start_lm.sh
It should be below provided script present in current directory
"./start_lm.sh
as exit status 127 says
127 "command not found" illegal_command
String command="/bin/sh /user/psi/start_lm.sh";
Please try the above, for jsch might be using an non-interactive shell.

Categories