是否有任何工作包可以使用 PHP 更改 linux 用户密码?
我试过使用 PECL:PAM,但在尝试更改密码时出现错误。
编辑:
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
其他:
很抱歉之前没有详细说明,我发问题的时候真的很累,但那仍然是一个蹩脚的借口。
最佳答案
经过几个小时的在线研究,我无法找到一个非常好的选择,所以我实现了这个 hack。它使用 this article用于使用 PHP 更改密码。
我也在使用 PECL:PAM package添加一点验证。
此页面位于安全的 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 中发布了这个问题/答案
关于PHP/PAM 更改用户密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3032785/
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO