我可以在java程序中更改linux中的用户密码吗?

时间:2012-06-01 07:34:41

标签: java linux bash shell ubuntu

我试图通过在输出流中发送密码来改变linux中的用户密码,但是没有完成。

我的java程序就像

Process process = Runtime.getRuntime().exec("sudo passwd sampleuser");

OutputStream outputStream = process.getOutputStream();

InputStream inputStream = process.getInputStream();

PrintWriter printWriter=new PrintWriter(outputStream);

printWriter.write("123456");

printWriter.write("\n");

printWriter.flush();

我的程序在这里失败,它要求输入密码,但我不想要这个案例。

是否有可能从java程序提供密码?你可以建议我,我将如何成功地做到这一点,或者是否有任何shell api可用。

当我尝试使用shell脚本并从我的java程序中调用

时,同样的事情成功了
Process process = Runtime.getRuntime().exec("bash first.sh");

我的shell脚本是

i="123456"

echo -e $i"\n"$i|sudo -S passwd sampleuser

成功更改用户密码。

3 个答案:

答案 0 :(得分:4)

它会要求输入密码。看看你的shell脚本。您执行一个要求超级用户权限的命令(sudo)。除非您以超级用户身份运行,否则您的程序将提示输入密码。

要分解shell脚本:

i="123456"

echo -e $i"\n"$i|sudo -S passwd sampleuser

sudo -S表示:

-S(stdin)选项使sudo从标准输入而不是终端设备读取密码。密码必须后跟换行符。

这就是您的脚本正在执行的操作,它将passwd设置为sampleuser的密码(i)。由于您使用的是-S,因此它正在读取标准输入,您已将变量i添加到标准输入中。而且你作为一个超级用户正在做这一切!牢记这一点。

现在回顾一下你的java程序,并相应地尝试更改。运行程序时是否拥有超级用户权限?不,你没有。

答案 1 :(得分:0)

我不确定为什么你的方法失败了。我想passwd使用不同的流。

但请使用ExpectJ。它仅适用于此类情况。

答案 2 :(得分:0)

如果有人正在寻找答案,我只想找到一条方法:

try {
    Process p = Runtime.getRuntime().exec(new String[] {"sudo", "/bin/sh", "-c", "echo \"user:newpassword\" | sudo chpasswd"} );
    p.waitFor();
} catch (IOException | InterruptedException e1) {
    e1.printStackTrace();
}