4

I'm trying to write a Java Program using Jsch where in I want to start the execution of a shell script using the program and exit the program once the execution of the shell script has been completed.

    String userName = "";
    String hostName = "";
    String password = "";

    JSch javaSecureChannel = new JSch();

    Session jschSession = null;
    Channel jschChannel = null;

    try {

        jschSession = javaSecureChannel.getSession(userName, hostName, 22);
        Properties configurationProperties = new Properties();
        configurationProperties.put("StrictHostKeyChecking", "no");
        jschSession.setConfig(configurationProperties);
        jschSession.setPassword(password);
        jschSession.connect();
        jschChannel = null;
        jschChannel = jschSession.openChannel("shell");
        jschChannel.setOutputStream(System.out);

        File shellScript = createShellScript();

        FileInputStream fin = new FileInputStream(shellScript);
        byte fileContent[] = new byte[(int) shellScript.length()];
        fin.read(fileContent);
        InputStream in = new ByteArrayInputStream(fileContent);
        jschChannel.setInputStream(in);         
        jschChannel.connect();

        while(true){                

            //if(jschChannel.isClosed)
            if(jschChannel.getExitStatus() == 0){
              System.out.println("exit-status: " + jschChannel.getExitStatus());
              break;
            }

            try{
                Thread.sleep(1000);
            }catch(Exception ee){
                ee.printStackTrace();
            }

          }

    } catch (Exception e) {
        e.printStackTrace();
    }

    jschChannel.disconnect();
    jschSession.disconnect();
    System.out.println("Done...!!!");

createShellScript method is as follows.

    String temporaryShellFileName = "shellscript.sh";
    File fileStream = new File(temporaryShellFileName);

    try {

        PrintStream outStream = new PrintStream(new FileOutputStream(fileStream));
        outStream.println("#!/bin/bash");
        outStream.println("cd /u01/app/java/gids4x/Test");
        outStream.println("Test_with_NULL.sh");
        outStream.close();

    } catch (Exception e) {

        System.err.println("Error: " + e.getMessage());

    }

Using the above code, I'm able to start the execution of the shell script. However, I'm not bale to terminate the program execution even after the execution of the program is completed i.e. after the execution of the Script completes.

Can you please suggest what needs to be done exactly?

1
  • Can anyone please suggest how this can be handled? The thread still remains active even after the execution of the Shell Script completes. Commented Oct 16, 2012 at 7:17

2 Answers 2

3

I also faced the same issue and resolved it by using below two steps : 1. Sending last command as "exit" 2. Putting my mail thread sleep until channel is open

Please find the code as below :

public static void main(String[] arg){

  Channel channel=null;
  Session session=null;
try{
  JSch.setLogger(new MyLogger());
  JSch jsch=new JSch();
  jsch.addIdentity("C:\\testLinuxKey.key");

  String host=null;
  if(arg.length>0){
    host=arg[0];
  }
  else{
    host=JOptionPane.showInputDialog("Enter username@hostname",
                                     System.getProperty("user.name")+
                                     "@localhost"); 
  }
  String user=host.substring(0, host.indexOf('@'));
  host=host.substring(host.indexOf('@')+1);

  session=jsch.getSession(user, host, 22);

  // username and password will be given via UserInfo interface.
  UserInfo ui=new MyUserInfo();
  session.setUserInfo(ui);

  session.connect();

  channel=session.openChannel("shell");

  //channel.setInputStream(System.in);
  channel.setOutputStream(System.out);

  String temporaryShellFileName = "shellscript.sh";
    File fileStream = new File(temporaryShellFileName);

    try {

        PrintStream outStream = new PrintStream(new FileOutputStream(fileStream));
        outStream.println("id");
        outStream.println("sudo bash");
        outStream.println("cd /tmp/");
        outStream.println("/tmp/wasinfo.sh");
        outStream.println("exit");
        outStream.println("exit");
        outStream.close();
        FileInputStream fin = new FileInputStream(fileStream);
        byte fileContent[] = new byte[(int) fileStream.length()];
        fin.read(fileContent);
        InputStream in = new ByteArrayInputStream(fileContent);
        channel.setInputStream(in);  

    } catch (Exception e) {

        System.err.println("Error: " + e.getMessage());

    }

  channel.connect();
  while(channel.isConnected())
  {
      System.out.println("----- Channel On ----");
      Thread.currentThread().sleep(5000);
  }
  channel.disconnect();
  session.disconnect();
}
catch(Exception e){
  System.out.println(e);
  channel.disconnect();
  session.disconnect();      
}

System.out.println("Main End");
}
Sign up to request clarification or add additional context in comments.

Comments

2

I had a similar problem. I was running a shell in a window but couldn't get Java to terminate when the window was closed. I solved it by closing the input stream.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.