我是一个刚接触 Linux 和 Unix 的新手。我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密码或修复基于 Linux/Unix的受损坏的环境?

在 Linux和类 Unix 系统下每一个进程/命令的当前工作目录称之为进程/命令的根目录(译注:译者以为此处有误,实际上没有进行过chroot的进程,其根目录是系统的根目 录,而不是其工作目录)。你可以使用 chroot 命令改变一个命令的根目录,这最终将会改变当前运行的进程及其子进程的根目录。

如果一个进程/命令运行在一个不能访问外部根目录文件的已修改环境中。这种修改环境通常被称为"监禁目录"(jail)或是"chroot 监禁"。只有特权进程和根用户才能使用 chroot 命令。然而这通常是很有用的:

  1. 将特权分配给无特权的进程,例如 Web 服务或 DNS 服务。
  2. 建立测试环境。
  3. 不使程序或系统崩溃下,运行旧程序或 ABI 兼容的程序。
  4. 系统恢复。
  5. 重新安装引导装载程序,例如 Grub 或 Lilo。
  6. 密码找回,重置一个已丢失的密码等。

用途

chroot 命令 改变其当前目录,并将根目录变为指定目录,然后如果提供了命令则运行命令,也可以运行一个用户的交互式shell的副本(译注:即bash等。)。请注意并不是每一个程序都可以使用 chroot 命令。

语法

基本语法如下:

  1. chroot /path/to/new/root command

或者

  1. chroot /path/to/new/root /path/to/server

或者

  1. chroot [options]/path/to/new/root /path/to/server

chroot 命令实例

在这个例子中,建立了一个"迷你监狱"用来测试一个只有 ls 命令的 Bash shell。首先用 mkdir 命令设定好 jail "监狱" 路径。

  1. $ J=$HOME/jail

在 $J 内创建目录:

  1. $ mkdir -p $J
  2. $ mkdir -p $J/{bin,lib64,lib}
  3. $ cd $J

cp 命令将/bin/bash 和 /bin/ls 复制到 $J/bin/ 路径下:

  1. $ cp -v /bin/{bash,ls} $J/bin

将所需库文件拷贝到$J。可以用 ldd 命令找到 bash 所依赖的共享库。

  1. $ ldd /bin/bash

输出样例:

  1. linux-vdso.so.1=>(0x00007fff8d987000)
  2. libtinfo.so.5=>/lib64/libtinfo.so.5(0x00000032f7a00000)
  3. libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000)
  4. libc.so.6=>/lib64/libc.so.6(0x00000032f7200000)
  5. /lib64/ld-linux-x86-64.so.2(0x00000032f6a00000)

直接拷贝上面输出中的库文件到 $J 目录:

  1. $ cp -v /lib64/libtinfo.so.5/lib64/libdl.so.2/lib64/libc.so.6/lib64/ld-linux-x86-64.so.2 $J/lib64/

输出样例:

  1. `/lib64/libtinfo.so.5' -> `/home/vivek/jail/lib64/libtinfo.so.5'
  2. `/lib64/libdl.so.2'->`/home/vivek/jail/lib64/libdl.so.2'
  3. `/lib64/libc.so.6' -> `/home/vivek/jail/lib64/libc.so.6'
  4. `/lib64/ld-linux-x86-64.so.2' -> `/home/vivek/jail/lib64/ld-linux-x86-64.so.2'

复制 ls 命令所需的库文件到 $J 目录下。用 ldd 命令打印出 ls 命令依赖的共享库:

  1. $ ldd /bin/ls

输出样例:

  1. linux-vdso.so.1=>(0x00007fff68dff000)
  2. libselinux.so.1=>/lib64/libselinux.so.1(0x00000032f8a00000)
  3. librt.so.1=>/lib64/librt.so.1(0x00000032f7a00000)
  4. libcap.so.2=>/lib64/libcap.so.2(0x00000032fda00000)
  5. libacl.so.1=>/lib64/libacl.so.1(0x00000032fbe00000)
  6. libc.so.6=>/lib64/libc.so.6(0x00000032f7200000)
  7. libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000)
  8. /lib64/ld-linux-x86-64.so.2(0x00000032f6a00000)
  9. libpthread.so.0=>/lib64/libpthread.so.0(0x00000032f7600000)
  10. libattr.so.1=>/lib64/libattr.so.1(0x00000032f9600000)

你可以一个个的复制库文件,为了更高效的作业,我们也可以使用bash shell 的循环指令实现:

  1. list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"
  2. for i in $list;do cp -v "$i""${J}${i}";done

