有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何向java进程传递多个密码

我使用运行时执行一个命令,该命令接受密码两次(如:输入密码、验证密码)。我正在使用以下代码。我面临的问题是程序挂起,因为它正在等待验证密码。第一个密码被正确传递(我通过从我的命令和java代码中删除verify password来验证它是否有效),verify password没有被传递到命令,并且命令不确定地等待verify password。如果有人有任何建议,请告诉我

try
    {
      runtime = Runtime.getRuntime();
      process = runtime.exec("<<my command>>"");
      String inLine = "";
      String errLine = "";
      StringBuffer inBuffer = new StringBuffer();
      StringBuffer errBuffer = new StringBuffer();

      PrintWriter pw = new PrintWriter(process.getOutputStream());
      pw.print("<<password>>"+"\n");
      pw.print("<<verify password>>"+"\n");
      pw.flush();

      BufferedReader stdin = new BufferedReader(new InputStreamReader(
              process.getInputStream()));
      BufferedReader stderr = new BufferedReader(new InputStreamReader(
              process.getErrorStream()));

      while ((inLine = stdin.readLine()) != null) {
          inBuffer = inBuffer.append(inLine + "\n");
      }
      stdin.close();
      System.out.println("Output messages of cmd " + inBuffer.toString());

      while ((errLine = stderr.readLine()) != null) {
          errBuffer = errBuffer.append(errLine + "\n");
      }
      stderr.close();
      System.out.println("Error messages of cmd " + errBuffer.toString());

      process.waitFor();
      int exitCode = process.exitValue();
      System.out.println("cmd " + " exited with code " + exitCode);


    }

共 (2) 个答案

  1. # 1 楼答案

    试着使用这些东西:

    System.out.println("<<password>>");
    String pw;
    BufferedReader stdin = new BufferedReader(new InputStreamReader(
              System.in));
    while ((pw = stdin.readLine()) != null){ //Waits for a reply for the first password
        if (pw != ""){
            break; //This breaks the loop, and 'pw' is the password entered.
        }
    }
    

    重复这一点,以确保安全

    << verifypassword >>

    并改变变量。那应该行

    这是验证密码

    System.out.println("<<verifypassword>>");
    String pw2;
    BufferedReader stdin2 = new BufferedReader(new InputStreamReader(
              System.in));
    while ((pw2 = stdin2.readLine()) != null){ //Waits for a reply for the first password
        if (pw2 != ""){
            break; //This breaks the loop, and 'pw' is the password entered.
        }
    }
    
  2. # 2 楼答案

    while ((inLine = stdin.readLine()) != null) {while ((errLine = stderr.readLine()) != null) {都将阻止主线程,直到数据可用。可能是您的命令正在向stderr中吐出一些内容,但您无法看到它,因为您的主线程在stdin read循环中被阻塞

    最好使用单独的线程使用stdin和stderr,这样可以更容易地调试代码