更改用户ID和组ID

1.问题的引入

普通用户是无法查看/etc/shadow文件的,但是当普通用户使用命令passwd去修改自己的口令的时候,确实可以成功的。修改口令一定会改变/etc/shadow文件,那么是如何做到的呢?

2.查看passwd

在这里插入图片描述
注意在用户属性上面有一个S , 那就是set uid
是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限
SUID仅 可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件拥有者的权限,因此,它仅可用于二进制文件,不能用在批处理文件(shell脚本)上。这是因为 shell脚本只是将很多二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看shell脚本调用进来的程序设置,而不是shell脚本本 身。当然,SUID对目录是无效的。这点要特别注意

3.G+S

Set GID

进一步而言,如果s的权限是在用户组,那么就是Set GID,简称为SGID.SGID可以用在两个方面。

文件:如果SGID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用户组(effective group)将会变成该程序的用户组所有者(group id)。

目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A目录的用户组。

一般来说,SGID多用在特定的多人团队的项目开发上,在系统中用得较少

4.一个用户的ID分为

①实际用户ID
②有效用户ID
③保存的设置用户ID
只有超级用户才能改变实际用户的ID,当我们在登录的时候,login进程就是一个超级用户进程,它接受你输入的用户名和密码,当你输入校验完成后,他fork出一个shell,并且将当前的所有用户ID全部设置为你输入的用户
若不是超级用户,只能将有效用户ID设置为UID不更改其他两个ID

5.四个函数

SYNOPSIS
 #include <unistd.h>
 #include <sys/types.h>

 uid_t getuid(void);
 uid_t geteuid(void);

DESCRIPTION
 getuid() returns the real user ID of the calling process.

 geteuid() returns the effective user ID of the calling process.





SYNOPSIS
  #include <unistd.h>
  #include <sys/types.h>

  gid_t getgid(void);
  gid_t getegid(void);

DESCRIPTION
  getgid() returns the real group ID of the calling process.
  getegid() returns the effective group ID of the calling process.




SYNOPSIS
  #include <sys/types.h>
  #include <unistd.h>

   //交换Real uid和 Effective uid
  int setreuid(uid_t ruid, uid_t euid);
  int setregid(gid_t rgid, gid_t egid);

setreuid() sets real and effective user IDs of the calling process.

6.setuid

SYNOPSIS
#include <sys/types.h>
#include <unistd.h>

int setuid(uid_t uid);

DESCRIPTION
setuid()  sets the effective user ID of the calling process.  
If the effective UID of the caller is root, 
the real UID and saved set-user-ID are also set.

7.一个demo

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




int main(int argc, char**argv)
{
        pid_t pid;

        if(argc < 3)
        {
                fprintf(stderr, "No Enough argc\n");
                exit(1);
        } 

        pid = fork();
        if(pid < 0)
        {
                perror("fork()");
                exit(1);
        }

        if(0 == pid)
        {
                setuid(atoi(argv[1]));
                execvp(argv[2], argv+2);
                perror("execvp()");
                exit(1);
        }

        wait(NULL);


        return 0;
}

注意这个必须是一个具有s属性的文件

### 修改用户组ID的方法或命令 在Linux系统中,修改用户组ID(GID)可以通过`groupmod`命令实现。以下是详细的说明示例: #### 使用 `groupmod` 命令 `groupmod` 是专门用于修改现有用户组属性的命令,其中包括修改用户组ID。其基本语法如下: ```bash groupmod [选项] 名 ``` 其中常用的选项为 `-g`,用于指定新的ID。 例如,将名为 `testgroup1` 的用户组的GID从原来的值修改为 `5000`,可以使用以下命令: ```bash groupmod -g 5000 testgroup1 ``` 需要注意的是,在修改用户组ID时,必须确保新的GID未被其他占用,否则可能会导致冲突或数据访问问题[^2]。 #### 检查用户组ID是否已被占用 在执行上述命令之前,建议检查目标GID是否已被占用。可以使用以下命令查看系统中所有及其对应的GID: ```bash cat /etc/group ``` 该命令会输出 `/etc/group` 文件的内容,文件中的每一行代表一个,格式为: ``` 名:密码:GID:用户列表 ``` 通过检查此文件,可以确认目标GID是否可用[^3]。 #### 注意事项 1. **文件权限问题**:修改用户组ID后,可能需要手动更新与该相关的文件目录的属信息。可以使用以下命令递归地更改文件目录的属: ```bash find /path/to/directory -group 旧GID -exec chgrp 新GID {} \; ``` 这样可以确保所有原本属于旧GID的文件目录正确关联到新GID[^4]。 2. **避免冲突**:如果新GID与系统中其他的GID相同,可能会导致不可预测的行为,因此务必选择一个唯一的GID。 3. **权限要求**:`groupmod` 命令需要超级用户权限(即root权限),因此通常需要以 `sudo` 方式运行。 ### 示例代码 以下是一个完整的示例,展示如何安全地修改用户组ID并更新相关文件的属: ```bash # 修改用户组testgroup1的GID为5000 sudo groupmod -g 5000 testgroup1 # 检查是否存在与旧GID关联的文件,并更新其属 find / -group 旧GID -exec chgrp 5000 {} \; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值