Hack #57: 使用fakeroot模拟root权限执行程序

fakeroot是什么

例如Debian在生成package的时候,编译完之后,不能立刻在当前环境执行make install,需要执行make install DESTDIR=$(pwd)/debian/tmp把生成的文件安装到build目录的里面$(pwd)/debian/tmp。然后使用那个目录里面的全部内容生成Debian包(实际上包里面还会包含control和maintainer script等)。 这个包里面的文件所有者必须是root,所以需要以root来执行打包命令。但是应该避免在制作Debian包的时候使用root权限。 为了解决这个矛盾,fakeroot被开发出来了。在fakeroot环境中,操作文件就像使用root操作文件一样。但是,实际上系统中文件的权限还是原来的权限。

$ ls
foo
$ ls -l
total 0
-rw-r--r-- 1 kghost staff 0 Feb 11 14:17 foo
$ fakeroot
# id
uid=0(root) gid=0(root) groups=0(root),50(staff),100(users)
# ls -l
total 0
-rw-r--r-- 1 root root 0 Feb 11 14:17 foo
# touch bar
# ls -l
-rw-r--r-- 1 root root 0 Feb 11 14:17 bar
-rw-r--r-- 1 root root 0 Feb 11 14:17 foo
# chown www-data:www-data foo
# ls -l
total 0
-rw-r--r-- 1 root root 0 Feb 11 14:17 bar
-rw-r--r-- 1 www-data www-data 0 Feb 11 14:17 foo
# exit
$ ls -l
total 0
-rw-r--r-- 1 kghost staff 0 Feb 11 14:17 bar
-rw-r--r-- 1 kghost staff 0 Feb 11 14:17 foo

像这样执行fakeroot后会在fakeroot环境中启动一个shell。这个shell中就像拥有root权限一样。执行id(1)命令会提示为root,并且文件的所有者也会变成root。新生成的文件所有者也是root,还可以把现有文件的所有者改成其他人。 但是实际上变更的只反应在fakeroot环境内部。退出fakeroot环境后就能看到实际上的文件属性。 在制作Debian包的时候,需要使用root权限来执行某些命令。本来是应该使用sudo来运行这些命令的,但是通常情况下是使用fakeroot模拟root运行。

fakeroot的实现

fakeroot仅仅是简单的shell script。简单来说fakeroot做下面的事情。 * 启动faked,获取FAKEROOTKEY * 设置环境变量FAKEROOTKEY,LD_LIBRARY_PATH,LD_PRELOAD。执行命令(默认是shell)

faked是管理虚拟的文件所有者,文件权限信息的守护进程。 在fakeroot中执行的命令会加载由LD_LIBRARY_PATH,LD_PRELOAD环境变量指定的一个动态链接库(/usr/lib/libfakeroot/libfakeroot-sysv.so)

LD_LIBRARY_PATH=/usr/lib/libfakeroot LD_PRELOAD=libfakeroot-sysv.so

libfakeroot-sysv.so导出了以下函数

Table 1. test

getuid()

geteuid()

getguid()

getegid()

mknod()

chown()

fchown()

lchown()

chmod()

fchmod()

mkdir()

lstat()

fstat()

stat()

unlink()

remove()

rmdir()

rename()

这些函数会使用FAKEROOTKEY与faked通讯,返回虚拟的所有者与权限信息。

/usr/lib/libfakeroot-sysv.so

与faked通讯的库文件是/usr/lib/libfakeroot/libfakeroot-sysv.so,但是/usr/lib/libfakeroot-sysv.so也是存在的。这个文件是在fakeroot中运行suid程序所必须的。 fakeroot中会设定LD_LIBRARY_PATH环境变量。设定LD_LIBRARY_PATH后LD_PRELOAD就不需要是完整路径了。但是如果LD_PRELOAD不使用完整路径,suid的程序会忽略LD_LIBRARY_PATH而直接在/lib与/usr/lib中寻找LD_PRELOAD指定的库文件。如果LD_PRELOAD指定的文件没有找到这个suid的程序就会启动失败。所以会存在/usr/lib/libfakeroot-sysv.so这样一个suid的dummy库,在运行suid程序的时候通过LD_PRELOAD加载这个库,就跟没有加载任何东西一样,正常执行。 * 普通的程序 使用LD_LIBRARY_PATH=/usr/lib/libfakeroot LD_PRELOAD=libfakeroot-sysv.so,通过preload加载/usr/lib/libfakeroot/libfakeroot-sysv.so的与faked通讯 * suid的程序 无视LD_LIBRARY_PATH, 使用LD_PRELOAD=libfakeroot-sysv.so,通过preload加载/usr/lib/libfakeroot-sysv.so,因为这是一个dummy库,就与这个库不存在一样,程序正常执行。

