PHP/PAM更改用户密码?

2024-01-29

是否有任何使用 PHP 更改 Linux 用户密码的工作包?

我尝试过使用 PECL:PAM,但在尝试更改密码时出现错误。

Edit:

PHP代码:

echo pam_chpass($username, $password, $new_pass, &$error) ? 'good' : $error;

PHP(回显)输出:

Permission denied (in pam_authenticate)

来自 /var/log/auth (这些实际上是之前的,日志似乎无法在 ATM 上工作,原因尚未确定):

Jun 11 15:30:20 veda php: pam_unix(php:chauthtok): conversation failed
Jun 11 15:30:20 veda php: pam_unix(php:chauthtok): password - (old) token not obtained
Jun 11 15:30:20 veda php: pam_winbind(php:chauthtok): valid_user: wbcGetpwnam gave WBC_ERR_DOMAIN_NOT_FOUND

Other:

抱歉之前缺乏细节,当我发布问题时我真的很累,但这仍然是一个蹩脚的借口。


经过几个小时的在线研究,我无法找到一个超级好的选择,所以我实现了这个技巧。它用本文 http://www.cyberciti.biz/tips/change-linux-or-unix-system-password-using-php-script.html使用 PHP 更改密码。

我也在使用PECL:PAM封装 http://pecl.php.net/package/PAM添加一点验证。

此页面位于安全的 HTTPS 文件夹中(通过 .htaccess 自动重定向)

<?php

$messages = array();

function change_password ($user, $currpwd, $newpwd) {

    // Open a handle to expect in write mode
    $p = popen('/usr/bin/expect','w');

    // Log conversation for verification
    $log = '/tmp/passwd_' . md5($user . time());
    $cmd .= "log_file -a \"$log\"; ";

    // Spawn a shell as $user
    $cmd .= "spawn /bin/su $user; ";
    $cmd .= "expect \"Password:\"; ";
    $cmd .= "send \"$currpwd\\r\"; ";
    $cmd .= "expect \"$user@\"; ";

    // Change the unix password
    $cmd .= "send \"/usr/bin/passwd\\r\"; ";
    $cmd .= "expect \"(current) UNIX password:\"; ";
    $cmd .= "send \"$currpwd\\r\"; ";
    $cmd .= "expect \"Enter new UNIX password:\"; ";
    $cmd .= "send \"$newpwd\\r\"; ";
    $cmd .= "expect \"Retype new UNIX password:\"; ";
    $cmd .= "send \"$newpwd\\r\"; ";
    $cmd .= "expect \"passwd: password updated successfully\"; ";

    // Commit the command to expect & close
    fwrite($p, $cmd); pclose ($p);

    // Read & delete the log
    $fp = fopen($log,r);
    $output = fread($fp, 2048);
    fclose($fp); unlink($log);
    $output = explode("\n",$output);

    return (trim($output[count($output)-2]) == 'passwd: password updated successfully') ? true : false;
}

function process_post() {

    if ((!isset($_SERVER['HTTP_REFERER'])) 
        || (strpos($_SERVER['HTTP_REFERER'], $_SERVER['SCRIPT_NAME']) === FALSE)) {

        echo "GO AWAY!";
        exit();
        return FALSE;

    }

    global $messages;

    $username           = trim($_POST['username']);
    $password_current   = trim($_POST['password_current']);
    $password_new       = trim($_POST['password_new']);
    $password_confirm   = trim($_POST['password_confirm']);

    // Check for blanks
    if ($username == '' || $password_current == '' || $password_new == '' || $password_confirm == '') {
        array_push(&$messages, "ERROR: You cannot leave any field empty.");
        return FALSE;
    }

    // Check username
    if (!ctype_alnum($username)) {
        array_push(&$messages, "ERROR: You've entered an invalid username.");
        return FALSE;
    }

    // Check to see if new password is correctly typed
    if ($password_new != $password_confirm) {       
        array_push(&$messages, "ERROR: New Password and Confirmation do not match.");
        return FALSE;
    }

    // Check if current password is valid (not really neccessary)
    if (!pam_auth($username, $password_current, &$error, FALSE)) {
        if (trim($error) == "Permission denied (in pam_authenticate)")
            array_push(&$messages, "ERROR: You've username/password was not accepted.");    
        else
            array_push(&$messages, "ERROR: " . $error);
        return FALSE;
    }

    if (change_password ($username, $password_current, $password_new))
        array_push(&$messages, "Password Successfully Changed");
    else 
        array_push(&$messages, "ERROR: Password change failed.");

}

if ($_SERVER['REQUEST_METHOD'] == 'POST') process_post();


?><html>
<head>


<title>Passwords</title>

<style type="text/css">

body {
    font-family: Verdana, Arial, sans-serif;
    font-size: 12px;
}

label {
    width: 150px;
    display: block;
    float: left;
}

input {
    float: left;
}

br {
    clear: both;
}

.message {
    font-size: 11px;
    font-weight: bold;
}

.error {
    color:#C00;
}


</style>

</head>


<body>

<h2>Change Passwords</h2>

<form action="<?= $_SERVER['SCRIPT_NAME'] ?>" method="post">

