【问题标题】:Java execute debian terminal command with "|"Java用“|”执行debian终端命令
【发布时间】:2015-01-27 15:27:13
【问题描述】:

我在通过 Java 向终端发送命令时遇到了一个非常令人困惑的问题。 我有这个代码:

        Process p = Runtime.getRuntime().exec(new String[]{"useradd", server, "-p", pass, "-d",     "/home/dakadocp/servers/" + server, "-s", "/bin/false"});
        Runtime.getRuntime().exec(new String[]{"echo", server + ":" + pass, "|", "chpasswd"});

第一个命令是这个“useradd user -p password -d /home/ftp/test/ -s /bin/false”,第二个应该是这个 echo username:new_password | chpasswd,第一个命令没有任何问题,并创建了我由“服务器”变量定义的用户,但是当我尝试执行第二个命令来更改用户时,通过这个命令可能永远不会发生,输出为空,密码不是更改了,但是当我直接向终端键入此命令时,它可以完美运行,所以这只是 Java 问题。

我认为问题出在字符“|”上,之前我还尝试了一些带有“|”的命令它的行为与此命令相同。我做错了什么?

谢谢。 微信。

【问题讨论】:

    标签: java linux terminal command execute


    【解决方案1】:

    | 是一个 shell 功能,需要 shell 才能运行。简单的解决方法是运行一个 shell:

    Runtime.getRuntime().exec(new String[] { "sh", "-c", "echo something | chpasswd" });
    

    但是,java 不仅能够写入需要 shell 或 echo 的进程。更好的方法是单独运行 chpasswd 并将字符串写入其中:

    Process p = Runtime.getRuntime().exec(new String[] { "chpasswd" });
    PrintWriter writer = new PrintWriter(p.getOutputStream());
    writer.println("foo:bar");
    writer.close();
    

    【讨论】:

    • 很好,谢谢,我使用了第二种解决方案,效果很好!
    最近更新 更多