输出样例:

  1. `/lib64/libselinux.so.1' -> `/home/vivek/jail/lib64/libselinux.so.1'
  2. `/lib64/librt.so.1'->`/home/vivek/jail/lib64/librt.so.1'
  3. `/lib64/libcap.so.2' -> `/home/vivek/jail/lib64/libcap.so.2'
  4. `/lib64/libacl.so.1' -> `/home/vivek/jail/lib64/libacl.so.1'
  5. `/lib64/libc.so.6'->`/home/vivek/jail/lib64/libc.so.6'
  6. `/lib64/libdl.so.2' -> `/home/vivek/jail/lib64/libdl.so.2'
  7. `/lib64/ld-linux-x86-64.so.2' -> `/home/vivek/jail/lib64/ld-linux-x86-64.so.2'
  8. `/lib64/libpthread.so.0'->`/home/vivek/jail/lib64/libpthread.so.0'
  9. `/lib64/libattr.so.1' -> `/home/vivek/jail/lib64/libattr.so.1'

最后,chroot 到你的新jail:

  1. $ sudo chroot $J /bin/bash

尝试浏览一下 /etc 或 /var:

  1. # ls /
  2. # ls /etc/
  3. # ls /var/

改变了根目录的 bash 和 ls 程序现在被监禁在$HOME/$J这个特殊目录中,而且不能再访问外部的目录树,这个目录可以看做是它们的"/"(root)目录。如果配置正确的话,这会极大增强安全性。我通常用这种技术锁定以下的应用程序。

  1. Apache - Red Hat / CentOS: Chroot Apache 2 Web Server
  2. Nginx - Linux nginx: Chroot (Jail) Setup
  3. Chroot Lighttpd web server on a Linux based system
  4. Chroot mail server.
  5. Chroot Bind DNS server 等等

如何退出 chroot 监禁呢?

键入 exit 即可

  1. $ exit

查找服务是否存在于 chrooted 监禁内

你可以用下面两个命令[轻松的找出 Postfix 邮件服务是否已经 chrooted]:

  1. pid=$(pidof -s master)
  2. ls -ld /proc/$pid/root

从基本Linux服务中输出样例:

  1. lrwxrwxrwx.1 root root 0Mar911:16/proc/8613/root ->/

PID 8613 指向了 / (root) 也就是说这个程序的根目录并没有被改变或是被 chroot。这个方法非常的快速而又直接,不需要打开配置文件。下面是从已经 chroot 的 ngnix 服务中得到的另一个例子:

  1. pid=$(pidof -s master)
  2. ls -ld /proc/$pid/root

输出样例:

  1. lrwxrwxrwx 1 nginx nginx 0Mar911:17/proc/4233/root ->/nginxjail

程序的根目录已经改为 /nginxjail。

我是一个刚接触 Linux 和 Unix 的新手。我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密码或修复基于 Linux/Unix的受损坏的环境?

在 Linux和类 Unix 系统下每一个进程/命令的当前工作目录称之为进程/命令的根目录(译注:译者以为此处有误,实际上没有进行过chroot的进程,其根目录是系统的根目 录,而不是其工作目录)。你可以使用 chroot 命令改变一个命令的根目录,这最终将会改变当前运行的进程及其子进程的根目录。

如果一个进程/命令运行在一个不能访问外部根目录文件的已修改环境中。这种修改环境通常被称为"监禁目录"(jail)或是"chroot 监禁"。只有特权进程和根用户才能使用 chroot 命令。然而这通常是很有用的:

  1. 将特权分配给无特权的进程,例如 Web 服务或 DNS 服务。
  2. 建立测试环境。
  3. 不使程序或系统崩溃下,运行旧程序或 ABI 兼容的程序。
  4. 系统恢复。
  5. 重新安装引导装载程序,例如 Grub 或 Lilo。
  6. 密码找回,重置一个已丢失的密码等。

用途

chroot 命令 改变其当前目录,并将根目录变为指定目录,然后如果提供了命令则运行命令,也可以运行一个用户的交互式shell的副本(译注:即bash等。)。请注意并不是每一个程序都可以使用 chroot 命令。

语法

基本语法如下:

  1. chroot /path/to/new/root command

或者

  1. chroot /path/to/new/root /path/to/server

或者

  1. chroot [options]/path/to/new/root /path/to/server

chroot 命令实例

在这个例子中,建立了一个"迷你监狱"用来测试一个只有 ls 命令的 Bash shell。首先用 mkdir 命令设定好 jail "监狱" 路径。

  1. $ J=$HOME/jail