<fieldset>

<? if (count($messages) != 0) { 

    foreach ($messages as $message) { ?>

<p class="message<?= ((strpos($message, 'ERROR:') === FALSE) ? '' : ' error') ?>"><?= $message ?></p>

<? } } ?>

<label>Username: </label>
<input type="text" name="username" /><br />

<label>Current Password:</label>
<input type="password" name="password_current" /><br />

<label>New Password:</label>
<input type="password" name="password_new" /><br />

<label>Confirm Password:</label>
<input type="password" name="password_confirm" /><br />

<input type="reset" value="Reset" /> <input type="submit" value="Submit" />

</fieldset>


</form>


</body>
</html>

我也将这个问题/答案发布在https://serverfault.com/questions/150306/how-to-let-users-change-linux-password-from-web-browser/152409#152409 https://serverfault.com/questions/150306/how-to-let-users-change-linux-password-from-web-browser/152409#152409

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP/PAM更改用户密码? 的相关文章

  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • Ajax 没有将我重定向到下一页

    我正在尝试将单击的图像的 ID 传递到下一页 当我开发代码时 它没有将我重定向到下一页 当我单击 F12 并检查网络中的 POST 时 它显示变量已正确传递到下一页 如附图所示 但它没有将我重定向到下一页 所以现在我知道变量在下一页中正确传
  • 简单的 PHP 回显代码不起作用

    这是我的 html 和 php 脚本 h1 Bob s Auto Parts h1 table width 100 tr tr table 为什么这个输出会出现一个 gt 我希望它是 这有效 仅有的 这是输出 鲍勃的汽车零件 鲍勃
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • 从类似 cronjob 的语法创建“下次运行时间”日期

    在我正在创建的应用程序中 用户可以安排重复任务 生成间隔模式的简单值是 Minute 0 59 90 each minute Hour 0 23 90 each hour Day of month 1 31 90 each day of m
  • 在 PHP 中比较两个对象的最快方法是什么?

    假设我有一个对象 在本例中为 User 对象 并且我希望能够使用单独的类来跟踪更改 用户对象不必以任何方式改变它的行为才能发生这种情况 因此 我的单独的类创建它的 干净 副本 将其存储在本地某个位置 然后可以将 User 对象与原始版本进行
  • Google Cloud SQL 上的故障转移如何运作?

    我打算将 PHP 应用程序 从 Google Cloud Platform 外部的服务器 连接到 Google Cloud SQL 我想知道如何设计应用程序以正确地对其数据库进行故障转移 根据manual https cloud googl
  • 如何在多次尝试后延迟登录尝试 (PHP)

    我正在开发一个用 PHP 构建的相当大的网站 该网站可能会有很多用户 我正在寻找一种方法来保护登录屏幕免受自动尝试的影响 我已经在注册表中添加了验证码检查 但还想进一步强化网站 据我所知 StackOverflow 上也有类似的问题 而且我
  • 在 WooCommerce 中添加到购物车之前清空购物车

    我正在使用 WP 作业管理器和 Woo Subscriptions Now 最初 我选择了一个套餐 Woo Subscription 然后我添加了所有细节 但没有提交 回到网站 所以要再次购买 我需要选择一个套餐 于是我选择了套餐并填写了详
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • PHP print_r() 中 _r 的含义是什么?

    我见过这个答案 https stackoverflow com questions 13103410 what does r suffix mean就这样 但我不确定它对于 PHP 是否相同 如果是 可重入的含义是什么 From PHP n
  • Codeigniter - 出现 404 Not Found 错误

    我们在 godaddy 有两个托管套餐 我们的实时网站使用以下 htaccess 文件运行良好 无需在 url 中使用 index php 即可访问网站 RewriteEngine On RewriteCond REQUEST FILENA
  • PHP 中的引用

    我正在编写一个自定义博客引擎 并且希望拥有类似于 Wordpress 的引用 我可以查看 WordPress 源代码 但我真的更喜欢某种教程 但到目前为止我还没有找到 有没有关于在 PHP5 中实现 trackbacks 或 pingbac
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • ZF3/2 - 如何捕获 EVENT_DISPATCH 侦听器中引发的异常?

    有什么方法可以在 EVENT DISPATCH 监听器中抛出异常吗 class Module public function onBootstrap EventInterface event application event gt get

