Linux下su命令的实现

本文深入解析了Linux系统中su命令的工作原理,通过源代码详细介绍了如何实现从当前用户切换到指定用户的过程,包括用户身份验证、环境变量设置及执行目标用户的shell等关键步骤。
Linux中的用户切换su.
将su可执行文件所属者设置为root的,则执行su时候则拥有了root的权限
切换到root用户下,chown root su 和chmod u+s su来改变su文件的权限
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <pwd.h>
#include <stdlib.h>
#include <assert.h>
#include <shadow.h>
#include <sys/types.h>
#include <termios.h>
int main(int argc, char *argv[])
{
	char *s = "root";
	if (argc == 2)
	{
		s = argv[1];
	}//取su的第二个参数
    
	struct passwd *p = getpwnam(s);//通过次函数来看第二个参数是否存在
	if (p == NULL)
	{
       		perror("username error");
   	}
    
    struct spwd *sp = getspnam(s);
   	if(sp == NULL)
   	{
      	perror("userpasswd error");
       	exit(0);
   	}
    printf("input passwd:");
    fflush(stdout);
	
	struct termios saveold, newreset;
	tcgetattr(fileno(stdin), &saveold);
	newreset = saveold;//保存旧的设置
	newreset.c_lflag &= ~ECHO;
    char buff[128] = {0};//获取键盘输入密码
	if (tcsetattr(fileno(stdin), TCSAFLUSH, &newreset) != 0)//消隐设置
	{
		perror("wrong happened\n");
	}
	else
	{
    		fgets(buff,128,stdin);
    		buff[strlen(buff)-1] = 0;
		    tcsetattr(fileno(stdin), TCSANOW, &saveold);//恢复原设置
	}
    char lt[128] = {0};
    int i = 0;
    int num = 0;
    for(;i<strlen(sp->sp_pwdp);i++)//获取加密密钥
    {
    	if(sp->sp_pwdp[i] == '$')
        {
           	num += 1;
           	if(num == 3)
            {
           		break;
           	}
        }	
		lt[i] = sp->sp_pwdp[i];
    }

    char *pw = crypt(buff,lt);//密钥和明文进行加密生成密文
   	if(strcmp(pw,sp->sp_pwdp) != 0)//系统的和生成密文进行比较
   	{
      	printf("failed\n");
	    exit(0);
    }
    printf("success\n");
       
    pid_t pid = fork();//产生新进程为用户的bash
    assert(pid != -1);
     
    if (pid == 0)
    {
      	setuid(p->pw_uid);//将现在的root权限修改为切入用户的uid
       	setenv("HOME",p->pw_dir,1);//设置当前环境变量
       	execl(p->pw_shell,p->pw_shell,(char *)0);//进入用户默认bash
		perror("exec error");//出错则发出信息,并且终止
       	exit(0);
    }
    wait(NULL); //子进程的结束发出SIGCHLD信号清理子进程
}    

### Linuxsu命令的使用说明及常见问题 #### 1. su命令的基本功能 在Linux系统中,`su`(Switch User)命令用于切换用户身份。通过该命令,当前登录用户可以切换到其他用户账号,临时获取该用户的权限和环境[^2]。 #### 2. 常见选项及用法 以下是`su`命令的一些常用选项及其功能: - **无参数**:默认切换到超级用户(root)。例如: ```bash su ``` 输入root密码后,即可切换到root用户[^5]。 - **指定用户名**:切换到指定用户。例如: ```bash su liumiao ``` 输入目标用户的密码后,即可切换到该用户[^5]。 - **`-`或`--login`**:模拟完整登录过程,包括加载目标用户的环境变量。例如: ```bash su - liumiao ``` 或者: ```bash su --login liumiao ``` 这种方式会更改工作目录为指定用户的主目录,并加载其shell配置文件[^4]。 - **`-c`或`--command`**:以指定用户身份执行单个命令。例如: ```bash su -c "ls /root" liumiao ``` 该命令将以`liumiao`用户身份列出`/root`目录的内容[^4]。 - **`-s`或`--shell`**:指定使用的shell环境。例如: ```bash su -s /bin/bash liumiao ``` 强制使用`/bin/bash`作为目标用户的shell环境。 - **`-p`或`--preserve-environment`**:保留当前用户的环境变量。例如: ```bash su -p liumiao ``` 切换到`liumiao`用户时,不会覆盖现有的环境变量。 #### 3. susudo的区别 虽然`su`和`sudo`都可以实现提升权限或切换用户的功能,但它们存在以下主要区别: - `su`需要知道目标用户的密码,而`sudo`允许普通用户执行特定命令,无需知道root密码[^3]。 - `sudo`可以通过配置文件`/etc/sudoers`进行细粒度授权,限制某些用户只能执行特定命令[^3]。 #### 4. 安全性注意事项 使用`su`命令时需要注意以下几点: - 避免直接切换到root用户进行日常操作,以免误操作导致系统损坏。 - 确保目标用户的密码安全,防止未经授权的访问[^5]。 - 在脚本中尽量避免硬编码密码,推荐使用`sudo`或其他安全机制[^3]。 ```bash # 示例:切换到root用户并执行多个命令 su # 执行多个root权限命令 ``` ```bash # 示例:使用sudo执行单个命令 sudo apt update ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值