Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将根euid从c++; 我在嵌入式Linux系统上运行了一个C++程序。_C++_Shell_Privileges - Fatal编程技术网

如何将根euid从c++; 我在嵌入式Linux系统上运行了一个C++程序。

如何将根euid从c++; 我在嵌入式Linux系统上运行了一个C++程序。,c++,shell,privileges,C++,Shell,Privileges,该程序由用户“myuser”启动,并使用“uid”管理权限 ls -l /bin/myprog -rwsr-sr-x 1 root root 757328 May 7 12:55 myprog 我已经编写了一个小类来处理ID。它在程序启动时读取所有ID,并根据需要的权限提升在运行时更改euid和egid /************************************************************* * HEADER FILE

该程序由用户“myuser”启动,并使用“uid”管理权限

ls -l /bin/myprog
-rwsr-sr-x    1 root     root        757328 May  7 12:55 myprog
我已经编写了一个小类来处理ID。它在程序启动时读取所有ID,并根据需要的权限提升在运行时更改euid和egid

/*************************************************************
 *   HEADER FILE
 *************************************************************/

#ifndef _PRIVILEGE_H
#define _PRIVILEGE_H

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


class CPrivilege
{
    private:

        uid_t _ruid; 
        uid_t _euid; 
        uid_t _suid; 
        gid_t _rgid; 
        gid_t _egid; 
        gid_t _sgid;

        int _status;

        int getPrivilege(uid_t&,uid_t&,uid_t&,gid_t&,gid_t&,gid_t&);

    public :

        CPrivilege();

        int elevate();
        int down();
        int print();
        int status();
};

#endif



/*************************************************************
 *   CPP FILE
 *************************************************************/
#include "_privilege.h"

CPrivilege::CPrivilege()
{
    _status = getPrivilege(_ruid,_euid,_suid,_rgid,_egid,_sgid);
}

int CPrivilege::status()
{
    return _status;
}

int CPrivilege::getPrivilege(uid_t& ruid, uid_t& euid, uid_t& suid, gid_t& rgid, gid_t& egid, gid_t& sgid)
{
    if (getresuid(&ruid, &euid, &suid) == -1) {
        printf("getresuid error\n");
        return EXIT_FAILURE;
    }
    if (getresgid(&rgid, &egid, &sgid) == -1) {
        printf("getresgid error\n");
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

int CPrivilege::elevate()
{
    /* Switch to target user. effective uid gets the saved uid. */
    if (seteuid((uid_t)_suid) == -1) {
        printf("seteuid error\n");
        return (_status = EXIT_FAILURE);
    }

    /* Switch to target group. effective gid gets the saved gid. */
    if (setegid((gid_t)_sgid) == -1) {
        printf("setegid error\n");
        return (_status = EXIT_FAILURE);
    }

    return (_status = EXIT_SUCCESS);
}

int CPrivilege::down()
{
    /* Switch to target user. effective uid gets the real uid. */
    if (seteuid((uid_t)_ruid) == -1) {
        printf("seteuid error\n");
        return (_status = EXIT_FAILURE);
    }

    /* Switch to target group. effective gid gets the real gid. */
    if (setegid((gid_t)_rgid) == -1) {
        printf("setegid error\n");
        return (_status = EXIT_FAILURE);
    }

    return (_status = EXIT_SUCCESS);
}

int CPrivilege::print()
{
    uid_t ruid; 
    uid_t euid; 
    uid_t suid; 
    gid_t rgid; 
    gid_t egid; 
    gid_t sgid;

    printf("status = %d\n", _status);  

    getPrivilege(ruid,euid,suid,rgid,egid,sgid);    
    printf("ruid = %d, euid = %d, suid = %d\n", ruid, euid, suid);  
    printf("rgid = %d, egid = %d, sgid = %d\n", rgid, egid, sgid);  
}
当我使用myuser启动程序时,我可以打开脚本文件,即使它位于文件夹“/root”中。但我无法启动脚本,我得到了“权限被拒绝”的回答:

我应该如何使用root权限调用脚本

来自Bash手册:

如果外壳启动时有效用户(组)id不等于 实际用户(组)id,并且未提供-p选项,[…] 并且有效用户id设置为实际用户id。如果-p选项 在调用时提供,启动行为相同,但 未重置有效用户id

请参阅(抱歉,非官方链接)

我认为您需要更改uid和有效uid,或者将命令从bash手册更改为
bash-p/root/test\u script

如果外壳启动时有效用户(组)id不等于 实际用户(组)id,并且未提供-p选项,[…] 并且有效用户id设置为实际用户id。如果-p选项 在调用时提供,启动行为相同,但 未重置有效用户id

请参阅(抱歉,非官方链接)


我认为您需要更改uid以及有效的uid,或者将命令更改为
bash-p/root/test\u script

thks以实现您的提议。p选项不起作用,setuid选项让我陷入了死锁,应用程序始终具有root providege或获得用户权限,而不可能再次获得root priv。。。我最终在一开始就使用了我的应用程序,并在一个进程中使用root权限,在第二个进程中使用用户权限。p选项不起作用,setuid选项让我陷入了死锁,应用程序始终具有root providege或获得用户权限,而不可能再次获得root priv。。。我最终在一开始就使用了我的应用,在一个进程中使用root权限,在第二个进程中使用用户权限
/*************************************************************
 *   MAIN FILE
 *************************************************************/
#include "_privilege.h"

#include <string>

int main(int argc, char *argv[])
{
    CPrivilege priv;

    priv.down();   
    priv.print();

    // [...) Program stuff with user privilege

    std::string system_cmd; 
    int ret;

    system_cmd = "/root/test_script";

    priv.elevate();      
    priv.print();  

    FILE *pf;
    pf = fopen(system_cmd.c_str(),"r");
    if (pf != NULL)
    {
        printf("Root privilege\n\n");
        fclose(pf);
    }
    else
        printf("User privilege\n\n");

    system(system_cmd.c_str());   

    priv.down();   
    priv.print(); 

    // [...) Other Program stuff with user privilege

    return 0;
}

/*************************************************************
 *   SHELL FILE
 *************************************************************/
#!/bin/sh
echo 'HELLO WORLD !'
status = 0
ruid = 0, euid = 0, suid = 0
rgid = 0, egid = 0, sgid = 0
status = 0
ruid = 0, euid = 0, suid = 0
rgid = 0, egid = 0, sgid = 0
Root privilege

HELLO WORLD !
status = 0
ruid = 0, euid = 0, suid = 0
rgid = 0, egid = 0, sgid = 0
status = 0
ruid = 1009, euid = 1009, suid = 0
rgid = 1013, egid = 1013, sgid = 0
status = 0
ruid = 1009, euid = 0, suid = 0
rgid = 1013, egid = 0, sgid = 0
Root privilege

sh: /root/test_script: Permission denied
status = 0
ruid = 1009, euid = 1009, suid = 0
rgid = 1013, egid = 1013, sgid = 0