当前位置:  技术问答>linux和unix

正在运行的进程切换自己的属主失败

    来源: 互联网  发布时间:2017-02-20

    本文导语:  例如:一个进程启动时是使用用户A启动的,这个进程运行期间,能否将自己切换成用户B么?   使用setuid尝试,发现总是失败,测试使用文件权限如下设置: -rwxr-xr-x   1 nmsuser  root       10300 Apr 26 15:32 a.out ...

例如:一个进程启动时是使用用户A启动的,这个进程运行期间,能否将自己切换成用户B么?
 
使用setuid尝试,发现总是失败,测试使用文件权限如下设置:
-rwxr-xr-x   1 nmsuser  root       10300 Apr 26 15:32 a.out
-rwx------   1 ftpuser  root          12 Apr 26 11:13 testfile.txt
 
测试代码如下,使用nmsuser登录系统执行a.out:
int main(int argc, void** argv)
{
struct passwd *pw;
    uid_t    uid;
 
    pw = getpwnam("ftpuser");
    printf("nnn");
    printf("getpwnam(ftpuser):n");
    printf("name = %snuid = %dngid = %dnhome = %snshell = %sn",
            pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);
 
    int err = setuid(pw->pw_uid);
    printf("new UID: %dn", getuid());
    printf("errcode: %dn", err);
    printf("errno: %dn", errno);
    
    char errmsg[1024] = {0};
    perror(errmsg);
    printf("%sn", errmsg);
 
    FILE* pFile = fopen("testfile.txt", "r");
    if (NULL == pFile)
    {
    printf("Open File Fail!n");
    return 0;
    }
 
    char buf[1024] = {0};
    int bytes_read = fread(buf, sizeof(buf), 12, pFile);
    printf("%sn", buf);
    return 0;
}
 
输出错误结果如下:
getpwnam(ftpuser):
name = ftpuser
uid = 110
gid = 0
home = /opt/backup/ftpboot
shell = /bin/bash
new UID: 111
errcode: -1
errno: 1
Not owner
 
Open File Fail!

|

chown nmsuser:users a.out
chown ftpuser:users testfile.txt
使用setreuid没问题,
setuid的man手册中指名了If the effective UID of the caller is root, the real UID and saved set-user-ID are also set.(要让这个函数有效,其用户识别码必须为0)没有说是GID呀。
所以看你怎么设计了。

|
将setuid改为setreuid试试。
setuid()要有效当前进程必须是root,uid=0

不过你的程序很奇怪,uid=110用户竟然和root同等权限,但不是root.
uid = 110
gid = 0

|
没有这种功能,你必须以root或者将程序提升为s权限,否则是不可能直接变成另一个uid的。

    
 
 

您可能感兴趣的文章:

  • 各位大侠,请教一个LINUX存储管理的问题,在页换出时系统要锁住正在被换出的进程,若系统不锁住该进程,会发生什么状况?
  • 怎样查看当前正在运行的进程?
  • 请问--在Linux下如何看到所有正在运行的进程?
  • 守护进程退出的时候,怎么关闭正在侦听的端口?
  • 正在学习进程,请大家给我几个经典的练习题
  • linux下面如何查询某个进程正在使用的socket句柄数量
  • 如何在red hat 8.0下查看正在频繁使用磁盘(或者是cpu的)进程是哪个???
  • 如何知道一个目录正在被哪个进程或用户占用?
  • 如何打印出正在运行的进程pid
  • 如何获取正在运行的进程可以打开的最大文件描述符?
  • SuSE9上,多线程程序正在运行,用pstack打印堆栈信息,结果导致进程挂起(ps x 命令显示为T状态),为什么
  • 请教:使用system(命令)或者exec(命令)启动一个进程执行命令,如何判断这个命令是否启动成功或正在运行?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 请教高手一个简单问题:给定一个文件名,如何去查找该文件正在被几个程序使用,并怎么样才可以切断这个文件与正在打开该文件的程序之间的
  • 如何知道现在正在使用KDE还是正在使用GNOME?
  • 如何找出正在访问文件的程序?
  • 如何在servlet中实现“正在查询,请等待”的功能
  • 声频设备正在被使用,是怎么个概念?
  • LINUX下如何查看正在传输的文件??
  • 如何判断文件正在被写入
  • 在linux在如何保护正在使用的文件不被删除
  • 如何强制删除或恢复SQLServer正在使用的数据库
  • 你用java正在开发什么?来者有分!
  • 请问诸位高手:如何在服务器上得到正在连接的客户端IP??
  • @@@@@@@@@@motorola正在举办388java程序设计大赛,大家做得如何了??
  • 怎样取消一个正在打印的作业?
  • 请教:有什么工具可以“看”到系统中正在运行的线程?
  • 求教:wget如何判断文件正在下载?
  • redhat linux平台下文件正在使用判别C++?
  • qq如何判断文件正在被操作?
  • freebsd 用putty 远程,正在输入密码就自动退出。没法远程登录,哪里配置的问题呢???
  • 怎么判断一个可执行文件是否正在运行?
  • linux是不是可以删除正在运行的可执行文件???????????????????????????


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3