4

我正在尝试使用 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 脚本。但是,即使在程序执行完成之后,即在脚本执行完成之后,我也不能终止程序执行。

你能建议具体需要做什么吗?

4

2 回答 2

3

我也遇到了同样的问题,并通过使用以下两个步骤解决了它: 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");
}
于 2013-08-29T07:49:08.500 回答
2

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

于 2018-02-16T00:18:11.197 回答