给定用户名和密码,我需要检查本地系统上是否有用户使用该用户名和密码。我知道posix_getpwnam和使用PAM包,但这两种方法都要求PHP脚本具有对/etc/shadow的访问权限,我不想干扰系统文件或守护进程用户的权限。我想这可以通过使用标准的系统命令(如sudo)或编写自己的小型setuid C程序来完成。我还可以尝试使用所述用户名/密码通过FTP或SSH连接到localhost以验证它。有更简单的方法吗?
posix_getpwnam
PAM
/etc/shadow
sudo
2ul0zpep1#
如果你想要一个更本地的方式,你可以自己滚动。我会更多地研究PAM:pam_authenticate.我的意思是,你应该能够创建一个应用程序,验证,但不需要使用PAM的根,例如sudo。但是,如果您需要更简单的解决方案,只需调用:来源www.example.comlogin.sh
#!/bin/bash su $1 < `echo $2` #Need echo for the newline
在PHP代码中,作为login.sh的exec语句,第一个参数是用户名,第二个参数是密码。
login.sh
exec
lp0sw83n2#
1.我相信ftp/ssh是一种巧妙的方法,假设系统总是运行这些。1.另一种可能性是写一些脚本从/etc/shadow中提取这些用户,并作为一个cron作业运行这个脚本来定期更新它。这个脚本创建一个文件,权限只针对运行你的网站的用户(apache之类的),如果你真的想疯狂的话,可以检查这个文件甚至数据库的条目到mysql。第一个简单易行,第二个稍微麻烦一点,另一个刚刚想到的方法是通过php执行一个系统命令,比如useradd $user并检查return,这需要sudo。
huus2vyu3#
我也可以尝试通过FTP或SSH连接到localhost,并使用所述用户名/密码进行验证。这就是我最后所做的(使用PHP ssh 2扩展)。本地命令也通过相同的连接运行,在用户的凭据下。
b5buobof4#
如果您的脚本可以运行su(切换用户)命令,就不需要通过网络连接,但是如果用户没有密码,这种方法是危险的,因为密码将作为命令执行。我使用这个检查/etc/group文件之前,它检查用户的登录是否在所需的组。
su
/etc/group
function unix_auth_local_user($username, $password) { $ok = false; $username = escapeshellarg($username); $pipes_spec = [ ["pipe", "r"], ['file', '/dev/null', 'a'], ['file', '/dev/null', 'a'] ]; $command = escapeshellarg("exit;"); $process = proc_open('su '.$username.' -c '.$command, $pipes_spec, $pipes); if (is_resource($process)) { fwrite($pipes[0], $password); fclose($pipes[0]); $status = proc_close($process); $ok = $status === 0; } return $ok; }
另外,请记住,这会触发用户的登录脚本和注销后脚本(ssh登录也是如此)。
4条答案
按热度按时间2ul0zpep1#
如果你想要一个更本地的方式,你可以自己滚动。我会更多地研究PAM:pam_authenticate.
我的意思是,你应该能够创建一个应用程序,验证,但不需要使用PAM的根,例如sudo。
但是,如果您需要更简单的解决方案,只需调用:
来源www.example.comlogin.sh
在PHP代码中,作为
login.sh
的exec
语句,第一个参数是用户名,第二个参数是密码。lp0sw83n2#
1.我相信ftp/ssh是一种巧妙的方法,假设系统总是运行这些。
1.另一种可能性是写一些脚本从/etc/shadow中提取这些用户,并作为一个cron作业运行这个脚本来定期更新它。这个脚本创建一个文件,权限只针对运行你的网站的用户(apache之类的),如果你真的想疯狂的话,可以检查这个文件甚至数据库的条目到mysql。
第一个简单易行,第二个稍微麻烦一点,另一个刚刚想到的方法是通过php执行一个系统命令,比如useradd $user并检查return,这需要sudo。
huus2vyu3#
我也可以尝试通过FTP或SSH连接到localhost,并使用所述用户名/密码进行验证。
这就是我最后所做的(使用PHP ssh 2扩展)。本地命令也通过相同的连接运行,在用户的凭据下。
b5buobof4#
如果您的脚本可以运行
su
(切换用户)命令,就不需要通过网络连接,但是如果用户没有密码,这种方法是危险的,因为密码将作为命令执行。我使用这个检查/etc/group
文件之前,它检查用户的登录是否在所需的组。另外,请记住,这会触发用户的登录脚本和注销后脚本(ssh登录也是如此)。