chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置。

在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:

增加了系统的安全性,限制了用户的权力:

在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。

建立一个与原系统隔离的系统目录结构,方便用户的开发:

使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。

切换系统的根目录位置,引导 Linux 系统启动以及急救系统等:

chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。

语法

chroot(选项)(参数)

选项

--help:在线帮助;
--version:显示版本信息。

参数

  • 目录:指定新的根目录;
  • 指令:指定要执行的指令。

实例

将target作为根目录(运行其中的/bin/sh):

chroot target /bin/sh

这里,target是busybox安装好的路径,类似一个文件系统包含了许多工具。这样,将会进入一个shell界面,这个shell以target为根。运行exit退出该shell又返回原来的本机环境了,也可以使用Ctrl+D。

注意:

  • 根用户才行
  • 如果直接chroot target默认寻找target的/bin/bash.这会以target作为根目录

将target作为根目录(运行其中的/bin/ls):

chroot target /bin/ls

这里,target是busybox安装好的路径,类似一个文件系统包含了许多工具。这样运行的是target中的ls(不是本机的/bin/ls),然后返回立即本机的目录环境。

注意,自己在本地编译一个程序生成a.out之后,拷进target/bin/中这样运行却不行,因为它包含了动态连接的库,需要用ldd查看a.out需要那些动态库,将这些库拷贝到新根的对应路径下才能执行。

========================chroot执行python脚本=====================================

1.如果我们想按照chroot默认的启动bash,进入root后执行Python,首先要为chroot准备bash(假设我们的target为/home/chroot)

mkdir -p /home/chroot/bin

#拷贝bash二进制

cp /bin/bash /home/chroot/bin    #拷贝bash二进制

#解决bash的依赖关系

ldd /bin/bash

linux-vdso.so.1 => (0x00007fff4c70a000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f0565ac7000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f05658c3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0565501000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0565cf9000)

所有依赖的库文件都在/lib64下,在/home/chroot目录下建立lib64目录,并将依赖的库拷贝进去:

mkdir -p /home/chroot/lib64

cp $(ldd /bin/bash | grep lib64 | sed -sre 's/(.+)(\/lib64\/\S+).+/\2/g') /home/chroot/lib64/

现在就可以运行chroot了: chroot /home/chroot

这样就进入了chroot环境,这时只能使用pwd、cd这类bash内置的命令,没有ls、mkdir这类系统的命令,想运行哪个命令用相同的方式加入chroot环境。退出chroot环境直接exit即可

2.加python到chroot中

拷贝python二进制

cp /usr/bin/python /home/chroot/bin

#解决python依赖(ldd /usr/bin/python和strace -o python.txt python查看依赖,这里用了比较粗暴的方法)

mkdir -p /home/chroot/usr

cp -r /usr/lib64/ /home/chroot/usr/

或者,使用挂载绑定:

mkdir /home/chroot/usr/lib64 && mount --bind /usr/lib64/ /home/chroot/usr/lib64

现在就可以使用python了

查看python具体依赖命令如下:

ldd /usr/bin/python

linux-vdso.so.1 => (0x00007fff7e5fe000)
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007fc26fc5d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc26fa41000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc26f83c000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fc26f639000)
libm.so.6 => /lib64/libm.so.6 (0x00007fc26f337000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc26ef75000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc27002b000)

strace -o python.txt python中所有open的都是必须的依赖,由于比较多,所以做法比较粗暴

[如果需要自己设置一些环境变量,需要拷贝env二进制到chroot:cp /usr/bin/env /home/chroot/bin]

===========================自动化脚本=================================

1.解决bash依赖脚本:

#!/bin/bash

CHROOT='/home/chroot'
mkdir $CHROOT

for i in $( ldd $* | grep -v dynamic | cut -d " " -f 3 | sed 's/://' | sort | uniq )
do
cp --parents $i $CHROOT
done

# ARCH amd64
if [ -f /lib64/ld-linux-x86-64.so.2 ]; then
cp --parents /lib64/ld-linux-x86-64.so.2 /$CHROOT
fi

# ARCH i386
if [ -f /lib/ld-linux.so.2 ]; then
cp --parents /lib/ld-linux.so.2 /$CHROOT
fi

echo "Chroot jail is ready. To access it execute: chroot $CHROOT"

2.启动chroot并设置一些环节变量

cp /usr/bin/env /home/chroot/bin

