如何使用 C/C++ 创建 linux 用户?

Posted

技术标签:

【中文标题】如何使用 C/C++ 创建 linux 用户?【英文标题】:How to create a linux user using C/C++? 【发布时间】:2010-08-10 22:49:00 【问题描述】:

我想构建一个程序,它以用户名作为参数并创建用户及其主文件夹(具有一些硬编码规范,如文件夹,以及用户名等安全检查不能是 root 或现有用户)。

我的应用程序需要创建用户才能授予 SSH 访问权限。

程序将使用 sudo 执行。我读过它应该用 C 或 C++ 而不是脚本编写,因为脚本很容易被利用。

您能否就如何实现这一目标给我一些建议或良好做法? 我应该使用一些 Pam 库吗?有例子吗? 可能存在哪些安全漏洞?

我知道 C/C++,并运行 Ubuntu Lucid。

编辑:

用户只有 sudo 权限才能运行该特定命令,我不希望它能够运行 shell 或绕过某些程序(例如,通过更改 PATH 环境)。

因此,例如,我需要覆盖 PATH我还应该担心什么?

【问题讨论】:

您的意思是adduseruseradd?尝试查看他们的源代码。 为什么脚本比可执行文件更容易被利用?如果您有 root 访问权限,那么您就有了 root 访问权限,并且它们是您无能为力的。使用简单的方法并使用使用普通 linux 命令的脚本(因此已经过完全测试)。 用户只有 sudo 访问权限才能运行该特定命令,我不希望它能够运行 shell 或绕过某些程序(例如,通过更改 PATH 环境)。 【参考方案1】:

您最好的选择可能是调用 useradd;它会做正确的事情(给定适当的参数)。

尝试通过调用适当的 API 手动创建一个是可能的,但不可取。

【讨论】:

这听起来对我来说更可取。将 Perl 脚本放在一起,然后调用 useradd 是 认为解决此问题的方法。 Linux C 库中没有“适当的 API”。【参考方案2】:

没有用于此的 API。您只需使用正常的文件访问系统调用写入/etc/passwd/etc/group(也可能是影子版本)。

【讨论】:

不要忘记,在修改这些值之前,您应该始终获得文件的排他锁(所有修改这些文件的系统命令都会这样做)。否则有可能文件损坏,然后你的状态就很糟糕了。 如果您的 /etc/passwd 为空白,我认为这是“唯一方法”,因此您无法使用 adduser 将用户添加到组中【参考方案3】:

其实有一种C API方法可以创建Linux用户。它在 pwd.h 包含文件中。

这里有一个示例测试:

#include <pwd.h>
#include <stdio.h>
#include <string.h>

static void createUser(char *userName, char *homeDir, int uid) 
    struct passwd * pwd = getpwent ();
    struct passwd pwd2;

    pwd =  getpwnam(userName);
    if (pwd != NULL) 
        return;
    
    pwd2.pw_dir = homeDir;
    pwd2.pw_gecos=userName;
    pwd2.pw_name=userName;
    pwd2.pw_gid=uid;
    pwd2.pw_uid=uid;
    pwd2.pw_shell=strdup("/bin/bash");
    FILE *f = fopen("/etc/passwd", "a");
    if (f != NULL) 
        putpwent(&pwd2, f);
        fclose(f);
    
    free (pwd2.pw_shell);


int main (int argc, char **argv) 
   createUser("test", "/home/test", 12345");
   return 0;

【讨论】:

以上是关于如何使用 C/C++ 创建 linux 用户?的主要内容,如果未能解决你的问题,请参考以下文章

gcc在Linux下如何运行一个C/C++程序

Linux下如何创建和监控子进程? [关闭]

如何在Linux下用C/C++语言操作数据库sqlite3

如何测量 Linux 和 Windows 中函数的“用户”执行时间

如何调试大型 Linux C/C++ 项目?

LINUX下,如何使用C/C++对EXCEL进行读写!