linux用户和组

原文地址http://daileinote.com/computer/linux_sys/06

linux上每个用户都拥有一个唯一的用户名和一个相对应的用户id(uid),用户可以隶属于一个或多个组。每个组也拥有一个唯一的组名和组id(gid)。用户和组主要是用来控制资源访问权限的。

记录用户相关信息的文件:/etc/passwd

每个用户都会在此文件里有一条记录,每条记录包含7个字段。

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

登录名,密码占位符(通常为x,密码加密后实际存在/etc/shadow文件里),uid,gid,注释,登录后的主目录,登录的shell(登录后便交由这个程序控制/sbin/nologin代表此账号不能登录)

在密码文件中,允许(但不常见)同一用户id拥有多条记录,从而使得同一用户id可以有多个登录名。

记录密码文件/etc/shadow

记录组信息的文件:/etc/group

root:x:0:
bin:x:1:

组名,组密码占位符(一般为x),组id,组下的用户列表。

假设u_1,u_2都属于root组,那么上面这条记录应该是这个样子

root:x:0:u_1,u_2

 

获取相关用户信息

从/etc/passwd获取信息
#include <pwd.h>

struct passwd
{
  char *pw_name;		/* Username.  */
  char *pw_passwd;		/* Password.  */
  uid_t pw_uid;		        /* User ID.  */
  gid_t pw_gid;		        /* Group ID.  */
  char *pw_gecos;		/* Real name.  */
  char *pw_dir;			/* Home directory.  */
  char *pw_shell;		/* Shell program.  */
};

struct passwd *getpwnam(const char *name);
struct passwd *getpwuid(uid_t uid);
/*
成功返回struct passwd指针,返回NULL代表错误或找不到
*/
getpwnam()根据用户名获取而getpwuid根据uid获取信息,返回的指针指向静态分配的内存,任何一次调用都会覆盖之前的内容。
#include <stdio.h>
#include <pwd.h>
#include <errno.h>


int main(int argc, char **argv){
    struct passwd *pwd;
    errno = 0;
    pwd = getpwnam("root");
    if(pwd == NULL){
        if(errno == 0)
            printf("not found\n");
        else
            printf("error\n");
        return 1;
    }
    
    printf("name: %s\n", pwd->pw_name);
}

 

从/etc/group获取信息

#include <grp.h>

struct group{
    char *gr_name;		/* Group name.	*/
    char *gr_passwd;		/* Password.	*/
    gid_t gr_gid;		/* Group ID.	*/
    char **gr_mem;		/* Member list.	*/
};

struct group *getgrnam(const char *name);
struct group *getgrgid(gid_t gid);
//失败返回NULL
用法行为跟上两个函数相同。

 

从/etc/shadow文件获取信息

#include <shadow.h>

struct spwd{
    char *sp_namp;		/* Login name.  */
    char *sp_pwdp;		/* Encrypted password.  */
    long int sp_lstchg;		/* Date of last change.  */
    long int sp_min;		/* Minimum number of days between changes.  */
    long int sp_max;		/* Maximum number of days between changes.  */
    long int sp_warn;		/* Number of days to warn user to change
				   the password.  */
    long int sp_inact;		/* Number of days the account may be
				   inactive.  */
    long int sp_expire;		/* Number of days since 1970-01-01 until
				   account expires.  */
    unsigned long int sp_flag;	/* Reserved.  */
  };

struct spwd *getspnam(const char *name);

 

逐行读取/etc/passwd和/etc/group和/etc/shadow文件

#include <pwd.h>

struct passwd *getpwent(void);  //会打开/etc/passwd文件

void setpwent(void);    //光标移动到文件开始处
void endpwent(void);    //关闭/etc/passwd文件


#include <grp.h>

struct group *getgrent(void);  //会打开/etc/group文件
void setgrent(void);    //光标移动到文件开始处
void endgrent(void);    //会关闭/etc/group文件

