📜  在 C 中模仿 Linux adduser 命令(1)

📅  最后修改于: 2023-12-03 15:37:18.348000             🧑  作者: Mango

在 C 中模仿 Linux adduser 命令

简介

Linux 中有一个 adduser 命令,可以用于添加用户。在 C 语言中,我们也可以写一个类似的程序。本文将介绍如何在 C 中模仿 Linux adduser 命令。

程序功能

本程序将实现以下功能:

  • 添加用户
  • 设置用户名和用户 ID
  • 设置用户组和用户组 ID
  • 设置用户主目录和登录 shell
代码实现

以下是代码实现的关键部分。

添加用户

使用系统调用函数 adduser 添加用户。需要注意的是,在 Linux 中,添加用户需要 root 权限,因此我们需要使用 setuid 函数将程序的 UID 设置为 0。

// 添加用户
int ret = setuid(0);
if (ret == -1) {
    perror("setuid");
    exit(1);
}
system("adduser");
设置用户名和用户 ID

使用命令行参数传入用户名和用户 ID,并使用系统调用函数 useradd 设置用户名和用户 ID。

// 设置用户名和用户 ID
char cmd[1024];
sprintf(cmd, "useradd -u %d %s", uid, username);
system(cmd);
设置用户组和用户组 ID

同样使用命令行参数传入用户组名和用户组 ID,并使用系统调用函数 useradd 设置用户组和用户组 ID。

// 设置用户组和用户组 ID
char cmd[1024];
sprintf(cmd, "useradd -g %d %s", gid, username);
system(cmd);
设置用户主目录和登录 shell

使用命令行参数传入用户主目录和登录 shell,并使用系统调用函数 useradd 设置用户主目录和登录 shell。

// 设置用户主目录和登录 shell
char cmd[1024];
sprintf(cmd, "useradd -d %s -s %s %s", home_dir, shell, username);
system(cmd);
完整代码

以下是完整的代码。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv) {
    char *username;
    int uid, gid;
    char *home_dir, *shell;

    if (argc != 6) {
        printf("Usage: adduser <username> <uid> <gid> <home_dir> <login_shell>\n");
        exit(1);
    }

    username = argv[1];
    uid = atoi(argv[2]);
    gid = atoi(argv[3]);
    home_dir = argv[4];
    shell = argv[5];

    // 添加用户
    int ret = setuid(0);
    if (ret == -1) {
        perror("setuid");
        exit(1);
    }
    system("adduser");

    // 设置用户名和用户 ID
    char cmd[1024];
    sprintf(cmd, "useradd -u %d %s", uid, username);
    system(cmd);

    // 设置用户组和用户组 ID
    sprintf(cmd, "useradd -g %d %s", gid, username);
    system(cmd);

    // 设置用户主目录和登录 shell
    sprintf(cmd, "useradd -d %s -s %s %s", home_dir, shell, username);
    system(cmd);

    return 0;
}
总结

本文介绍了如何在 C 语言中模仿 Linux adduser 命令,实现了添加用户、设置用户名和用户 ID、设置用户组和用户组 ID、设置用户主目录和登录 shell 等功能。代码可以根据需求进行修改,达到更加灵活的使用效果。