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

一,真实用户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  会改变真实用户和真实组,同时也会改变有效用户和有效组

 

posted @ 2024-08-06 15:05  刘宏缔的架构森林  阅读(45)  评论(0编辑  收藏  举报