#include <shadow.h>

struct spwd *getspent(void);
void setspent(void);
void endspent(void);
#include <stdio.h>
#include <pwd.h>
#include <errno.h>

int main(int argc, char **argv){
    struct passwd *pwd;
    while((pwd = getpwent()) != NULL)
        printf("%-8s %5d\n", pwd->pw_name, pwd->pw_uid);
    
}
/*
root         0
bin          1
daemon       2
adm          3
lp           4
sync         5
shutdown     6
...
*/

 

校验用户密码

#define _XOPEN_SOURCE
#include <unistd.h>

char *crypt(const char *key, const char *salt);
/etc/shadow的密码是用过单项加密的,所以验证密码的唯一方法是使用同一算法对用户提供的明文密码进行加密,然后跟/etc/shadow中的密码进行匹配。salt参数指向一个2字符的字符串用来改变des算法,为了让密码更难以破解。
由crypt()所返回的经过加密的密码中,头2个字符是对原始salt值得拷贝,也就是说加密密码时,salt参数可以从/etc/shadow内获得。
编译程序需要带上-lcrypt选项

 

#define _BSD_SOURCE     /* Get getpass() declaration from <unistd.h> */
#define _XOPEN_SOURCE   /* Get crypt() declaration from <unistd.h> */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <unistd.h>
#include <limits.h>
#include <pwd.h>
#include <shadow.h>

typedef unsigned char u_char;

int main(int argc, char *argv[]){
    char *username, *password, *encrypted, *p;
    struct passwd *pwd;
    struct spwd *spwd;
    u_char authOk;
    size_t len;
    long lnmax;

    lnmax = sysconf(_SC_LOGIN_NAME_MAX);
    if (lnmax == -1)                    /* If limit is indeterminate */
        lnmax = 256;                    /* make a guess */

    username = malloc(lnmax);
    if (username == NULL)
        return 1;

    
    printf("Username: ");
    fflush(stdout);
    if (fgets(username, lnmax, stdin) == NULL)
        return 1;            /* Exit on EOF */

    len = strlen(username);
    if (username[len - 1] == '\n'){
        username[len - 1] = '\0';
    }else{
        username[len] = '\0';
    }
    
    //获取/etc/passwd记录
    pwd = getpwnam(username);
    if (pwd == NULL){
        printf("couldn't get password record\n");
        return 1;
    }
    
    //获取/etc/shadow记录
    spwd = getspnam(username);
    if (spwd == NULL && errno == EACCES){
        printf("no permission to read shadow password file\n");
        return 1;
    }

    if (spwd != NULL)           /* If there is a shadow password record */
        pwd->pw_passwd = spwd->sp_pwdp;     /* Use the shadow password */

    password = getpass("Password: ");

    encrypted = crypt(password, pwd->pw_passwd);
    for (p = password; *p != '\0'; )
        *p++ = '\0';

    if (encrypted == NULL)
        return 1;

    authOk = strcmp(encrypted, pwd->pw_passwd) == 0;
    if (!authOk) {
        printf("Incorrect password\n");
        return 1;
    }

    printf("Successfully authenticated: UID=%ld\n", (long) pwd->pw_uid);


    return 0;
}

//gcc main.c -lcrypt

 

总结

本文对linux用户和组以及相关的做了简单的介绍,如果有疑问可以给我留言。

 

