系统环境 :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是否更改