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. MySQL中视图

    视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用 ...

  2. Use swig + lua quick guide

    软件swigwin3    用于生成c的lua包装lua5.2源代码 步骤进入目录G:\sw\swigwin-3.0.12\Examples\lua\arrays执行 SWIG -lua     ex ...

  3. taro 开发注意点

    taro 开发注意点: 注意点 原因 如果要支持 React Native 端,必须采用 Flex 布局,并且样式选择器仅支持类选择器,且不支持 组合器 Taro RN 端是基于 Expo,因此不支持 ...

  4. node api 之:Error

    Node.js 中运行的应用程序一般会遇到以下四类错误: 标准的 JavaScript 错误: <EvalError> : 当调用 eval() 失败时抛出. <SyntaxErro ...

  5. php格式化数字:位数不足前面加0补足

    <?php $var=sprintf("%02d", 2);//生成2位数,不足前面补0 echo $var;//结果为02 ?> 參考:https://blog.cs ...

  6. Python的rand vs randn以及linspace

    Numpy里面的randn是满足了整体分布的,normal distribution(正态分布):rand则是满足了Uniform Distribution(均匀分布): Linspace(start ...

  7. bootstrap中的模态框(modal,弹出层)

    默认的modal示例: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...

  8. Jmeter使用自定义编写代码

    原文地址:http://blog.csdn.net/li_ok/article/details/1487685 我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如 ...

  9. Eureka Client的使用

    1. 新建工程 下一步,名字叫client 选择Cloud Discovery->Eureka Discovery 下一步后,点击完成 2. 在ClientApplication文件中增加Ena ...

  10. unicodedata.normalize()/使用strip()、rstrip()和lstrip()/encode和decode 笔记(具体可看 《Python Cookbook》3rd Edition 2.9~2.11)

    unicodedata.normalize()清理字符串 # normalize()的第一个参数指定字符串标准化的方式,分别有NFD/NFC >>> s1 = 'Spicy Jala ...