在/etc/shadow中更改Linux用户密码的CPP程序

unftdfkk  于 2023-06-21  发布在  Linux
关注(0)|答案(2)|浏览(179)

我想做一个程序,这样我就可以在linux中更改用户密码。我发现有putpwentputspent函数来自<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用户密码

wlp8pajw

wlp8pajw1#

试试这段代码;要使其工作,你必须输入一个合法的用户名.而在Linux系统中,需要权限才能更改密码。如果不小心使用,system()函数可能会带来安全风险。

#include <iostream>
#include <cstdlib>

int main() {
    std::string username;
    std::string password;

    std::cout << "Enter the username: ";
    std::cin >> username;
    std::cout << "Enter the new password: ";
    std::cin >> password;

    std::string command = "echo ";
    command += username + ":" + password + " | chpasswd";

    int result = system(command.c_str());

    if (result == 0) {
        std::cout << "Password change successful." << std::endl;
    } else {
        std::cout << "Password change failed." << std::endl;
    }

    return 0;
}
brgchamk

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。

相关问题