在 $J 内创建目录:

  1. $ mkdir -p $J
  2. $ mkdir -p $J/{bin,lib64,lib}
  3. $ cd $J

cp 命令将/bin/bash 和 /bin/ls 复制到 $J/bin/ 路径下:

  1. $ cp -v /bin/{bash,ls} $J/bin

将所需库文件拷贝到$J。可以用 ldd 命令找到 bash 所依赖的共享库。

  1. $ ldd /bin/bash

输出样例:

  1. linux-vdso.so.1=>(0x00007fff8d987000)
  2. libtinfo.so.5=>/lib64/libtinfo.so.5(0x00000032f7a00000)
  3. libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000)
  4. libc.so.6=>/lib64/libc.so.6(0x00000032f7200000)
  5. /lib64/ld-linux-x86-64.so.2(0x00000032f6a00000)

直接拷贝上面输出中的库文件到 $J 目录:

  1. $ cp -v /lib64/libtinfo.so.5/lib64/libdl.so.2/lib64/libc.so.6/lib64/ld-linux-x86-64.so.2 $J/lib64/

输出样例:

  1. `/lib64/libtinfo.so.5' -> `/home/vivek/jail/lib64/libtinfo.so.5'
  2. `/lib64/libdl.so.2'->`/home/vivek/jail/lib64/libdl.so.2'
  3. `/lib64/libc.so.6' -> `/home/vivek/jail/lib64/libc.so.6'
  4. `/lib64/ld-linux-x86-64.so.2' -> `/home/vivek/jail/lib64/ld-linux-x86-64.so.2'

复制 ls 命令所需的库文件到 $J 目录下。用 ldd 命令打印出 ls 命令依赖的共享库:

  1. $ ldd /bin/ls

输出样例:

  1. linux-vdso.so.1=>(0x00007fff68dff000)
  2. libselinux.so.1=>/lib64/libselinux.so.1(0x00000032f8a00000)
  3. librt.so.1=>/lib64/librt.so.1(0x00000032f7a00000)
  4. libcap.so.2=>/lib64/libcap.so.2(0x00000032fda00000)
  5. libacl.so.1=>/lib64/libacl.so.1(0x00000032fbe00000)
  6. libc.so.6=>/lib64/libc.so.6(0x00000032f7200000)
  7. libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000)
  8. /lib64/ld-linux-x86-64.so.2(0x00000032f6a00000)
  9. libpthread.so.0=>/lib64/libpthread.so.0(0x00000032f7600000)
  10. libattr.so.1=>/lib64/libattr.so.1(0x00000032f9600000)

你可以一个个的复制库文件,为了更高效的作业,我们也可以使用bash shell 的循环指令实现:

  1. list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"
  2. for i in $list;do cp -v "$i""${J}${i}";done

输出样例:

  1. `/lib64/libselinux.so.1' -> `/home/vivek/jail/lib64/libselinux.so.1'
  2. `/lib64/librt.so.1'->`/home/vivek/jail/lib64/librt.so.1'
  3. `/lib64/libcap.so.2' -> `/home/vivek/jail/lib64/libcap.so.2'
  4. `/lib64/libacl.so.1' -> `/home/vivek/jail/lib64/libacl.so.1'
  5. `/lib64/libc.so.6'->`/home/vivek/jail/lib64/libc.so.6'
  6. `/lib64/libdl.so.2' -> `/home/vivek/jail/lib64/libdl.so.2'
  7. `/lib64/ld-linux-x86-64.so.2' -> `/home/vivek/jail/lib64/ld-linux-x86-64.so.2'
  8. `/lib64/libpthread.so.0'->`/home/vivek/jail/lib64/libpthread.so.0'
  9. `/lib64/libattr.so.1' -> `/home/vivek/jail/lib64/libattr.so.1'

最后,chroot 到你的新jail:

  1. $ sudo chroot $J /bin/bash

尝试浏览一下 /etc 或 /var:

  1. # ls /
  2. # ls /etc/
  3. # ls /var/

改变了根目录的 bash 和 ls 程序现在被监禁在$HOME/$J这个特殊目录中,而且不能再访问外部的目录树,这个目录可以看做是它们的"/"(root)目录。如果配置正确的话,这会极大增强安全性。我通常用这种技术锁定以下的应用程序。

  1. Apache - Red Hat / CentOS: Chroot Apache 2 Web Server
  2. Nginx - Linux nginx: Chroot (Jail) Setup
  3. Chroot Lighttpd web server on a Linux based system
  4. Chroot mail server.
  5. Chroot Bind DNS server 等等

