admin管理员组

文章数量:1542783

系统环境 :Ubuntu 20.04.1
使用环境: 比如公司发给用户的机器,不能给用户root密码,用户就修改不了IP,所以需要做一个程序能修改IP
euid概念 :当进程执行时,操作系统会对euid进行识别,以此判断用什么权限来执行这个进程。
1.确定要修改的网卡名(该图片是网上找的)

2.查看网卡配置文件: cat /etc/netplan/*.yaml 每台机器yaml文件名不一样,需要自己确定
配置静态IP要修改该文件的内容

network:
  version: 2
  renderer: NetworkManager
  ethernets:
    ens33:
      addresses:
        - 192.168.1.100/24
      gateway4: 192.168.1.1
      nameservers:
        addresses: [114.114.114.114]

3.代码编写(因公司上网要远程连接,无法复制到这里,纯手敲,可能编译出错,注意检查)
代码如下:

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
	/*由第一步得来*/
	char name[1024] = "ens33";
	/*由第二步得来*/
	char path[1024] = "cat /etc/netplan/my_yaml.yaml";
	char buf[4096]  = {0};
	int len = 0;
	int fd = -1;
	int uid = geteuid();
	
	/*以指定uid执行此程序*/
	setuid(uid);
	
	/*写入文件的内容,tip:如果复制使用,可能出错,自己膝盖注意缩进*/
	len = snprintf(buf, 4096, "network:\n        version: 2\n        renderer: NetworkManager\n        ethernets:\n                %s:\n                        addresses:\n                                - %s\n                        gateway4: %s\n                        nameservers:\n                                addresses: [114.114.114.114]\n", name, "192.168.1.200/24", "192.168.1.1");
	
	fp = open(path, 0_RDWR | O_CREAT | O_TRUNC, 0777);
	if(fp < 0)
	{
		printf("open error\n");
		return -1;
	}
	
	len = write(fd, buf, len);
	
	close(fd);
	
	system("netplan apply");
	
	printf("the euid is %d\n", uid);
}

4.在root权限下编写好且编译,

$gcc my_ifconfig.c -o my_ifconfig
$ls -l
-rwxr-xr-x 3 user group 102 Mar11 22:56 my_ifconfig

5.设置可执行程序my_ifconfig uid权限

$chmod 0755 my_ifconfig
最高位0就是setuid的位置, root用户  euid就是0
$chmod +s my_ifconfig
$ls -l
-rwsr-sr-x 3 user group 102 Mar11 22:56 my_ifconfig
可以发现文件的x位变成了s,说明设置成功

6.切换到普通用户,执行此程序

$su user
$./my_ifconfig  
若无报错则成功,再ifconfig确定IP是否更改

本文标签: 普通用户静态权限代码程序