如何使用 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,我还应该担心什么?
【问题讨论】:
您的意思是adduser
或useradd
?尝试查看他们的源代码。
为什么脚本比可执行文件更容易被利用?如果您有 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 用户?的主要内容,如果未能解决你的问题,请参考以下文章