我可以从Java程序更改在Linux的用户密码?

我正在尝试通过在outputstream中发送密码来更改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程序提供密码? 你可以build议我,我将如何成功地做到这一点,或者是否有任何shell API可用。

当我尝试使用shell脚本并从我的java程序中调用它时,同样的事情就成功了

 Process process = Runtime.getRuntime().exec("bash first.sh"); 

我的shell脚本是

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

它成功地更改了用户密码。

Solutions Collecting From Web of "我可以从Java程序更改在Linux的用户密码?"

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

打破你的shell脚本:

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

sudo -S意思是:

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

这就是你的脚本正在做的事情,就是为你的sampleuser设置密码( passwd )。 而且,由于您正在使用-S它正在从标准输入中读取,您已经向其输入了变量i 。 而你正在做所有这些超级用户! 记住这一点。

现在回头看看你的Java程序,并相应地尝试更改。 当你运行你的程序时你有超级用户权限吗? 不,你不知道。

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

但是为此使用ExpectJ 。 它只是为了这种情况下。

如果有人正在寻找一个答案,我只是找到一个这样的路线:

 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(); }