如何退出 chroot 监禁呢?

键入 exit 即可

  1. $ exit

chroot 命令实例讲解的更多相关文章

  1. Linux Wget 命令实例讲解

    Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...

  2. Windows下用cmd命令实例讲解yii2.0 的控制台定时任务

    Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等,资源放在Web可访问的目录下,直接被Web服务器调用. 有时候有些功能需要做到计划任务中去,因此就需要y ...

  3. linux dd命令实例讲解

    转:http://blog.chinaunix.net/uid-28549627-id-3922282.html 提到linux 系统中的dd命令,各位技术博友大多都很熟悉,用法也是好多,今天主要跟大 ...

  4. Linux命令之dig命令实例讲解

    1.查看域名的A记录 # dig yahoo.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<> ...

  5. [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...

  6. 实例讲解Oracle数据库设置默认表空间问题

    实例讲解Oracle数据库设置默认表空间问题   实例讲解Oracle数据库设置默认表空间问题,阅读实例讲解Oracle数据库设置默认表空间问题,DBA们经常会遇到一个这样令人头疼的问题:不知道谁在O ...

  7. 基于tcpdump实例讲解TCP/IP协议

    前言 虽然网络编程的socket大家很多都会操作,但是很多还是不熟悉socket编程中,底层TCP/IP协议的交互过程,本文会一个简单的客户端程序和服务端程序的交互过程,使用tcpdump抓包,实例讲 ...

  8. makefile基础实例讲解 分类: C/C++ 2015-03-16 10:11 66人阅读 评论(0) 收藏

    一.makefile简介 定义:makefile定义了软件开发过程中,项目工程编译链.接接的方法和规则. 产生:由IDE自动生成或者开发者手动书写. 作用:Unix(MAC OS.Solars)和Li ...

  9. 实例讲解Linux系统中硬链接与软链接的创建

    导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...

随机推荐

  1. Hadoop学习—最大的敌人是自己

    (大讲台:国内首个it在线教育混合式自适应学习) 如果没有那次学习机会,我依然深陷在封闭的泥塘里. 我是今年刚毕业的大学生,我学习成绩不错,所学也是国内很厉害的专业,全国范围内只有6所院校拥有学位授予 ...

  2. 关于Qt5 UI设计的一些小知识

      (1) 获取textEdit中的值   QString str = ui->textedit->toPlainText(); // 这是普通文本 p=str.toInt();     ...

  3. 个人作业-Homework1感想

    我以前没有系统学习过C++和C#,编程能力比较差.这次个人作业对我来说是一个很大的挑战.由于布置作业的时间是开学的第一周,因为还没有从假期的状态中转换出来,这对我写作业又增加了一定的难度. 在开始写作 ...

  4. Nhibernate 分页功能

    cs: public IEnumerable<ArticleView> MyGetAll(int start, int limit, ref int count) { try { var ...

  5. Cloud Test 单页面即时监测功能上线!

    什么是即时监测? 即时监测,顾名思义是指输入 URL 后能够立即进行监测并展示结果,无需注册. 如下图,在输入框内输入需要监测的 URL,点击免费监测,即可展示网页监测结果: 图中我们可以看到页面各个 ...

  6. Log4j配置全说明

    转载:http://zhangjunhd.blog.51cto.com/113473/21014/ 1.Log4j简介 Log4j是Apache的一个开源项目,它允许开发者以任意间隔输出日志信息.Lo ...

  7. easyui源码翻译1.32--SplitButton(分割按钮)

    前言 扩展自$.fn.linkbutton.defaults.用于$.fn.splitbutton.defaults重写默认值对象.下载该插件翻译源码 类似菜单按钮,分割按钮也与linkbutton和 ...

  8. jacob访问ocx控件方法和遇到的问题

    最近在进行摄像机的二次开发,摄像机厂商提供了使用C++开发的ocx控件:所以尝试使用jacob来进行访问. 操作步骤如下: 1, 从官网(http://sourceforge.net/projects ...

  9. USB Type-C接口完美无瑕?小心这五点

    今年下半年发布的新手机中,采用USB Type-C接口与传统micro USB接口的手机,所占比例大概是一半对一半.采用Type-C接口的手机大多数都是国产手机,而像三星.摩托罗拉以及索尼等老牌的手机 ...

  10. NuGet学习笔记(1)——初识NuGet及快速安装使用

    关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...