使用Java中的checkpassword pam
我想在java应用程序中使用。这是一个非常简单的可执行文件,从FD3读取用户名和密码,然后进行验证。 描述了该协议 在shell中,您可以这样使用它:使用Java中的checkpassword pam,java,posix,pam,Java,Posix,Pam,我想在java应用程序中使用。这是一个非常简单的可执行文件,从FD3读取用户名和密码,然后进行验证。 描述了该协议 在shell中,您可以这样使用它: # echo -e "username\0password\0timestamp\0" \ | checkpassword-pam -s SERVICE \ --debug --stdout -- /usr/bin/id 3<&0 #echo-e“用户名\0密码\0时间戳\0”\ |检查密码pam-s服务\ -
# echo -e "username\0password\0timestamp\0" \
| checkpassword-pam -s SERVICE \
--debug --stdout -- /usr/bin/id 3<&0
#echo-e“用户名\0密码\0时间戳\0”\
|检查密码pam-s服务\
--debug--stdout--/usr/bin/id 3为了做您想要做的事情,您可以使用该类,使用运行时的Runtime.getRuntime()
,以及运行时的exec
方法从Java程序内部运行命令。由此,您可以使用该类来控制该shell命令的标准输入和输出,本质上模拟用户从其控制台键入命令。您可以寻找更多帮助来回答我自己的问题:一个简单的shell命令可以将fd3重定向到stdin
try {
Process p = new ProcessBuilder("/bin/sh", "-c" , "exec /usr/bin/checkpassword-pam -s sshd 3<&0 /usr/bin/id").redirectErrorStream(true).start();
OutputStream os = p.getOutputStream();
os.write(userName.getBytes(Charset.defaultCharset()));
os.write(0);
os.write(password.getBytes(Charset.defaultCharset()));
os.write(0);
os.close();
p.waitFor(10, TimeUnit.SECONDS);
if (p.exitValue() == 0) {
logger.info("authenticated user {}", IOUtils.read(p.getInputStream()).trim());
result = true;
} else {
logger.info("authenticated failed for user {}", userName);
result = false;
}
} catch (IOException | InterruptedException e) {
logger.error("failed to authenticate user {}", userName, e);
result = false;
}
试试看{
Process p=new ProcessBuilder(“/bin/sh”、“-c”、“exec/usr/bin/checkpassword pam-s sshd 3您可以使用ProcessBuilder
/Runtime.getRuntime().exec()
运行程序。然后您可以控制stdin
/stdout
。问题特别是关于写入非标准文件描述符(3)而不是stdin。