随机推荐

  • STATICFILES_DIRS 设置不应包含 STATIC_ROOT 设置

    我正在使用 Django 1 7 将我的网站部署到生产服务器并运行时collectstatic 我收到以下错误消息 django core exceptions ImproperlyConfigured STATICFILES DIRS 设
  • 将反应本机升级到最新版本

    我有一个在react native 0 49 3 上运行的应用程序 我想升级到最新版本 v0 57 4 我应该逐步更新它吗 例如 0 49 gt 0 50 gt 0 51 等 或者我可以直接更新到最新版本吗 你建议使用react nativ
  • 委托和谓词查询

    我正在学习 lambda 并试图理解为什么 同时拥有 EmployeeFilterAge 类 如下所示 public class EmployeeFilterAge int age public EmployeeFilterAge int
  • iOS 8 Safari 打印重定向不会停止 javascript 执行

    我需要提供在成功保存时以及打印重定向到搜索页面后打印标签的能力 这适用于 chrome firefox ie iOS 6 7 safari 等 但是 当从 javascript 发出 window print 时 iOS 8 似乎不再停止
  • 运行 zipalign 时出错

    尝试在 Eclipse 中导出签名的 apk 时出现此错误 运行 zipalign 时出错 打不开 作为 zip 存档 我已运行 帮助 gt 检查更新 以确保安装了最新更新并且 SDK 工具也是最新的 我收到了同样的错误消息 让我发疯 直到
  • 从类路径中动态删除 jar

    我有一个要求 必须根据从 UI 捕获分布的分布来更改 jar 一组与另一组的分布各不相同 如果选择了某个发行版 则必须以动态 编程方式将与该发行版相关的 jar 添加到类路径中 如果选择另一个发行版 则必须动态地从类路径中删除添加到类路径的
  • 返回只出现一次的数字 (JavaScript)

    假设我有数组 1 2 3 5 2 1 4 如何让 JS 返回 3 4 5 我在这里查看了其他问题 但它们都是关于删除多次出现的数字的副本 而不是原始文件和副本 Thanks Use Array filter https developer
  • 调用 win32 API 并对类函数进行回调

    我试图通过将一些现有的 win32 UI 代码放入一个类中来清理它 以前我有一个像这样的 AppDlgProc 函数 BOOL CALLBACK AppDlgProc HWND hDlg UINT uMsg WPARAM wParam LP
  • 将 JTextField 添加到游戏菜单 (graphics2d)

    我正在开发一款多人游戏 在菜单中 我需要添加一个字段 玩家可以在其中输入主机 IP 我正在使用 Graphics2D 制作菜单 并循环更新它 JFrame screenFrame screen getFullScreenWindow whi
  • 自定义 UITableViewCell prepareForReuse 未按预期工作

    My prepareForReuse无法正常工作 我有一个UITableView那应该有一个login UIButton仅在表的第一部分的第一行中 但当 在prepareForReuse 我删除了login按钮 它会保留并进入下一批行 视频
  • 在 Jekyll 中显示一个文件夹下的页面?

    我认为管理 Jekyll 页面的本机方式 即通过在根文件夹下创建 md 文件 文件夹 有点混乱 因此 我想将我想要显示的每个页面放入名为 pages 的文件夹中 此外 我希望这些页面具有级联结构 假设我的文件夹具有以下结构 pages gt
  • 为什么标签的 href 属性会打印到屏幕上? [复制]

    这个问题在这里已经有答案了 可能的重复 显示带有蓝图的 URL 的超链接 https stackoverflow com questions 4258417 hyperlinks showing url with blueprint DOM
  • 扩展 umbraco 仪表板

    我想将我自己的部分添加到 umbraco 仪表板 以便我可以将我自己的管理部分集成到现有的登录 管理结构中 这是否可以在不编辑和重新编译 umbraco 源代码本身的情况下实现 推荐吗 如果是这样 有人有资源开始这样做吗 是的 这是可能的
  • Ios的Uiwebview可以打开.mht或者.mhtml文件吗

    是否有任何标准将 mht 文件转换为 html 所以我可以在 iosWebview 中打开它 我可以在 ios webview 中打开 mht 文件吗 是否有任何库或第三方工具可以执行相同的操作 None
  • 我无法使用 ChromeDriverManager().install() 安装 ChromeDriverManager

    我已经学习Python 2个月了 这个错误从来没有在我身上发生过一次 但突然我无法下载CHROMEDRIVERMANAGER 每当我进入其网站手动下载它时 它就会说 该 XML 文件似乎没有任何样式信息 文档树如下所示 错误 Access
  • 如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器?

    我从 Docker 开始 但我不知道如何配置 PyCharm 以使用位于容器中的 python 解释器 使用 Vagrant 设置很容易 https www jetbrains com pycharm quickstart configur
  • 为什么Graphics类中的drawPolygon方法是抽象的而我仍然可以使用它

    In 图形类 http download oracle com javase 1 4 2 docs api java awt Graphics html drawPolygon 28int 5B 5D 20int 5B 5D 20int 2
  • 奇怪的 PIL.Image.fromarray 行为,模式为 '1' 时 numpy 零和一

    对我来说应该有一些谜题 根据 PIL 文档 它具有不同的图像模式 如 1 L 8 RGB RGBA 等 但我对模式 1 感兴趣 1 位像素 黑白 每个像素存储一个像素 字节 我创建了 2 个大小为 100 x 100 的矩阵 第一个只有零
  • Golang:json.Unmarshal 未正确返回数据[重复]

    这个问题在这里已经有答案了 我有一个 json 文件 themes snow theme json Name snow Bgimage background jpg Width 600 Height 400 Itemrotation 20
  • PHP/PAM更改用户密码?

    是否有任何使用 PHP 更改 Linux 用户密码的工作包 我尝试过使用 PECL PAM 但在尝试更改密码时出现错误 Edit PHP代码 echo pam chpass username password new pass error