Jsch - Shell脚本执行后退出

时间:2012-10-09 09:43:34

标签: java unix jsch

我正在尝试使用Jsch编写Java程序,我希望使用该程序开始执行shell脚本,并在完成shell脚本的执行后退出程序。

    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方法如下。

    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());

    }

使用上面的代码,我可以开始执行shell脚本。但是,即使在程序执行完毕后,即在脚本执行完成之后,我也不打算终止程序执行。

你能说明一下需要做些什么吗?

2 个答案:

答案 0 :(得分:2)

我也遇到了同样的问题,并通过以下两个步骤解决了这个问题: 1.将最后一个命令发送为“退出” 2.将我的邮件线程置于睡眠状态,直到频道打开

请找到如下代码:

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");
}

答案 1 :(得分:2)

我有类似的问题。我在一个窗口中运行一个shell但是当窗口关闭时无法让Java终止。我通过关闭输入流来解决它。