sudo chroot /home/chroot env -i \
 HOME=/home TERM="$TERM" PS1='\u:\w\$ ' \
 PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin \
 /bin/bash --login +h   #具体的命令可以自定义,比如python /home/test.py

相关阅读:

chroot用法和安装脚本

创建chroot环境

centos chroot使用的更多相关文章

  1. chroot详解

    我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...

  2. chroot 命令实例讲解

    我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...

  3. linux运维中的命令梳理(四)

    ----------管理命令---------- ps命令:查看进程 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不 ...

  4. centos 6.5 服务器安装 (LNMP ntfs文件支持 PHP-RPM CHROOT沙盒)

    centos 6.5 最小化安装 进入系统 手动开启网卡 #ifconfig eth0        //(默认会自动获得ip) 修改网站配置文件,默认开启 #cd /etc/sysconfig/ne ...

  5. [Centos] ERROR: Could not find useradd in chroot, maybe the install failed?

    [mockbuild at localhost ~]$ mock -r centos-5-x86_64-testdev.cfg initinitcleanprepThis may take a whi ...

  6. CentOS 7安装chroot Named

    一 安装相关软件 yum install bind-chroot bind -y 二 复制生成文件 cp -R /usr/share/doc/bind-*/sample/var/named/* /va ...

  7. 【笔记】LAMP 环境无脑安装配置 Centos 6.3

    p.p1 { margin: 0.0px 0.0px 5.0px 0.0px; font: 12.0px Times; color: #ff2500 } p.p2 { margin: 0.0px 0. ...

  8. centos 6 YUM安装 lmp

    准备篇: 1.配置防火墙,开启80端口.3306端口       vi /etc/sysconfig/iptables       -A INPUT -m state --state NEW -m t ...

  9. CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14

    准备篇: CentOS 7.0系统安装配置图解教程 http://www.osyunwei.com/archives/7829.html 一.配置防火墙,开启80端口.3306端口 CentOS 7. ...

随机推荐

  1. 学习练习SQL的数据库employee文件

    这个地址是一个已经集成了employee的database的sql文件.所以你可以下载这个sql文件,然后执行sql语句到对应的数据库中,这样你就可以练习sql语句了. 第一个链接是用户指导如何使用的 ...

  2. 获取spring的ApplicationContext几种方式【转】

    转自:http://blog.sina.com.cn/s/blog_9c7ba64d0101evar.html Java类获取spring 容器的bean 常用的5种获取spring 中bean的方式 ...

  3. Docker安装和常用命令

    Docker安装 Docker的安装可以参考 https://docs.docker.com/ 下面的 Get Docker / Docker CE / Linux, 需要关注的主要是CentOS和U ...

  4. Android context空指针异常

    Fragment中的代码 context 是null public class PlaceholderFragment extends Fragment{ Context context = getA ...

  5. A. Kyoya and Photobooks(Codeforces Round #309 (Div. 2))

    A. Kyoya and Photobooks   Kyoya Ootori is selling photobooks of the Ouran High School Host Club. He ...

  6. 阿里云安装jdk,tomcat,maven,svn,git,nginx

    1. 首先通过xftp等工具上传安装包 2. 配置目录 cd usr mkdir java cd java mkdir jdk mkdir tomcatmkdir maven 3. 安装jdk 3.1 ...

  7. Linux系统vi编辑器提示E325: ATTENTION的解决方法

    非正常关闭文件会报这样的警告信息, 原因是系统产生了一个.swp的文件. 删除就行了.(前提是确认.swp文件没用了.) 例如: rm -f /etc/.shadowsocks.json.swp 详情 ...

  8. [Spring学习笔记 5 ] Spring AOP 详解1

    知识点回顾:一.IOC容器---DI依赖注入:setter注入(属性注入)/构造子注入/字段注入(注解 )/接口注入 out Spring IOC容器的使用: A.完全使用XML文件来配置容器所要管理 ...

  9. 解决IE弹框提示“是否停止运行此脚本”问题

    有少数情况因为js处理内容较多,系统计算标红和刷新页面较慢,IE可能会弹框提示“是否停止运行此脚本”,若想要继续,点击“否”即可.并同时按照下面的设置更改一下注册表,即可解决弹框问题. http:// ...

  10. hibernate 注解 boolean问题解决方案

    1.JPA本身是不支持boolean.可以用Hibernater自带的标签.修改如下. @Column(name = "manager_log") @org.hibernate.a ...