有 Java 编程相关的问题?

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

linux Java使用“|”执行debian终端命令

关于通过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|u password | chpasswd,第一个命令工作正常,并创建由“server”变量定义的用户,但是当我尝试执行第二个命令来更改用户时,传递这个命令可能永远不会发生,输出为null,密码也不会更改,但是当我直接向终端键入这个命令时,它工作得非常好,所以这只是Java的问题

我认为问题出在字符“|”上,在我尝试使用“|”执行某些命令之前,其行为与此命令相同。我做错了什么

谢谢。 韦利特


共 (1) 个答案

  1. # 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();