首页 > 编程语言 >php: 在php中切换到指定的用户执行

php: 在php中切换到指定的用户执行

时间:2024-08-06 15:05:58浏览次数:5  
标签:uid 33 用户 指定 gid 切换 进程 php root

一,真实用户id和有效用户id的区别:

1,   真实用户 ID (RUID) 是启动进程的用户的 ID

2,有效用户 ID (EUID) 是当前执行进程的用户 ID

即:进程启动时的用户id是真实用户 ID (RUID),
      但实际执行时为了控制权限会切换为:有效用户 ID

二,代码:切换用户和组的有效id

<?php

        //查询得到目标用户的信息
    $user = 'www-data';
    $rowu = posix_getpwnam($user);
    $dest_uid = $rowu['uid'];
    $dest_gid = $rowu['gid'];
    echo $user."的uid:".$dest_uid.",gid:".$dest_gid.":\n";


      // 获取当前执行用户的用户ID
        $uid = posix_geteuid();
        // 获取当前执行用户的信息
        $user_info = posix_getpwuid($uid);
        $cur_uid = $user_info['uid'];
	     echo "当前进程有效用户:".$user_info['name']."的uid:".$cur_uid.":\n";


        $gid = posix_getegid();
        // 获取组信息
        $ginfo = posix_getgrgid($gid);
        echo "当前进程有效组:".$ginfo['name']."的gid:".$gid.":\n";

        $uid = posix_getuid();
        // 获取当前执行用户的信息
        $user_info = posix_getpwuid($uid);
        $cur_uid = $user_info['uid'];
	     echo "当前进程真实用户:".$user_info['name']."的uid:".$cur_uid.":\n";


        $gid = posix_getgid();
        // 获取组信息
        $ginfo = posix_getgrgid($gid);
        echo "当前进程真实组:".$ginfo['name']."的gid:".$gid.":\n";

        //注意:要先切换组再切换用户

        echo "开始切换\n";

        //切换组egid
    if (!posix_setegid($dest_gid)) {
           die('无法切换组');
	}



	// 切换用户euid
    if (!posix_seteuid($dest_uid)) {
           die('无法切换用户');
	}

	echo "切换完成\n";

	    //检查切换完成后是否成功:
        $uid = posix_geteuid();
        // 获取当前执行用户的信息
        $user_info = posix_getpwuid($uid);
        $cur_uid = $user_info['uid'];
	     echo "当前进程有效用户:".$user_info['name']."的uid:".$cur_uid.":\n";

        $gid = posix_getegid();
        // 获取组信息
        $ginfo = posix_getgrgid($gid);
        echo "当前进程有效组:".$ginfo['name']."的gid:".$gid.":\n";

        $uid = posix_getuid();
        // 获取当前执行用户的信息
        $user_info = posix_getpwuid($uid);
        $cur_uid = $user_info['uid'];
	     echo "当前进程真实用户:".$user_info['name']."的uid:".$cur_uid.":\n";


        $gid = posix_getgid();
        // 获取组信息
        $ginfo = posix_getgrgid($gid);
        echo "当前进程真实组:".$ginfo['name']."的gid:".$gid.":\n";

?>

运行结果:

root@lhdpc:~# /usr/local/soft/php8.3.9/bin/php /home/liuhongdi/work/whoami.php 
www-data的uid:33,gid:33:
当前进程有效用户:root的uid:0:
当前进程有效组:root的gid:0:
当前进程真实用户:root的uid:0:
当前进程真实组:root的gid:0:
开始切换
切换完成
当前进程有效用户:www-data的uid:33:
当前进程有效组:www-data的gid:33:
当前进程真实用户:root的uid:0:
当前进程真实组:root的gid:0:

说明:可以看到: posix_setegid/posix_seteuid  只改变有效用户和有效组,
而真实用户和真实组不受影响

三,代码:切换用户和组的真实id

代码:

<?php

        //查询得到目标用户的信息
    $user = 'www-data';
    $rowu = posix_getpwnam($user);
    $dest_uid = $rowu['uid'];
    $dest_gid = $rowu['gid'];
    echo $user."的uid:".$dest_uid.",gid:".$dest_gid.":\n";


      // 获取当前执行用户的用户ID
        $uid = posix_geteuid();
        // 获取当前执行用户的信息
        $user_info = posix_getpwuid($uid);
        $cur_uid = $user_info['uid'];
	     echo "当前进程有效用户:".$user_info['name']."的uid:".$cur_uid.":\n";


        $gid = posix_getegid();
        // 获取组信息
        $ginfo = posix_getgrgid($gid);
        echo "当前进程有效组:".$ginfo['name']."的gid:".$gid.":\n";

        $uid = posix_getuid();
        // 获取当前执行用户的信息
        $user_info = posix_getpwuid($uid);
        $cur_uid = $user_info['uid'];
	     echo "当前进程真实用户:".$user_info['name']."的uid:".$cur_uid.":\n";


        $gid = posix_getgid();
        // 获取组信息
        $ginfo = posix_getgrgid($gid);
        echo "当前进程真实组:".$ginfo['name']."的gid:".$gid.":\n";

        //注意:要先切换组再切换用户

        echo "开始切换\n";

        //切换组gid
    if (!posix_setgid($dest_gid)) {
           die('无法切换组');
	}



	// 切换用户uid
    if (!posix_setuid($dest_uid)) {
           die('无法切换用户');
	}

	echo "切换完成\n";

	    //检查切换完成后是否成功:
        $uid = posix_geteuid();
        // 获取当前执行用户的信息
        $user_info = posix_getpwuid($uid);
        $cur_uid = $user_info['uid'];
	     echo "当前进程有效用户:".$user_info['name']."的uid:".$cur_uid.":\n";

        $gid = posix_getegid();
        // 获取组信息
        $ginfo = posix_getgrgid($gid);
        echo "当前进程有效组:".$ginfo['name']."的gid:".$gid.":\n";

        $uid = posix_getuid();
        // 获取当前执行用户的信息
        $user_info = posix_getpwuid($uid);
        $cur_uid = $user_info['uid'];
	     echo "当前进程真实用户:".$user_info['name']."的uid:".$cur_uid.":\n";


        $gid = posix_getgid();
        // 获取组信息
        $ginfo = posix_getgrgid($gid);
        echo "当前进程真实组:".$ginfo['name']."的gid:".$gid.":\n";

