Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java中的checkpassword pam_Java_Posix_Pam - Fatal编程技术网

使用Java中的checkpassword pam

使用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服务\ -

我想在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服务\

--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。