我正在尝试从PHP后端验证VMailMgr用户的密码。当我从bash中使用checkvpw
时,我的行为(几乎)得到了,我期望:
$ printf "%s\0%s\0%s\0" email@address.com correctPassword Y2018 | checkvpw ls . 3<&0
cur new tmp
$ echo $?
0
$ printf "%s\0%s\0%s\0" email@address.com wrongPassword Y2018 | checkvpw ls . 3<&0
$ echo $?
1
我实际上希望ls
列出当前工作目录的内容,但会列出用户的maildir的内容。同样,如果我使用echo hi
而不是ls .
,它将输出用户maildir的路径而不是hi
。但是,我可以依靠checkvpw
的退出状态。
当我对以下PHP代码段进行相同的操作时,我将获得退出状态111
,以获取正确的密码。
<?php
$proc = proc_open('checkvpw ls .', [
0 => ['pipe', 'r'],
1 => ['pipe', 'w'],
2 => ['pipe', 'w'],
3 => ['pipe', 'r']
], $pipes, null, [
'TCPLOCALHOST' => 'address.com'
]);
fprintf($pipes[3], "%s\0%s\0%s\0", "email@address.com", "correctPassword", "Y2018");
echo proc_close($proc);
111
表示暂时失败。当我使用错误的密码时,我仍然会获得退出代码1
。
请注意,手册页指出checkvpw
要求将环境变量TCPLOCALHOST
设置为要验证的域。但是,如果我省略环境变量,则行为不会改变(只要我提供@address.com
,这是有道理的。)
在bash
中,我尝试使用true
代替ls .
或echo hi
。这样,我得到了与PHP相同的行为(正确密码暂时失败):
$ printf "%s\0%s\0%s\0" email@address.com correctPassword Y2018 | checkvpw true 3<&0
$ echo $?
111
$ printf "%s\0%s\0%s\0" email@address.com wrongPassword Y2018 | checkvpw true 3<&0
$ echo $?
1
那么,这两种情况下的临时性故障来自何处? proc_open
中的环境与bash
中的环境有何不同,使得checkvpw
仍然标识错误的密码,但无法验证正确的密码?
还是有更深层的问题(例如我不能使用true
)?我怎么知道?
奖金:为什么ls .
列出用户的maildir而不是当前工作目录?根据手册页,checkvpw
仅应将参数中的""maildir""
替换为用户maildir的路径。
我使用的是CentOS 6.10,VMailMgr版本0.97。