总结

例如Debian生成package这样,在必须使用root的时候,使用fakeroot模拟root权限。fakeroot使用libfakeroot-sysv.so库文件中的函数与faked通讯管理文件权限信息。

— Fumitoshi Ukai

使用fakeroot模拟root权限执行程序(转)的更多相关文章

  1. 转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

    本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比 ...

  2. 安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

    继续在网上搜索安卓按键模拟(其实那时都不知道用什么关键字好了,能想到的关键字都用遍了,但是搜索出来的结果,都是之前提到的那几个依赖源码环境和系统权限的方案).发现有很多介绍ADB调试,向手机发送按键事 ...

  3. 取之有道——巧用Root权限 启动其他APP中的Activity

    这次博主来分享一个很巧妙的办法来启动其他APP中Activity的方法. 首先说一下这样做的目的:最近博主在攻克一个技术难点,就是搞定某些三方系统中,对于应用权限的限制.为此给出用户指导,引导用户启动 ...

  4. Android权限说明 system权限 root权限

    原文链接:http://blog.csdn.net/rockwupj/article/details/8618655 Android权限说明 Android系统是运行在Linux内核上的,Androi ...

  5. 获取root权限及破解原理分析

    2012-03-18 17:58:45|  分类: android |字号 订阅 如今Android系统的root破解基本上成为大家的必备技能!网上也有非常多中一键破解的软件,使root破解越来越ea ...

  6. 关于真机测试root权限问题

    普通用户好像也无伤大雅: 输入后看到这样的有个美元符号,说明你的虚拟机获取不了权限,有权限的应该是root和#都有,这个时候你输入su 如果还是没有变化,看看你的虚拟机是不是android7.0,An ...

  7. Atitit  godaddy 文件权限 root权限设置

    Atitit  godaddy 文件权限 root权限设置 1. ubuntu需要先登录,再su切换到root1 2. sudo 授权许可使用的su,也是受限制的su1 3. ubuntu默认吗roo ...

  8. php利用root权限执行shell脚本

    vi /etc/sudoers , 为apache用户赋予root权限,并且不需要密码,还有一步重要的修改(我被困扰的就是这个地方) root  ALL=(ALL)  ALL apache  ALL= ...

  9. linux下如何添加一个用户并且让用户获得root权限

    1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 Changing pass ...

随机推荐

  1. NET使用NPOI组件导出Excel-入门示例及通用方法

    一.Excel导入及导出问题产生:   从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:   导出问题:   如果是as ...

  2. revit api 实现过滤墙图元并选中

    public IList<Element> findElementsByCategory(Autodesk.Revit.UI.UIApplication aApp, Document aD ...

  3. 基于 debian:stretch-slim 系统镜像的 docker 镜像,安装 curl

    依次运行如下命令: apt-get update apt-get install curl

  4. Jmeter中Websocket协议支持包的使用

    Jmeter中Websocket协议支持包的使用(转) 参考的来源是国外一篇文章,已经整理成pdf格式(http://yunpan.cn/cFzwiyeQDKdh3 (提取码:9bcf)) 转自:ht ...

  5. JavaScript 继承总结

    http://blog.csdn.net/yincheng01/article/details/6841953 Metro C++ http://www.cnblogs.com/michaelxu/a ...

  6. [转]You Could Become an AI Master Before You Know It. Here’s How.

    转自:https://www.technologyreview.com/s/608921/ai-algorithms-are-starting-to-teach-ai-algorithms/# You ...

  7. 【java】函数概述

    函数也叫方法,是具有一定功能的小程序. 函数格式: 修饰符 返回值类型 函数名(参数类型 形式参数:参数类型 形式参数) { 执行语句: return 返回值; } 返回值类型:函数运行后结果的数据类 ...

  8. GTP+SDI工程播出部分思路整理(3)

    GTP+SDI工程播出部分思路整理(3) 1.本文的目的主要分析video_out_to_sdi模块中输入信号 tx_usrclk, rst, tx_mode, tx_level_b的使用 Tx_us ...

  9. python slave status 2

    #!/usr/bin/env python import MySQLdbimport contextlib @contextlib.contextmanagerdef mysql(Host,Port, ...

  10. Web API 令牌(秘钥是双方约定的,并不在网络连接上传输)

    http://blog.csdn.net/qq289523052/article/details/47750021 秘钥是双方约定的,并不在网络连接上传输 Web API数据传输加密 2015-08- ...