3

我正在尝试通过在输出流中发送密码来从 java 程序中更改 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

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

4

3 回答 3

5

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

要分解你的 shell 脚本:

i="123456"

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

sudo -S方法 :

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

这就是您的脚本正在做的事情,它正在为您的as设置 password( passwd) 。并且由于您正在使用它,它是从标准输入中读取的,您已经给了您的变量。而你作为超级用户正在做这一切!记在脑子里。sampleuseri-Si

现在回头看看你的 java 程序并尝试进行相应的更改。运行程序时是否具有超级用户权限?不,你没有。

于 2012-06-01T07:39:35.023 回答
0

I'm not sure why your approach fails. I suppose passwd uses a different stream.

But use ExpectJ for this. It is made just for such cases.

于 2012-06-01T07:44:31.767 回答
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();
}
于 2017-05-18T14:11:06.783 回答