?>

运行结果:

root@lhdpc:~# /usr/local/soft/php8.3.9/bin/php /home/liuhongdi/work/whoami.php 
www-data的uid:33,gid:33:
当前进程有效用户:root的uid:0:
当前进程有效组:root的gid:0:
当前进程真实用户:root的uid:0:
当前进程真实组:root的gid:0:
开始切换
切换完成
当前进程有效用户:www-data的uid:33:
当前进程有效组:www-data的gid:33:
当前进程真实用户:www-data的uid:33:
当前进程真实组:www-data的gid:33:

说明:可以看到: posix_setgid/posix_setuid  会改变真实用户和真实组,同时也会改变有效用户和有效组

 

标签:uid,33,用户,指定,gid,切换,进程,php,root
From: https://www.cnblogs.com/architectforest/p/18344944

相关文章

  • 安装seaborn':系统找不到指定的文件
    我当时正在做一个机器学习模型。一切都很好,但是当我尝试导入seaborn时,它说seaborn没有定义我使用的是python的虚拟环境。所以我激活了我的环境..env\Scripts\Activate.ps1然后我输入了pipinstallseaborn但随后它显示了这样的错误Fataler......
  • navicat [IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱
    1.情景展示使用navicat连接SQLServer数据库,报错信息如下:[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0)2.解决方案方案1找到Navicat的安装路径,然后找到sqlncli_x64.msi文件并安装,安装成功后重启Navicat重新进行连接,看是否成功。......
  • 计算机毕业设计必看必学!! 86393 基于微服务架构的餐饮系统的设计与实现,原创定制程序,
    摘   要近年来,我国经济和社会发展迅速,人们物质生活水平日渐提高,餐饮行业更是发展迅速,人们对于餐饮行业的认识和要求也越来越高。传统形式的餐饮行业都是以人为本,管理起来需要很多人力、物力、财力,既不方便管理者的管理,也不方便顾客实时了解餐厅动态,给传统餐......
  • .NET6 独立模式部署应用程序(无需客户机安装指定版本.NET运行时)
    下图对于.NET开发人员一定不陌生,尤其是CS架构,客户电脑要运行基于.NET开发的程序,无论是使用C#,还是VB.NET、F#,发布后的程序的运行环境都需要有相应版本的.NET的运行时,否则应用程序将无法正常运行。BS架构下,在服务器上安装指定版本.NET运行时,工作量可以忽略不计。试想,如果是CS架构......
  • PHP 无限级分类
    1)无限级分类处理<?php//准备分类原始数据$cate_arr=[['id'=>1,'name'=>'电脑','pid'=>0],['id'=>2,'name'=>'手机','pid'=>0],['id'=>3,'nam......
  • RSA非对称加密,前端JS加密,后端PHP解密
    RSA公钥/私钥在线生成:http://web.chacuo.net/netrsakeypair通过以上网址生成公钥/私钥对,私钥格式这里选择【PKCS#1】,如:公钥:-----BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN3El4yr2maFvDo5PKIzkkiitJZEOTLNINH0RD0PL5Lob+YzbRJO6DX27SRuHcdlK7mFtkQvooW......
  • js、php实现前后端数据的base64编码和解码
    客户要求密码必须加密后再传送。javascript代码的加密函数:<scriptlanguage='javascript'>functionutf16to8(str){varout,i,len,c;out="";len=str.length;for(i=0;i<len;i++){c=str.charCodeAt(i);if(......
  • PHP中的魔术常量(如__FILE__,__LINE__)及其用途
    在PHP中,魔术常量是一组预定义的常量,它们会根据它们使用的上下文环境而改变其值。这些常量以两个下划线字符开始和结束。魔术常量提供了有关代码执行环境的有用信息,例如当前文件的路径、当前行号等。以下是几个常用的PHP魔术常量及其用途:__FILE__:用途:__FILE__ 魔术常量返......
  • PHP中的引用传递和值传递的区别以及示例代码
    在PHP中,函数的参数传递主要有两种方式:值传递(PassbyValue)和引用传递(PassbyReference)。理解这两种传递方式对于编写高效、可维护的PHP代码至关重要。值传递(PassbyValue)值传递是PHP中的默认参数传递方式。当使用值传递时,函数内部对参数所做的任何修改都不会影响到函数外部......
  • PHP中如何实现函数的可变参数列表
    在PHP中,实现函数的可变参数列表主要有两种方式:使用func_get_args()函数和使用可变数量的参数(通过...操作符,自PHP5.6.0起引入)。1.使用func_get_args()函数func_get_args()函数用于获取传递给函数的参数列表,并作为一个数组返回。这种方式不需要在函数定义时明确指定参数的数......