我试图通过在输出流中发送密码来改变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
成功更改用户密码。
答案 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();
}