原文地址http://daileinote.com/computer/linux_sys/06

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux用户管理是指在Linux系统中对用户进行管理和配置的过程。通过用户管理,可以实现对系统资源的访问控制和权限管理,保障系统的安全性和稳定性。 在Linux系统中,每个用户都有一个唯一用户名用户ID(UID),用于标识该用户在系统中的身份。同时,每个用户还可以属于一个或多个用户用户也有唯一名和ID(GID),用于管理用户的权限和资源访问。 Linux用户管理主要包括以下内容: 1. 用户管理:包括创建、修改、删除用户账号,设置用户密码和权限等。 2. 管理:包括创建、修改、删除用户,将用户添加到中,设置权限等。 3. 权限管理:包括设置文件和目录的访问权限,控制用户对系统资源的访问权限等。 4. 账号锁定和解锁:可以通过锁定用户账号来保护系统的安全性,防止非法访问和攻击。 总之,Linux用户管理是Linux系统中非常重要的一部分,对于系统的安全性和稳定性起着至关重要的作用。 ### 回答2: Linux是一个开源的操作系统,它允许用户自由配置和管理系统各个方面。其中,用户Linux系统中的两个非常重要的概念,对于安全性和权限控制有着至关重要的作用。 在Linux系统中,每个用户都有一个唯一用户名和UID(User ID),同时还可以属于一个或多个用户用户是一拥有某些共同权限的用户的集合。在Linux中,可以通过一些命令来管理用户用户,如useradd、userdel、groupadd、groupdel等命令。 用户管理是指Linux系统管理员通过控制用户的权限和访问权限来保护系统安全。在Linux系统中创建一个新用户可以使用useradd命令,通过指定用户名、密码、UID等参数完成用户创建。除了创建用户还可以修改用户信息、查看用户信息等操作。可以使用usermod命令来修改用户信息,比如修改用户名、密码等。可以使用userdel命令来删除用户管理是指Linux系统管理员通过创建用户以简化用户管理和控制访问权限。在Linux系统中可以通过groupadd命令创建一个新用户,然后在创建新用户时,可以指定用户属于哪个用户。可以通过gpasswd命令来修改用户的密码、添加或删除用户成员等。用户的权限也可以通过chmod命令来设置。 在实际使用中,Linux用户管理可以帮助管理员完成对系统的安全性和文件权限的控制,从而保护系统的完整性和保密性。同时对用户权限进行合理划分,能够有效防范内部攻击和恶意操作。总之,合理的用户管理是保证Linux系统安全性和完整性的关键所在。 ### 回答3: Linux操作系统作为开源操作系统的代表,它采用了强大的用户管理机制来维护系统的安全性和灵活性。 在Linux中,每个用户都具有唯一的标识符和权限,这样可以控制每个用户可以访问什么和拥有哪些权限。以下是关于Linux用户管理的更详细说明。 1. 用户管理 Linux操作系统通过创建用户来分配系统资源和限制用户访问的权限。在Linux中,用户是登录到系统的实体,每个用户都拥有独立的家目录和特定的登录名。 Linux系统中包含两种类型的用户: - 一般用户:这些用户拥有系统的普通权限。 - 系统用户:这些帐户是Linux中用于运行系统程序和服务的帐户。 在Linux中创建新用户的命令是“useradd”,创建新用户的同时可以指定该用户的家目录、密码、等信息。在创建用户后,可以使用命令“passwd”来设置用户的密码。可以使用命令“usermod”来修改用户信息,例如可以修改用户的密码、家目录、等信息。要删除用户,可以使用“userdel”命令。 2. 管理 Linux中的一个概念,每个用户都必须属于一个或多个。操作系统将所有信息存储在“/etc/group”文件中。Linux系统中有两种类型的: - 一般:这些用于用户并控制访问权限。 - 系统:这些用于管理系统服务和进程。 在Linux中创建新的命令是“groupadd”,创建新的同时可以指定该的GID和其他信息。在创建后,可以使用命令“groupmod”来修改的信息,例如可以修改的名称或GID。要删除,可以使用“groupdel”命令。通过将用户加入中,可以控制用户对文件和目录的访问权限。这种访问权限在Linux文件系统中称为“文件访问控制列表”(ACL)。 总之,Linux用户管理机制是系统的关键部分,能够提供安全和灵活性。正确管理用户可以帮助管理员保护系统安全,并允许用户获得所需的访问权限。掌握Linux用户管理的技能,将有助于管理员更好地管理和维护Linux系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值