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

时间:2014-11-29 00:39:07

标签: java linux terminal command execute

我遇到了一个关于通过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用户名:new_password | chpasswd,第一个命令没有任何问题,并创建了我通过“server”变量定义的用户,但是当我尝试执行第二个命令来更改用户时,传递此命令可能永远不会发生,输出为空且密码不是改变了,但是当我直接在终端上输入这个命令时,它完全可以工作,所以这只是Java问题。

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

感谢。 Welite。

1 个答案:

答案 0 :(得分:0)

|是一个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();