我想做一个程序,这样我就可以在linux中更改用户密码。我发现有putpwent和putspent函数来自<pwd.h>和<shadow.h>
我想到了这个,但由于某种原因,它不起作用:
int main() {
string username = "user";
string password = "4321";
struct passwd *pw = getpwnam(username.c_str());
struct spwd *sp = getspnam(username.c_str());
if (pw == NULL || sp == NULL) {
cerr << "Failed to get user information." << endl;
return 1;
}
char *encrypted_password = crypt(password.c_str(), sp->sp_pwdp);
pw->pw_passwd = encrypted_password;
if (putpwent(pw, stdout) != 0) {
cerr << "Failed to update password." << endl;
return 1;
}
if (putspent(sp, stdout) != 0) {
cerr << "Failed to update shadow file." << endl;
return 1;
}
return 0;
}
代码的执行通过,但密码不改变。这是代码的输出
新密码:user:$6$jhci4oxH6C4h9off$AwzsRAjJUh21Sf2DY7ktY5KdNbYG3YhsdjTshU8FanJF/pfqRcq8jiR6Jvq/cbubiMbTO50HU7w79Tx2DQnwq/:1001:1001::/home/user:/bin/bash
旧密码(不会在/etc/shaddow中修改)user:$6$jhci4oxH6C4h9off$.SEwXqgYa1Un5t8rTdVCccicmk3sxLW5NPMqiSdBNcGBNX.pO404Cuic8Wdv7N4IhNVl3KmhtiKunUbjBQq3U0:19515:0:99999:7:::
有没有人有一些关于如何做到这一点的指导方针?
使用cpp程序更改linux用户密码
2条答案
按热度按时间wlp8pajw1#
试试这段代码;要使其工作,你必须输入一个合法的用户名.而在Linux系统中,需要权限才能更改密码。如果不小心使用,system()函数可能会带来安全风险。
brgchamk2#
一般来说,在Linux上,大多数失败的库调用(可能包括putpwent(3) ...)都是在失败时设置errno(3)。所以你需要
#include <errno.h>
,你可以使用perror(3)(需要<stdio.h>
)。密码文件的管理保留给根运行进程。一种可能性是进行适当的配置,然后使用sudo(8)实用程序。例如,通过
system(3)
显式使用/usr/bin/sudo
如果你想避免任何外部命令,你可能会在你的系统中打开一个安全漏洞。
sudo
实用程序正在使用(非常棘手的)setuid机制。如果你想复制它(非常小心,让一些人类LinuxMaven检查你的C++代码),你需要编写一个setuid可执行文件,并小心使用setuid(2)和seteuid(2)。这是棘手的所以花几天时间读几本关于它的书。
当然,您需要获得授权(由Linux系统的所有者或权威机构)才能这样做。
建议下载
sudo
的源代码,仔细研究一下。信任ELF可执行文件后,使用chmod(1)命令设置该可执行文件的uid。