文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>RHCE课堂学习笔记

RHCE课堂学习笔记

时间:2006-03-20  来源:xiaoyi1982

RHCE课堂学习笔记
第一堂课
  单元一:概述
  UNIX由贝尔实验室(Bell Labs)发明。UNIX为AT&T的注册商标,所以其他公司开发的UNIX都有自己的名字,例如IBM的AIX,Sun的Solaris等。
  UNIX中,任何事物都是文件。基于这个定理,UNIX的配置文件都储存在文本文件中,并可以将多个程序链起来完成复杂的任务。
  GNU Project开始于1984年,由自由软件基金(FSF for Free Software Foundation)支持,目的是为了建立免费的UNIX系统。到1990年,建立了一套包括gcc,emac等在内的近乎完备的系统。
  GPL=GNU General Public License。GPL鼓励自由软件,所有对遵循GPL的软件进行的改进和修改也都必须遵循GPL。
  而Linux起源于1991年有个大学毕业生Linux Torvalds建立了一个叫做"Linux"的操作系统内核。虽然该内核当时只支持gcc和bash两个GNU产品,但它预示着组合Linux内核和GNU应用程序使得建立免费的类UNIX系统成为可能。
  Linux具备的特性有:
  #Linux是一个类UNIX系统
  #支持多任务和多用户
  #并有广泛的硬件支持(至少是越来越广泛)
  #Red Hat发行版Linux提供了相当多Red Hat推荐的、普遍使用的、有用的程序。
  Red Hat Linux是Linux的一个发行版本(distribution)。它具有的特性有:
  #最新的系统内核
  #常用的实用程序和应用软件
  #安装和配置软件
  #提供技术支持
  Red Hat Linux推荐的硬件配置
  #Pentium级以上的CPU
  #128M内存
  #600M-1.2G的硬盘空间,取决于使用目的。
  #可启动的CDROM或者软驱
  Linux在图形用户界面(GUI)环境上,提供标准的X Window系统:XFree86。两种桌面环境:KDE和GNOME,分别建立在Qt和GTK+开发包上。
  单元二:快速教程
  Linux用户环境组件包括:
  #内核(Kernel)
  #Shell
  #终端模拟器(Terminal Emulator)
  #X Window系统
  #窗口管理器(Window Manager)
  #桌面环境(Desktop Environment)
  本地登录时,若是在虚拟终端中以文本界面登录,运行级别(runlevel)为3;当在图形界面登录是,运行级别(runlevel)为5。可使用init来切换runlevel,如 init 3 或者 init 5。
  ls命令通常用于查看文件系统,Red Hat Linux使用“彩色的”ls来区分不同的文件。命令例如:
  $ ls -lh 文件以KB大小列出并列出属性等详细信息
  $ ls -a 列出所有文件(显示隐藏的以"."开头的文件)
  $ ls -al 列出所有文件及其详细信息
  $ ls -R 列出目录下所有子目录及文件
  所有的硬件设备都是以文件形式存在的,只不过它们是特殊的文件,并存放在/dev目录下。设备分为块设备(block)和字符设备(character)两种。在用ls -l命令显示时,设备文件的类型会在属性的第一位以"b"或者"c"分别表示。块设备是可随机读写的设备,例如硬盘;字符设备必须是顺序读写的,比如串口。
  进程(process)是一个正在执行的程序的实例(程序的一次运行),每个进程都有一个唯一的进程号PID,从1-32768取值。其中PID 1为init进程所保留。线程(thread)可以看作是一个进程内部的“小进程”,和系统中的进程有些相似。
  用ps -ef和pstree可以罗列当前的进程列表。top可即时监视当前所有进程,gtop是一个图形界面的进程监视程序。
  在命令行Shell中,最常用和最著名的是bash(Bourne Again SHell),也是Linux的缺省shell。bash的全局设置文件为 /etc/profile和 /etc/bashrc。当然还有其他的shell比如csh等。
  两个以上的命令/程序的连续执行可使用分号“ ; ”。若需要连续执行命令并保证前一个命令没有返回错误的前提下执行下一个命令的话,可在命令间加上“ && ”。若命令在一行打不下或想人为换行,可在行末尾加“ \ ”然后回车,继续这个命令的后面的部分。
  man命令后跟命令名可找到相应的帮助页面,按q 退出。例如man ls 或者ls --help。info 命令后跟section_name 可找到相应部分的帮助。在/usr/share/doc/HOWTO/ 中有编译好的HowTos可供查阅。
  env 命令显示环境变量;set命令显示环境变量和本地shell变量。下面是一些通用变量:
  PATH - 可执行文件搜索路径
  PWD - 当前目录
  TERM - 登录终端类型
  SHELL - 登录Shell的路径
  HOME - 用户的home目录
  USER - 用户名
  DISPLAY - X显示名
  VISUAL - 可视化编辑器名
  EDITOR - 缺省编辑器名
  root用户拥有对系统的完全控制,用户号(UID)为保留的0。任何非特权用户的UID都大于0。可以用id 命令查看当前用户信息。用passwd 命令改变密码,密码长度应在6-255位之间,并且大小写敏感。passwd [用户名] 用来修改某特定用户的密码。
  虚拟终端(virtual console)的设计支持非GUI的多重登录。缺省情况下有6个虚拟终端,可通过CTRL-ALT-F[1-6] 在之间切换。在虚拟终端中可使用Shift+PageUp和Shift+PageDown卷动显示。如果运行了X,则X用CTRL-ALT-F7 来切换。
  单元三:文件与Shell基础
  命令pwd(Print Working Directory)显示当前所在目录的绝对路径。cd 命令用于改变当前目录,后跟绝对路径或相对路径。绝对路径以“ / ”开始,而相对路径通常以“.”、“..”或者下级目录名开始。例如:
  $ cd /tmp/mydir
  $ cd ..
  $ cd mydir
  $ cd - (到前一个所在目录)
  $ pwd
  /tmp
  每个用户都有一个home 目录,一般在/home 目录下。home 目录中包含了用户特定的配置和用户文件。字符“ ~ ”代表当前用户的home 目录。例如,当前用户为feng_ye,则他的home 目录下的某个文件就可以这样写:~/text/example.txt ,即/home/feng_ye/text/example.txt 。如果feng_ye用户可以访问别的用户home 目录,则~kim/text/another.txt 代表了kim用户home 目录下的text/another.txt 文件,即/home/kim/text/another.txt 。
  文件名可以长达255个字符,以“ . ”开头的文件为隐藏文件,在ls 时必须加-a 显示才能看到。文件名一般来说避免在其中使用 / , >, <, ?, *, ", ' 和控制符号(不可打印的字符)。如果想要使用特殊字符,比如空格,那么将文件名用双引号“ " ” 括起来,例如:
  $ ls -l "file name with spaces.txt"
  或者
  $ ls -l file\ name\ with\ spaces.txt
  Red Hat Linux 和大多数Linux 发行版一样,遵循FHS(Filesystem Hierarchy Standard)。系统目录中:
  /bin , /sbin , /usr 存放系统编译后的可执行文件、命令;
  /var 存放日志文件,PID 文件和电子邮件;
  /proc 当前的进程都会在这个目录中出现,可看作是一个通向内核的虚拟窗口;
  /etc 存放配置文件;
  /lib 存放共享库;
  /dev 设备文件;
  /boot 内核和启动文件;
  /home 用户的home 目录;
  /opt 为安装第三方软件包的目录。
  df 命令显示磁盘用量,加-h 选项可以以KB、MB、GB等单位输出,加-H 也以KB、MB、GB输出,但是是以1000为K,而非1024。du 命令计算目录下文件占用磁盘的大小,以KB为单位,也加-h 选项。例如du -sh 。
  文件操作中,mv 命令用来移动文件或者将文件改名。注意如果mv 命令的第二个参数,也就是移动目的地是一个目录,则源文件移动到该目录下;若不存在第二个参数所指定的目录,则mv 将认为第二个参数是一个文件名,并将源文件改名。cp 命令复制文件。可用-a 选项复制整个目录及其子目录和文件,并保持其修改时间。touch 命令更新文件的最后修改时间,若文件不存在则建立空文件。rm 命令删除文件。可以用-rf 命令删除任何文件或者目录,及其子目录下的文件。如果需要的话可以用-i 选项让rm 命令具有交互功能。
  目录操作中,mkdir 命令新建目录,rmdir 用于删除空目录,若需要删除非空目录,使用rm -r 将删除目录及其子目录中所有文件。
  file 命令用于获得文件的类型,如ASCII文件或者可执行文件等。
  cat 命令用于显示整个文件的内容。-A 选项显示所有字符,包括控制字符和不可打印的字符;-s 选项压缩文件中的多个空行为一个空行;-b 为所有非空行加注行号。
  less 命令用于在分屏显示文件,空格向后翻页;b 向前翻页;/text 在文件中向前查找text;?text 在文件中向后查找text;n 重复上一次的查找;N 重复上次查找,但方向相反;q 退出。
  less 的选项有 -c 在显示前清屏;-r 显示控制字符;-s 压缩多个空行为一个空行。
  tail 和head 命令显示文件最后n 行和最前的n 行。n 缺省为10。
  -n 或者 -n n 选项:显示n行(例:-20 或者-n 20)
  -c n 选项:显示n个字节
  -f 选项为tail 所独有,它用来实时观察文件的末尾增加的行,在观察系统日志时非常有用。
  pico 是一个通用文本编辑器,当编辑系统配置时务必加-w 选项以防止自动换行。
  文件可以用通配符 * 和 ? ,* 表示0个或者多个字符,? 表示单个字符。[a-z] 表示在范围之内的字符,[^a-z]表示除范围之外的字符。
  技巧:echo 命令可以用来测试通配符以避免错误的毁灭性操作,例如rm 。
  $ echo ??ee*.txt
  bleeding-edge.txt sheeptrix.txt
  kill [PID] 用来杀死进程。不易杀死的进程可用kill -9 [PID] 杀死。
  单元四:用户、组和系统信息
  所有的用户(下称user)都有一个唯一的用户号(unique User ID = uid)。用户名和uid都存储在/etc/passwd 文件中。当user 登录时通常被连接到home 目录和一个Shell程序。user 不能在没有允许的情况下读、写、执行其他user 的文件。
  user 都属于一个组(下称group),而group 有唯一的组号(unique Group ID
  单元五实验
  文件访问权限
  估计用时:30分钟
  目标:熟悉多个修改文件权限命令的语法和应用,并可组合命令以完成一般的任务。
  实验前准备:一台安装好的系统,其上有student 帐号。
  实验1:定义文件的访问权限的实践
  任务:
  1、写下文件权限的字串(类似rwxr-xr-x):
  664:_______________________
  755:_______________________
  000:_______________________
  711:_______________________
  700:_______________________
  777:_______________________
  555:_______________________
  705:_______________________
  111:_______________________
  600:_______________________
  731:_______________________
  2、一个文件权限为755,哪条命令可以将其权限改为r-xr--r--?
  3、你刚从Internet上下载了一个值得信任的执行文件。在你运行它之前你必须做什么?写下两种不同的途径。
  4、你在之后的单元中将会学到进程(系统中运行的程序)是被用户和用户组所拥有的,就像文件和目录一样。一个进程只有当它的拥有者和拥有者组拥有相应的权限时,它才可以读、写并执行一个文件或目录。
  Red Hat Linux 系统通常配置成由用户apache 和组apache 运行apache Web服务器进程。
  在系统安装的时候该用户和组已经作为apache 的一部分已经建立。
  假设你有一个目录结构 /home/student/archive 里面有许多的文件和目录,都被设置为权
  限700。你想将archive 目录在Internet 上设置为可访问的,但是当前的许可并不允许web服
  务器(以用户apache 运行)访问文件。使用chmod 命令,你如何用一条命令改变文件的访问权限?
  实验2:使用umask 设置新建文件的默认访问权限。
  任务:
  1、登录
  2、查看当前的umask
  $ umask
  3、创建几个文件和目录,看看它们的访问权限
  $ touch umtest1
  $ touch umtest2
  $ mkdir umtestdir1
  $ ls -ld um*
  4、改变你的umask 为一个更安全的设置,然后新建文件与目录,再比较一下访问权限
  $ umask 066
  $ touch umtest3
  $ touch umtest4
  $ mkdir umtestdir2
  在查看访问权限之前,你觉得它们的权限会是多少?
  $ ls -ld um*
  单元六实验
  Linux 文件系统基础
  估计用时:1小时30分钟
  目标:形成对Linux 文件系统的更充分的理解,包括:建立和使用link,使用mtools 包以处理DOS 文件系统,使用slocate 和find,并将文档打包和压缩。
  实验前准备:一台装有Red Hat Linux 系统的机器,你在实验2中需要一张空白软盘。
  实验1:建立并使用link
  任务:
  1、在早先的实验中,你应该拷贝了/usr/share/dict/words 到你的帐号——student 的home目录中,并命名为words。当时,这样做的原因是为了使你访问这个文件更简单。现在,我们使用link 来达到同样的效果。
  2、为了避免原来的文件和拷贝文件的混淆,我们删除words 文件的拷贝。
  $ cd
  $ rm words
  3、如果这时候你还没有意识到的话,你早些使用的/usr/share/dict/words 实际上是一个soft link。列出/usr/share/dict,看看link 和它的指向:
  $ ls -l /usr/share/dict
  total 404
  -rw-r--r-- 1 root root 409305 Apr 3 10:29 linux.words
  lrwxrwxrwx 1 root root 11 Apr 20 17:33 words -> linux.words
  a、你如何知道它是一个soft link?
  b、为什么文件的大小是11字节?
  c、words对所有用户开放所有的访问权限。这会对linux.words 产生什么样的影响?除了root用户能通过这个link 向linux.words 写数据吗?
  4、再次列出文件,这次显示它们所对应的inode。它们是否拥有相同的inode?
  $ ls -i /usr/share/dict
  5、现在在你的home 目录中建立一个symbolic link 和一个hard link,指向
  /usr/share/dict/linux.words:
  $ ln -s /usr/share/dict/linux.words soft
  $ ln /usr/share/dict/linux.words hard
  6、测试你的新link 指向的数据:
  $ head hard soft
  7、用下面的命令测试你建立的link,并回答下列问题:
  $ ls -il hard soft
  $ stat hard soft
  写出文件hard 的大小________,和soft 的大小_________。
  hard 确实使用的数据块________,soft确实使用的数据块__________。
  你如何解释这两个文件在数据块数上的不同?
  hard 的link 数________,soft 的link 数__________。
  hard 的 UID和GID__________,soft的_____________。
  文件hard 由root 所拥有,并对其他用户只开放读权限。student 用户是否可以删除这个新建的文件?为什么?
  8、挑战:
  a、你能建立一个symbolic link 指向一个不存在的文件吗?在这种情况下ls 命令是否给出任何提示?
  b、你能建立一个hard link 指向一个不存在的文件吗?为什么?
  c、你能建立一个hard link 指向一个soft link 吗?如果你这样做的话会出现什么情况?
  d、在建立了几个hard link 之后,你如何找出“真正”的文件?这个问题有意义吗?(换句话说,有没有比你建立hard link 更“真实”的文件?)
  实验2:使用mtools 包(省略)
  实验3:使用find
  任务:
  设计并执行满足下面条件的find 命令。当你执行时递归搜索到一些你没有读权限的子目录时
  你可能会遇到一些"Permission denied"消息,别去管它。你也可以在末尾加上2> /dev/null来消除这些错误消息的影响。
  第一个问题的答案已经给出,执行它,并把其他的完成。你可能需要翻看man page,并记住使用/string 来搜索你需要的字串。如果你哪里卡住了,你可以翻看在实验4后列出的答案。
  1、列出在/var/lib下games 用户拥有的所有文件
  $ find /var/lib -user games 2> /dev/null
  2、列出在/var 下root 用户和mail 组所拥有的所有文件
  3、以"ls -l"风格列出在系统上所有不被root 或者bin 或者student 用户所拥有的文件
  4、以"ls -l"风格列出/usr/bin 下所有大于一百万个字符的文件
  5、对/etc/mail 下所有的文件执行file 命令
  6、以"ls -l"风格列出/tmp 下为student 用户所拥有的“普通”文件(regular files)
  7、添加上面的命令使得以"ls -l"风格列出/tmp 下为student 用户所拥有的“普通”文件
  (regular files),并且它们的修改时间在一天之前
  8、改变上面的命令使得删除在/tmp 下为stduent 用户所拥有的“普通”文件(regular files),并且它们的修改时间在一天之前。并且在每个文件删除之前都提示是否删除。
  实验4:归档和压缩
  假设:
  你的主硬盘在你每次使用它的时候发出可怕的声音,你估计它快完蛋了并且会将你珍贵的资料一起带入坟墓。考虑到上次的系统备份是2年半之前,你决定备份一些对于你来说至关重要的文件。/tmp 目录是位于另外一个物理硬盘上的分区,所以你会暂时将你的文件备份到那里。
  (然而,tmpwatch 进程会将/tmp 目录中10天没有访问过的文件删除,你最好不要在那里把你的重要文件存放过长时间。)
  任务:
  1、使用find 查找/home 下所有被student 所拥有的文件,然后将这些文件名传给tar 并把它们存储在/tmp 中。
  $ find /home -user student -exec tar rvf /tmp/backup.tar {} \;
  2、将/etc 内的内容存储在/tmp 中的另外一个tar 文件中:
  $ tar cvf /tmp/confbackup.tar /etc
  3、列出两个新文件并记录它们的大小:
  $ ls -lh /tmp/*.tar
  backup.tar 文件的大小_________。
  confbackup.tar 文件的大小_________________。
  4、使用gzip 来压缩你的归档文件。然后记录新的文件大小:
  $ cd /tmp
  $ gzip *.tar
  $ ls -lh *tar*
  backup.tar.gz 文件的大小______________。
  confbackup.tar.gz 文件的大小__________________。
  5、解压这些文件,并重新将它们用bzip2压缩,并记录新的文件大小:
  $ gunzip *.gz
  $ ls -lh *tar
  $ bzip2 *tar
  $ls -lh *tar*
  backup.tar.bz2 文件大小________________。
  confbackup.tar.bz2 文件大小_________________。
  6、在一个传统UNIX系统上,归档文件并压缩归档的步骤是分开的,就像你前面所做的那样。
  在一个Linux 系统上,使用GNU tar 命令,tar 文件可以在建立文件的同时自动地进行一系列不同的压缩。试试下面的步骤。tar 命令会输出一些错误信息,因为非特权用户在/etc 目录下对一些文件没有读权限。在本实验中,可以忽略。
  $ rm confbackup.tar.bz2
  $ tar cfz test1.tgz /etc
  $ tar cfj test2.tbz /etc
  $ file test*
  完成:你导入的文件已经在/tmp 目录下安全地归档、压缩并备份了。
  实验3答案:
  2、find /var -user root -and -group mail 2>/dev/null
  3、find / -not -user root -and -not -user bin -and -not -user student -ls
  2>/dev/null
  4、find /usr/bin -size +1000000c -ls
  5、find /etc/mail -exec file {} \;
  6、find /tmp -user student -ls 2>/dev/null
  7、find /tmp -user student -and -mtime +1 -and -type f -ls 2>/dev/null
  8、find /tmp -user student -and -mtime +1 -and -type f -ok rm {} \;
  单元七实验
  bash shell
  估计用时:45分钟
   单元三实验
  文件和目录操作
  估计用时:1小时30分
  目标:熟悉文件、目录操作命令的数、语法和几个文件的使用。实验将这些命令组合成一个一般的用户任务。
  实验前准备:准备一个安装好的Red Hat Linux 系统,并准备一个叫student 的非特权帐号,其密码为student。检查一下指南以确认这个帐号是否已经存在在系统中。如果你的student 帐号还未建立,则按如下次序操作:
  1、以root 用户登录
  2、输入 # useradd student
  3、输入 # passwd student
  Changing password for user student
  New UNIX password: {在这里输入student}
  BAD PASSWORD: it is based on a dictionary word
  Retype new UNIX password {重新输入student}
  passwd: all authentication tokens updated successfully
  实验1:目录和文件管理
  假设:
  你在你的home 目录中收集了一大堆文件,而你觉得现在该是将他们整理一下的时候了。你打算建立几个新的子目录,并将拷贝或者移动它们以适合你的安排。除此之外,还有一些文件你根本用不着,你想删除它们。
  任务:
  1、在tty1 上以student登录。密码为student。
  2、刚刚登录后你应该在你的home 目录中。用"print working directory"命令校验一下。
  $ pwd
  /home /student
  3、用一下命令检查一下你在home 目录中有否文件:
  $ ls
  $ ls -a
  $ ls -al
  为什么第一个命令和第二个命令返回不同的文件个数?
  从第三个命令的输出中你看出哪个文件在你当前的home 目录中最大?
  在home 目录中有子目录吗?
  4、你将使用touch 命令来建立一些这个实验所需要的文件。关于这个命令的具体问题将在今后的章节中讲述。现在,你只需简单的将下面的命令全盘打出(包括花括号{},还有几个下划线 _)。
  $ touch {report,memo,graph}_{sep,oct,nov,dec}_{a,b,c}{1,2,3}
  5、使用ls 命令检验上一个命令的效果。你应该发现在你的home 目录中有108个(哇……)新建立的空文件。这些文件便是你后面实验所需的数据文件。如果没有这些文件,后面的实验将无法继续。
  6、为了管理你的文件你必须建立一些新子目录。使用mkdir 命令建立你的home目录的直接子目录:
  $ mkdir "A Reports"
  $ mkdir september october november december
  再次使用ls 命令检验你的工作。
  7、在你新建的子目录中再建立一些其他的目录,使用如下命令:
  输入下面任一一行:
  $ cd A\ Reports/
  或者
  $ cd "A Reports"/
  改变了当前目录。然后:
  $ mkdir 1 2 3
  使用ls 命令校验你已经在"A Reports"目录中有了3个子目录,分别叫做1, 2, 3。
  8、将所有含"B"的文件移出你的home 目录并以月份分组。做类似这种复杂的通配字符的操作时,通常先将其“预览”一遍会是个不错的主意,它可以让你确认是在正确的文件上进行了操作。其中一种方法是将你的命令替换成一种“无害”的命令。
  $ cd
  $ ls -l *dec?b?
  你应该看到有9个"december", "b"文件被列出。现在移动它们:
  $ mv *dec?b? december/
  列出december 子目录以确认移动操作顺利完成了。
  $ ls -l december/
  total 0
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 graph_dec_b1
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 graph_dec_b2
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 graph_dec_b3
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 memo_dec_b1
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 memo_dec_b2
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 memo_dec_b3
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 report_dec_b1
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 report_dec_b2
  -rw-rw-r-- 1 student student 0 Oct 16 22:16 report_dec_b3
  9、将所有剩下的"B"文件分别移入相应的目录:
  $ mv *nov?b? november
  $ mv *oct?b? october
  $ mv *sep?b? september
  10、现在你将"A"文件移动到它们相应对数字的目录中去:
  $ cd "A Reports"/
  $ mv ~/*_a1 1/
  "a1","september"文件不需要了。删除它们并确认剩下的文件已正确的移动了。
  $ cd 1
  $ rm *sep*
  $ ls
  graph_dec_a1 graph_oct_a1 memo_nov_a1 report_dec_a1 report_oct_a1
  graph_nov_a1 memo_dec_a1 memo_oct_a1 report_nov_a1
  11、将最后的"a2"和"a3"文件移入相应的数字目录中去:
  $ pwd
  /home/student/A Reports/1
  使用相对路径移动"a2"文件:
  $ mv ../../*a2* ../2/
  使用绝对路径移动"a3"文件
  $ mv /home/student/*a3* /home/student/A\ Reports/3/
  12、回到你的home目录下,并用ls 确认在该目录下只剩下"c"文件。
  13、每个月的"c1"和"c2"文件很重要,你想将它们备份到另外一个目录中去:
  $ mkdir /tmp/archive
  $ cp report*[1-2] /tmp/archive/
  除此之外所有December月份的文件应备份到/tmp/archive 目录中。注意使用 -i 选项以使cp 命令在覆盖文件时提示。
  $ cp -i report_dec* /tmp/archive/
  cp: overwrite '/tmp/archive/report_dec_c1'? n
  cp: overwrite '/tmp/archive/report_dec_c2'? n
  14、现在你已经备份了一些对你来说重要的"C"文件,你想删除所有还留在你home 目录里的文件。用通配符*c*检验所剩余的文件。为什么你不能用rm *c*删除?
  (提示:试试ls *c* 看看)
  15、删除所剩余的"c"文件:
  $ rm *c[1-3]
  $ ls
  A Reports december november october september
  完成:
  一个良好组织的home 目录,文件都放在合适的子目录中。一些文件备份在/tmp/archive 目录中。
  实验2:检测磁盘使用程度
  假设:
  你想检测系统上每个文件系统所剩余的空间。除此之外,你需要有个包含最占磁盘空间的目录的列表。
  任务:
  1、使用df 检测文件系统上剩余的空间。输出将类似于如下所示(这当然取决于你的机器安装和配置)。
  $ df
  Filesystem 1k-blocks Used Available User% Mounted on
  /dev/hda5 12880648 1634344 10591988 14% /
  /dev/hda1 36566 2476 32202 8% /boot
  2、注意缺省的df 命令是以块(block)为单位输出的。试着使用-h 和-H 选项产生更人性化的输出:
  $ df -h
  Filesystem 1k-blocks Used Available User% Mounted on
  /dev/hda5 12G 1.6G 10G 14% /
  /dev/hda1 36M 2.5M 31M 8% /boot
  $ df -H
  Filesystem 1k-blocks Used Available User% Mounted on
  /dev/hda5 13G 1.7G 10G 14% /
  /dev/hda1 37M 2.6M 32M 8% /boot
  两种选项有何区别?(用man df 查找答案)
  3、在home 目录下使用du (disk usage)命令检测你的home 目录使用了多少空间。务必使用-h 选项产生人性化输出。
  实验3:检测文本文件
  任务:
  1、首先,我们需要一个文本文件:
  $ cd
  $ cp /usr/share/dict/words .
  2、使用cat 命令显示文件
  $ cat words
  Aarhus
  Aaron
  Ababa
  ......输出省略......
  Zulu
  Zulus
  Zurich
  3、cat 在这种情况下是一个糟糕的选择,因为输出翻屏得很快。试着使用less:
  $ less words
  Aarhus
  Aaron
  Ababa
  ......输出省略......
  abducts
  Abe
  abed
  ......输出省略......
  用less 你可以往回翻(用b)和往前翻(用空格键),一次一个屏幕。
  4、若你只需要快速浏览一下一个文件的头部或者尾部,你可以使用head 或者tail:
  $ head words
  Aarhus
  Aaron
  Ababa
  aback
  abaft
  abandon
  abandoned
  abndoning
  abandonment
  abandons
  $ tail words
  zoologically
  zoom
  zooms
  zoos
  Zorn
  Zoroaster
  Zoroasterian
  Zulu
  Zulus
  Zurich
  使用man 搜索head 和tail,找到可以修改显示行数、和显示的相对位置的选项。
  哪个命令可以显示某文件的前50行?
  哪个命令可以显示某个文件从25000行开始,到其结束?
  单元四实验:用户信息和man
  估计用时:30分钟
  目标:熟悉几个用户识别和帐户切换命令的使用。
  实验前准备:准备一个安装好,完成过单元三实验的Red Hat Linux 系统,除此之外一个叫visitor 的非特权帐号,其密码为visitor。检查一下指南以确认这个帐号是否已经存在在系统中。如果你的visitor 帐号还未建立,则按如下次序操作:
  1、以root 用户登录
  2、输入 # useradd visitor
  3、输入 # passwd visitor
  Changing password for user visitor
  New UNIX password: {在这里输入visitor}
  BAD PASSWORD: it is based on a dictionary word
  Retype new UNIX password {重新输入visitor}
  passwd: all authentication tokens updated successfully
  实验1:本地用户登录
  任务:
  1、完全注销你的登陆。务必确认你也退出了所有的虚拟终端和X Window 系统。
  2、按切换到虚拟终端1(tty1)。
  3、以root身份登录。
 
 单元五:文件访问许可
  所有文件都有一个拥有者(owned by a user),并和一个组(group)相连。
  因此一个用户是否有权限读写或者执行一个文件,是由这个文件是否被赋予了相应的权限所决定的。权限可以设定给文件拥有者,文件所在的组,或者其他任何人。
  可由ls -l 命令来查看文件权限(permissions):
  $ ls -l /bin/login
  -rwxr-xr-x 1 root root 19080 Apr 1 18:26 /bin/login
  可以看到文件的访问权限由10个字符表示。
  文件访问权限为三种用户种类使用。每个种类都有一个表示字符:
  u ——文件的拥有者(owner)
  g ——文件所在组的其他用户
  o ——任何用户(others)
  每个种类的访问权限都彼此独立,互不相关。
  三种标准文件访问类型:
  r ——文件的读权限/罗列目录内容的权限(list a directory's contents)
  w ——文件的写权限/在目录中建立或删除文件的权限
  x ——文件的执行权限/访问目录中文件的权限,例如cd 到该目录
  此三种标准文件访问类型可以赋给上述的三种文件访问权限的用户种类,即u、g、o。
  文件访问权限中,第2、3、4个字符表示了文件拥有者的权限;第5、6、7个字符表示了文件组的权限;第8,9,10个字符表示了其他用户的权限。例如:
  $ ls -l /bin/login
  -rwxr-xr-x 1 root root 19080 Apr 1 18:26 /bin/login
  说明了该文件的拥有者可以读写并执行该文件,其他的用户(包括组内用户)可以读、执行该文件。又例:
  $ ls -l README
  -rw-rw-r-- 1 andersen visitor 2948 Oct 11 14:07 README
  该文件可以由visitor组内的用户读写,但是并不能执行;能被其他用户读,但是其他用户不能改写它或者执行它。
  文件访问权限中的第一个字符"d"将目录和其他文件予以区分:
  $ ls -ld /bin
  drwxr-xr-x 2 root root 4096 Apr 20 18:13 /bin/
  更多例子:
  用户fred 是组fred 和组staff 的成员
  用户mary 是组mary 和组admin, staff 的成员
  文件fileA 拥有者是fred,拥有者组是 fred
  文件fileB 拥有者是mary,拥有者组是 root
  文件fileC 拥有者是root,拥有者组是 staff
  给出下表
  ----------------------------------------------
  user fileA fileB fileC
  ----------------------------------------------
  fred u,g,o o, o,g
  mary o u,o o,g
  root u,g,o u,g,o u,g,o
  如果fileA 有访问权限rwxr-xr--,那么它访问权限如下:
  read write excute
  ------------------------------------
  fred yes yes yes
  mary yes no no
  root yes yes yes
  改变文件权限用chmod 命令,chmod 后跟一个表达式,表达式可以为一串数字或者一段预置的代码组合:改变谁的(who),操作符(operator)和权限(permission)。
  改变谁的(who)可以有下面的选择:
  u 文件拥有者
  g 在文件组内的用户
  o 其他用户
  a 所有用户
  操作符(operator)可以有下面的选择:
  + 增加权限
  - 删除权限
  = 将权限赋予…
  权限(permission)可以有下面的选择:
  r 读
  w 写
  x 执行(对于目录来说是访问)
  s Set userID bit(第四位)或者set groupID bit(第七位)
  t Set sticky bit(对于目录来说便是——防止其他非拥有者删除目录中的文件,位于第10位)
  例如:
  $ chmod g+w .bash_profile
  该命令将写权限赋予了文件组内的用户。
  $ chmod go-rw .bash_profile
  该命令剥夺了非拥有者用户的读写权限。
  chmod 中有一个有用的参数为-R (递归,注意大写),可以将整个目录中的文件和子目录的权限全部改写。
  前面提到还有一种方法可以修改文件权限,就是数字方式。以三个数字的方式确定文件的访问权限。第一个数字代表拥有者权限、第二个代表文件所在组内的用户权限、第三个代表其他用户权限。权限表达式由以下数字相加而得:
  4 (读权限)
  2 (写权限)
  1 (执行权限)
  例:设置文件file 为所有人均为只读权限:
  $ chmod 444 file
  例:设置文件file 为拥有者拥有读写和执行权限,组内用户有读和执行权限、其他用户无任何权限:
  $ chmod 750 file
  还要提一下默认的文件权限。默认的文件权限,是由umask 来决定的。非特权用户的umask 为002,即文件默认权限为664;而root 用户的umask 为022,即文件默认权限为644。
  如果没有umask 的话,所有文件都会默认为666权限,意味着所有人都可以读写新建的文件。注意所有新建的文件都没有执行权限,即使umask 也无能为力。所有的执行文件都要显式的给出执行权限才能运行。但是对于目录来说,无论umask 的值是多少,新建目录时就默认赋予了执行权限(可以访问目录)。
  要改变umask,只需打:
  $ umask 022
  这样就使得原本默认的002 umask值改为022。但是当下次再登录的时候,umask 又会改回到原来的值,这就需要你在bash 的初始化脚本(initialization script)中加入特定的umask 值。
  除了三种标准访问权限外,还有前面提到过的三种特殊权限。它们是setuid、setgid 和sticky 位。
  (下面我的理解不知道正确与否,希望高手指点!)
  setuid 位将进程的用户ID (user ID)设置为文件的用户ID,对目录无效。
  setuid 是一个非常强大也很危险的工具。比如,如果一个程序设置了setuid 位而且它的拥有者是root,那么当该程序执行时它就拥有了root 用户执行这个程序的特权。有些程序必须使用它来使程序正确运行。比如ping 程序必须设置setuid 为root,因为它要在网络上传输ICMP包的裸数据。任何setuid 的程序必须小心编写并排除安全漏洞。
  setgid 位将进程的组ID (group ID)设置为文件的组ID,对目录来说,它迫使所有在该目录中创建的文件都拥有与该目录相同的组,而无论文件的创建者是谁。
  setgid 和setuid 一样,也很强大,应该小心使用。因为它允许无意识的对文件和资源的访问。举例来说,minicom 终端模拟器程序设置setgid 为uucp 组,它提供了向计算机的串行口访问的权限(组uucp 拥有该种权限)。
  sticky 位作用在目录上,防止用户删除它们并不拥有的文件(files they do not own)。sticky 位典型的应用便是在/tmp 目录中,防止用户删除彼此的文件。sticky 位在文件上没有效果。
  单元六:Linux文件系统
  文件和目录被组织在一个单根(single-rooted)反向树状结构中。包括独立的物理设备卷,比如软盘、CDROM或多个硬盘。反向树状结构的基点(最高点)为根目录或者叫"/"。
  文件名是大小写敏感的,"/"符号为界定符,分开路径名的各个元素。例如 /usr/bin/X11/X
  每个shell 和系统进程都有一个“当前目录”。".."表示当前目录的上一级目录,"."表示当前目录。文件或者目录以"."开头的是所谓的隐藏文件,它们在默认的罗列中不出现。
  一个用户的路径(path)是一串目录,用以搜索执行命令的程序所在。
  /(root)
  ______________________________________________|______________________________________
  | | | | | | | | | | | | | | |
  etc bin sbin lib root usr mnt var boot tmp opt dev home proc lost+found
  bin: 用来储存用户命令。/usr/bin 目录也存放用户命令。
  sbin: 系统命令例如shutdown 之类的所在。/usr/sbin 目录也存放许多系统命令。
  root: 超级用户的home 目录。
  mnt: 通常在系统启动以后含有文件系统装载的装载点(mount point)。
  boot: 含有在系统启动时所用到的内核和其他文件。
  lost+found: fsck 使用用来存储找到的文件碎片(无文件名的文件)。
  lib: 含有许多在/bin 和/sbin 下的程序所用到的库文件。/usr/lib 目录下含有更多的库文件。
  dev: 存储设备文件。
  etc: 含有许多配置文件和目录。
  var: 存储像系统日志和打印池等“变量”文件。
  proc: 一个含有系统进程信息的虚拟文件系统(不存储在磁盘上)
  tmp: 一个用户和程序的“草稿本”,/tmp 对所有人和所有进程开放读写权限。
  opt: 类似StarOffice 这种第三方包的安装目录。
  以下是关于ext2/ext3 文件系统的细节。
  当ext2/ext3文件系统建立时,系统的元数据(metadata)就存储在超级块中(superblock)。因为这些数据对于操作文件系统来说至关重要,所以同时也建立了一份文件系统超级块的拷贝。(比方在小的文件系统上每8192个块建立一份拷贝)。dumpe2fs 命令可以查看超级块上的数据。超级块(superblock)含有文件系统的元数据(metadata):卷名,UID,inode数,块数,保留块数,块组的位置等等。
  inode 就像数据在块上的描述。inode 不存储文件的真实数据,而是存储文件的信息。stat 命令可以帮助我们查看文件的inode 从而得知是如何存储在文件系统中的。
  $ stat passwd
  File: "passwd"
  Size: 1129 Blocks: 8 IO Block: 4096 Regular File
  Device: 306h/774d Inode: 214057 Links: 1
  Access: (0644/-rw-r--r--) Uid: (0/root) Gid: (0/root)
  Access: Sat Sep 29 13:34:57 2001
  Modify: Sun Sep 23 17:12:41 2001
  Change: Sun Sep 23 17:12:41 2001
  下面是硬连接(hard link)的概念。
  硬连接是一个在文件系统中“物理存在”的文件,每个link 指向文件的inode。它使得一个文件拥有两个或以上名字成为可能。注意,用户可以link 他们不拥有的文件,但是还是会被inode
                      RHCE课堂笔记整理(2)
单元五:文件访问许可

所有文件都有一个拥有者(owned by a user),并和一个组(group)相连。
因此一个用户是否有权限读写或者执行一个文件,是由这个文件是否被赋予了相应的权限所决定的。权限可以设定给文件拥有者,文件所在的组,或者其他任何人。

可由ls -l 命令来查看文件权限(permissions):
$ ls -l /bin/login
-rwxr-xr-x 1 root root 19080 Apr 1 18:26 /bin/login

可以看到文件的访问权限由10个字符表示。

文件访问权限为三种用户种类使用。每个种类都有一个表示字符:
u ——文件的拥有者(owner)
g ——文件所在组的其他用户
o ——任何用户(others)
每个种类的访问权限都彼此独立,互不相关。

三种标准文件访问类型:
r ——文件的读权限/罗列目录内容的权限(list a directory's contents)
w ——文件的写权限/在目录中建立或删除文件的权限
x ——文件的执行权限/访问目录中文件的权限,例如cd 到该目录
此三种标准文件访问类型可以赋给上述的三种文件访问权限的用户种类,即u、g、o。

文件访问权限中,第2、3、4个字符表示了文件拥有者的权限;第5、6、7个字符表示了文件组的权限;第8,9,10个字符表示了其他用户的权限。例如:
$ ls -l /bin/login
-rwxr-xr-x 1 root root 19080 Apr 1 18:26 /bin/login

说明了该文件的拥有者可以读写并执行该文件,其他的用户(包括组内用户)可以读、执行该文件。又例:
$ ls -l README
-rw-rw-r-- 1 andersen visitor 2948 Oct 11 14:07 README

该文件可以由visitor组内的用户读写,但是并不能执行;能被其他用户读,但是其他用户不能改写它或者执行它。

文件访问权限中的第一个字符"d"将目录和其他文件予以区分:
$ ls -ld /bin
drwxr-xr-x 2 root root 4096 Apr 20 18:13 /bin/

更多例子:
用户fred 是组fred 和组staff 的成员
用户mary 是组mary 和组admin, staff 的成员
文件fileA 拥有者是fred,拥有者组是 fred
文件fileB 拥有者是mary,拥有者组是 root
文件fileC 拥有者是root,拥有者组是 staff
给出下表
----------------------------------------------
user fileA fileB fileC
----------------------------------------------
fred u,g,o o, o,g
mary o u,o o,g
root u,g,o u,g,o u,g,o
如果fileA 有访问权限rwxr-xr--,那么它访问权限如下:
read write excute
------------------------------------
fred yes yes yes
mary yes no no
root yes yes yes

改变文件权限用chmod 命令,chmod 后跟一个表达式,表达式可以为一串数字或者一段预置的代码组合:改变谁的(who),操作符(operator)和权限(permission)。

改变谁的(who)可以有下面的选择:
u 文件拥有者
g 在文件组内的用户
o 其他用户
a 所有用户

操作符(operator)可以有下面的选择:
+ 增加权限
- 删除权限
= 将权限赋予…

权限(permission)可以有下面的选择:
r 读
w 写
x 执行(对于目录来说是访问)
s Set userID bit(第四位)或者set groupID bit(第七位)
t Set sticky bit(对于目录来说便是——防止其他非拥有者删除目录中的文件,位于第10位)

例如:
$ chmod g+w .bash_profile
该命令将写权限赋予了文件组内的用户。

$ chmod go-rw .bash_profile
该命令剥夺了非拥有者用户的读写权限。
chmod 中有一个有用的参数为-R (递归,注意大写),可以将整个目录中的文件和子目录的权限全部改写。

前面提到还有一种方法可以修改文件权限,就是数字方式。以三个数字的方式确定文件的访问权限。第一个数字代表拥有者权限、第二个代表文件所在组内的用户权限、第三个代表其他用户权限。权限表达式由以下数字相加而得:
4 (读权限)
2 (写权限)
1 (执行权限)

例:设置文件file 为所有人均为只读权限:
$ chmod 444 file
例:设置文件file 为拥有者拥有读写和执行权限,组内用户有读和执行权限、其他用户无任何权限:
$ chmod 750 file

还要提一下默认的文件权限。默认的文件权限,是由umask 来决定的。非特权用户的umask 为002,即文件默认权限为664;而root 用户的umask 为022,即文件默认权限为644。

如果没有umask 的话,所有文件都会默认为666权限,意味着所有人都可以读写新建的文件。注意所有新建的文件都没有执行权限,即使umask 也无能为力。所有的执行文件都要显式的给出执行权限才能运行。但是对于目录来说,无论umask 的值是多少,新建目录时就默认赋予了执行权限(可以访问目录)。

要改变umask,只需打:
$ umask 022
这样就使得原本默认的002 umask值改为022。但是当下次再登录的时候,umask 又会改回到原来的值,这就需要你在bash 的初始化脚本(initialization script)中加入特定的umask 值。

除了三种标准访问权限外,还有前面提到过的三种特殊权限。它们是setuid、setgid 和sticky 位。

(下面我的理解不知道正确与否,希望高手指点!)
setuid 位将进程的用户ID (user ID)设置为文件的用户ID,对目录无效。
setuid 是一个非常强大也很危险的工具。比如,如果一个程序设置了setuid 位而且它的拥有者是root,那么当该程序执行时它就拥有了root 用户执行这个程序的特权。有些程序必须使用它来使程序正确运行。比如ping 程序必须设置setuid 为root,因为它要在网络上传输ICMP包的裸数据。任何setuid 的程序必须小心编写并排除安全漏洞。

setgid 位将进程的组ID (group ID)设置为文件的组ID,对目录来说,它迫使所有在该目录中创建的文件都拥有与该目录相同的组,而无论文件的创建者是谁。
setgid 和setuid 一样,也很强大,应该小心使用。因为它允许无意识的对文件和资源的访问。举例来说,minicom 终端模拟器程序设置setgid 为uucp 组,它提供了向计算机的串行口访问的权限(组uucp 拥有该种权限)。

sticky 位作用在目录上,防止用户删除它们并不拥有的文件(files they do not own)。sticky 位典型的应用便是在/tmp 目录中,防止用户删除彼此的文件。sticky 位在文件上没有效果。

单元六:Linux文件系统

文件和目录被组织在一个单根(single-rooted)反向树状结构中。包括独立的物理设备卷,比如软盘、CDROM或多个硬盘。反向树状结构的基点(最高点)为根目录或者叫"/"。
文件名是大小写敏感的,"/"符号为界定符,分开路径名的各个元素。例如 /usr/bin/X11/X
每个shell 和系统进程都有一个“当前目录”。".."表示当前目录的上一级目录,"."表示当前目录。文件或者目录以"."开头的是所谓的隐藏文件,它们在默认的罗列中不出现。
一个用户的路径(path)是一串目录,用以搜索执行命令的程序所在。

/(root)
______________________________________________|______________________________________
| | | | | | | | | | | | | | |
etc bin sbin lib root usr mnt var boot tmp opt dev home proc lost+found

bin: 用来储存用户命令。/usr/bin 目录也存放用户命令。
sbin: 系统命令例如shutdown 之类的所在。/usr/sbin 目录也存放许多系统命令。
root: 超级用户的home 目录。
mnt: 通常在系统启动以后含有文件系统装载的装载点(mount point)。
boot: 含有在系统启动时所用到的内核和其他文件。
lost+found: fsck 使用用来存储找到的文件碎片(无文件名的文件)。
lib: 含有许多在/bin 和/sbin 下的程序所用到的库文件。/usr/lib 目录下含有更多的库文件。
dev: 存储设备文件。
etc: 含有许多配置文件和目录。
var: 存储像系统日志和打印池等“变量”文件。
proc: 一个含有系统进程信息的虚拟文件系统(不存储在磁盘上)
tmp: 一个用户和程序的“草稿本”,/tmp 对所有人和所有进程开放读写权限。
opt: 类似StarOffice 这种第三方包的安装目录。

以下是关于ext2/ext3 文件系统的细节。

当ext2/ext3文件系统建立时,系统的元数据(metadata)就存储在超级块中(superblock)。因为这些数据对于操作文件系统来说至关重要,所以同时也建立了一份文件系统超级块的拷贝。(比方在小的文件系统上每8192个块建立一份拷贝)。dumpe2fs 命令可以查看超级块上的数据。超级块(superblock)含有文件系统的元数据(metadata):卷名,UID,inode数,块数,保留块数,块组的位置等等。

inode 就像数据在块上的描述。inode 不存储文件的真实数据,而是存储文件的信息。stat 命令可以帮助我们查看文件的inode 从而得知是如何存储在文件系统中的。
$ stat passwd
File: "passwd"
Size: 1129 Blocks: 8 IO Block: 4096 Regular File
Device: 306h/774d Inode: 214057 Links: 1
Access: (0644/-rw-r--r--) Uid: (0/root) Gid: (0/root)
Access: Sat Sep 29 13:34:57 2001
Modify: Sun Sep 23 17:12:41 2001
Change: Sun Sep 23 17:12:41 2001

下面是硬连接(hard link)的概念。
硬连接是一个在文件系统中“物理存在”的文件,每个link 指向文件的inode。它使得一个文件拥有两个或以上名字成为可能。注意,用户可以link 他们不拥有的文件,但是还是会被inode 上的信息所限制。hard link 经常作为输入长路径名的一种节省办法。
hard link 不能跨盘或者跨分区操作,这是因为hard link 指向的inode 在一个分区内是唯一的,但是在整个文件系统中并不唯一。且不能为一个目录建立hard link。
使用ln filename [linkname] 来建立hard link。
使用ls -i 显示当前目录中所有文件的inode 号。
使用ls -l ,在第二列显示了该文件的hard link 个数。当一个文件的hard link 的个数为0,那么它已经被删除。

下面是软连接(或者符号连接)的概念。
软连接(symbolic link)是一种linux 文件类型(l)。"l"会出现在文件访问权限的第一个字符。
和hard link 不一样,它存储了它指向的另外一个文件的完整文件名。如果那个被指向的文件被改名了或者删除了,那么这个symbolic link 就没有指向。因此,symbolic link 也可以指向实际不存在的文件。此外symbolic link 也可指向跨分区的文件和目录,这两点是hard link 所做不到的。
使用ln -s filename [linkname] 建立symbolic link。
使用ls -l 可以查看symbolic link 的指向。例如:
$ ln -s /etc/passwd password
$ ls -l password /etc/passwd
lrwxrwxrwx 1 doug doug 11 May 19 18:41 password -> /etc/passwd
-rw-r--r-- 1 root root 919 May 13 19:07 /etc/passwd

symbolic link 总是有完全访问权限777。并且注意文件大小,11字节,正好是"/etc/passwd"这些字母数。

关于可移动介质,它们在被使用前必须先装载(mount)——使用mount 命令。同样地,在可移动介质被拿走之前,必须先卸载(unmount)——使用umount 命令。例如:
mount -t vfat /dev/fd0 /mnt/floppy ——装载一张软盘
mount /mnt/floppy ——利用fstab 装载软盘
mount -t iso9660 /dev/cdrom /mnt/cdrom ——装载CDROM
mount /mnt/cdrom ——利用fstab 中的信息装载CDROM

此外如果你安装了AutoFS 的rpm 包,那么你的系统就可配置成自动装载的。缺省的配置文件在/etc/auto.master 和/etc/auto.misc 中。

如果你安装了mtools 包,那么它可以帮你访问FAT 文件系统,可以在不用装载的情况下使用FAT 格式的软盘或者硬盘。命令就是m后跟dos命令。例如mdir。

搜索文件方面,linux 提供了slocate 命令和find 命令。
slocate 命令没有find 那么强大,但是很快。因为它使用了系统的一个每天更新的数据库,而不是像find 一样即时查找。find 更灵活,你可以用上多种参数和选项,并指定如文件类型、拥有者、修改日期等。

slocate 语法:slocate [pattern] 或者 locate [pattern]
注:在Red Hat Linux 系统中,locate 是slocate 的一个symbolic link。slocate 使用的是系统每日更新的数据库,所以若是在上次更新后又添加或者改动的文件它是无能为力的。

find 语法:find [path] [options] [expression]
find 最主要的工作就是生成一个文件或者目录名的列表。find 会沿着在[path]中指定的路径名递归向下查找知道所有符合条件的文件都被列出了。可以使用-name 选项限制列出的文件,在使用通配符时请务必加上双引号" "。
例如:find . -name index.html
find . -name "*.html"
find 的其他一些选项:
-atime +n, -n 列出多于/少于n天前被访问过的文件。
-mtime +n, -n 列出多于/少于n天前被修改过的文件。
-user uname 列出被uname 用户所拥有的文件
-group gname 列出被gname 组所拥有的文件
-perm mode 列出符合8进制的访问权限的文件
-size n[c] 列出占用n块,或者当有c 出现时,n个字符的文件。
-type c 列出c 类型的文件,c 可能是:b(block specail
file)、c(character special file)、d(directory)、
p(fifo or named pipe)、l(symbolic link)、
s(socket)、f(plain file)
-iname pattern 查找的pattern 大小写敏感。

find 的强大之处还在于它可以将找到的文件传给某些命令作为参数。语法:
find dir_list [options] -exec cmd {} \;
注意上面的语法,最后一个分号不要漏掉。
如果执行的命令cmd 需要确认,例如rm,则可用-ok 替代-exec。

Linux 提供了几套压缩文件工具。
# gzip, gunzip 是标准Linux 的压缩工具
# bzip2, bunzip2 是较新的Linux 压缩工具,一般比gzip
压缩比高一点,但是速度慢。bzip2压
缩的文件后缀名为.bz2。
# compress, uncompress 是以前UNIX 的压缩工具

gzip压缩的文件,一般后缀名为.gz,也可在许多非UNIX 平台上使用。另外gunzip 也可以解压用compress 压缩的文件。
用法:gzip [-d] file
gunzip file

其中gzip -d 的作用是解压,可以代替gunzip 命令。后跟的文件名不需打.gz 后缀。

最后要介绍的zip/unzip 是和DOS/Windows 平台下的pkzip/Winzip 相兼容的工具。它可以将多个文件压缩成一个文件,这是gzip 和compress 所作不到的。要在gzip 和compress 中压缩多个文件一般得要先组合成tar 文件,再行压缩。

tar命令源于tape archive 的简写,原本是用来将磁带机上的多个文件组合成一个文件用于传输或者长期保存整个文件系统(!)。虽然tar 不需要特殊的文件后缀,但通常需要在生成的文件后加.tar 后缀标识它是tar文件。

生成tar 文件:tar cvf archive_name source_files
其中source_files可以为多个文件,以空格分开;可以为通配符;也可以是一个目录,则目录下的文件和子目录都将打包进目标文件。

查询tar 文件:tar tf archive_name.tar 或者 tar tvf archive_name.tar
其中v 开关使得tar 生成文件的详细列表。

释放tar 文件:tar xvf archive_name.tar
将tar 文件的目录按照树形结构释放到当前目录。所以在执行前请cd 到目标目录,tar 不能指定目标目录。
tar 还有很多选项像保持原有的文件拥有者和保持原有的文件访问权限等,请查找man page。

压缩生成tar 文件:tar czf archive_name source_files
这里的archive_name 一般为tgz 为后缀。说明是tar 文件用gzip 压缩后的结果。就不用先打成tar 包,然后压缩成.tar.gz 文件了。

还原压缩的tar 文件并释放:tar xzf archive_name.tgz 这样释放回原有的所有文件到当前目录。
还原压缩的tar 文件:gzip -d archive_name.tgz 这样还原成.tar 文件到当前目录(不把tar 包释放)。

注:和Win32平台下不一样,gzip 解压缩后,源文件就不复存在了。例如gzip -d xzf myarchive.tgz 之后,原来的myarchive.tgz 就没有了,取而代之的是一个tar 文件。
还有gzip 压缩后源文件也不存在,变为加.gz 后缀的文件。但tar 打包后源文件依旧。

第七单元:bash shell
在bash shell 中按Ctrl+X 再按Ctrl+V 可获得当前bash 的版本号。echo $BASH_VERSION 也有同样的效果。

shell 脚本(shell scripts) 中的数据和环境设置都是存储在变量中,一般为大写字母。设定变量时,用一个等号来赋值如 FAV_COLOR = blue。而要取得一个变量值,可用$ 后跟环境变量名如 echo $FAV_COLOR。

区分shell 变量和环境变量:环境变量是一个比shell 变量“稍大”的概念。shell 变量只存在于当前shell 实例中,在subshell 中不继承原有的变量。而环境变量会传递给subshell。可以用export 命令将shell 变量输出到环境变量中。
$ EDITOR=/usr/bin/pico; export EDITOR
或者
$ export EDITOR=/usr/bin/pico
将EDITOR 变量置空(null)
$ export EDITOR=

一些通用环境变量:
# HOME 用户home 目录路径
# PATH 可执行文件搜索目录
# LANG 程序可用的语言设置,美国英语是en_US
# LINES 当前终端下可用的行数
# COLUMNS 当前终端下可用列数
# PS1 可用来设置命令行提示符
# EDITOR 定义程序默认调用的文本编辑器

例如:
$ mkdir $HOME/files
$ echo $PATH

PS1变量的组成:
\d 以“星期/月/日”排列的日期
\h 从第一个"."开始起的主机名
\H 完整主机名
\l shell 的终端设备名
\s shell 名
\t 当前24小时时间
\T 当前12小时时间
\@ 当前am/pm格式时间
\u 当前用户名
\w 当前工作目录
\W 当前工作目录的最后一层目录名
\! 该条指令的历史记录数
\\ 反斜杠

which 命令显示执行文件所在的目录,(沿PATH 变量所写的路径查找)例如
$ which xboard
/usr/local/bin/xboard

history 命令显示以前所输入的命令。
!! 重复上个命令
!x 重复上个由x开头的命令,后可跟追加的选项
!n 重复第n个命令(n可由history输出)
!-n 重复前n个命令

此外可使用^old^new 命令将上次的命令中的old 部分换为new,例如:
$ cp filter.c /usr/local/src/project
$ ^filter^frontend
cp frontend.c /usr/local/src/project
还有,你可以在命令行按CTRL-r 来实现从历史命令中查找所需的命令。
在历史命令查找中,输入的序号是history 输出的序号,或者按i 逆向查找。
如果你不想让历史命令中重复的命令和一些区别只在开头有无空格的命令时,你可以用
$ export HISTCONTROL=ignoreboth
来实现。

$的用处:在命令行替换一个变量值如:cd $HOME/public_html
{}的用处:表示{}内的所有组合如:rm hello.{c,o} 相当于 rm hello.c; rm hello.o
更多例子:
$ echo x{,b}
x xb
$ mkdir -p work/{inbox,outbox,pending}/{normal,urgent,import}
形成work 目录下3×3=9个子目录。

``和$()的用处:将''或者$()之内的内容当作命令执行。例如:
$ echo "Hostname: `hostname`"
$ echo "Hostname: $(hostname)"
其中hostname 是显示主机名的命令。注意`(数字1左边的按键)和'(单引号)的区别。

$[]的用处:将其中进行数字运算,然后输出。例如:
$ echo Area: $[$X*$Y]
$ echo Area: `expr $X * $Y` 这是老的sh 版本,必须用expr 命令计算。

[]的用处:将[]中的所有元素都取一遍输出。例如:
$ ls -a /dev/hd[a,b]
hda hdb

\的用处:将之后的一个字符作为“真正的字符”直接输出:
$ echo Your cost: \$5.00
还可以将一行命令分为两行输出(可看作是将回车当作了一般控制字符输出了):
$ ls -l |grep ^d | \
cut -cl7-25 |sort |less

''和""的用处:单引号''将其中所有的字符都看作“真正的字符”直接输出;双引号""将其中的所有字符除$ 、` 和\ 以外都看作“真正的字符”输出。比较:
$ echo "The current date is `date`"
The current date is Sat Apr 27 17:24:25 EDT 2002
$ echo 'The current date is `date`'
The current date is `date`

;的用处:类似程序语言中的分号,用于连接两个命令,依次执行。

()的用处:将两个用;连接的命令当作一个整体。例:
(date; who | wc -l) >> logfile
记录当前时间的登录人数,并敲上时间戳。

nohup 命令可以开始一个后台运行程序,即使你退出后它也继续执行。
$ nohup ar -cvf source.tar /opt/src &
$ exit
缺省状况下,nohup 的输出将会写到 nohup.out 中,如果当前目录不允许写,则写到$HOME/nohup.out,如若仍不成功,则命令不会执行。注意命令后面的&,因为nohup 不会自动将进程放到后台执行,所以需要显式的给出&,使其后台运行。或者按Ctrl-z使其后台运行。

命令返回值:返回0说明正确执行,返回其他数值说明有错误发生。可用$? 显示上条指令的返回值:echo $?
其中||(或)和&&(与)的操作可在shell script 中用来判断命令的返回值。和程序设计语言类似,若上条返回错误(假),则||执行下条,而&& 则跳过下条(与操作已为假)。若上条没有返回错误(真),则||不用执行下条(或操作已为真),而&& 执行下条命令。例如:
$ grep joe passwd || echo 'No joe!'
$ cp -a /tmp/*.o . && echo 'Done!'

aliase 使用户可以建立命令的“快捷方式”例如:alias dir='ls -laF | less'
若想查看所有的alias,直接打$ alias 即可。若想指定显示特定的alias,例$ aliase dir
注意如果你以root 登录,则rm 命令被alias 成rm -i,即每删除一个文件都将有个交互确认过程。如果你不想这样的话,可以使用unalias 命令。或者你可以使用\rm。
如果你想让某个用户在登录时就拥有某些aliase,则你应编辑它的$HOME/.bashrc 文件,在其中加入相应的aliase。如果你想让所有用户都拥有某些aliase,则编辑/etc/bashrc 文件,或者在/etc/profile.d/目录下的某个shell script 文件(由/etc/profile 启动脚本文件指定)中加入你所需要的alias 语句。

关于/etc/profile 文件,是整个系统的启动脚本文件,作用在所有用户上,设定函数、环境变量、路径和aliase 等等。当且仅当bash 是作为登录的shell 时,profile文件才会执行。

关于/etc/profile.d/目录,是/etc/profile 文件指定的目录,在profile 执行时,它检索/etc/profile.d/目录下的所有shell script,并执行之(理解错误之处还请指教!)。

其他的一些启动脚本,一个是~/.bash_profile,作用是为/etc/profile 添加一些定制的设定,只作用在当bash 是登录shell 时;另一个是~/.bashrc,所有的shell 都会使用它(有点不理解)。

关于.bash_logout,当用户从登录shell 中退出时,该script 执行一些诸如备份、删除临时文件的工作。

前面我们说到过<TAB>可以使用户避免输入冗长的命令,它会自动完成command completion。如果你在按<TAB>键时不想出现某些文件,可以在.bashrc 文件中加入
export FIGNORE='.bak'

如果你的命令比较长或者需要修改历史命令的话,那么命令行编辑就是必不可少的。
<CTRL-A> 移动到行头
<CTRL-E> 移动到行末
<CTRL-K> 将光标开始到行末的字符全部删除
<ESC> f 移动到下一个单词的开头
<ESC> b 移动到上一个或者当前单词的开头
这种编辑方法类似emacs 编辑器的风格。如果你想切换到vi 编辑器风格,可以键入:
set -o vi
如果你想使其成为默认风格,可以将上面的语句加在$HOME/.inputrc 中

shell 函数通常在shell script 中看到。但是你也可以在命令行中打入简单的函数。例如
lf () {
mount /mnt/floppy
ls -l /mnt/floppy
umount /mnt/floppy
}

fc 是bash 的一个内建命令,可用来查看、编辑并重新执行历史命令。
除了bash之外还有一些shell,如csh、tcsh 和ksh。

单元八:标准I/O与管道

Linux 提供进程3个I/O通道,标准输入缺省为键盘;标准输出缺省为终端屏幕;标准错误输出缺省为终端屏幕。它们均可被重定向。这里重定向和管道的区别在于:重定向为IO流定义一个新的目的地或者来源;而管道将IO流的输出转为另一个程序的输入。

一般重定向操作符:
> command > file 重定向标准输出到一个文件
>> command >> file 重定向标准输出添加到一个文件末尾
< command < file 命令从一个文件中接受输入(可用在类似tr 这种不支持文件名输入的场合)
2> command 2> file 重定向错误信息输出到一个文件
2>> command 2>> file 重定向错误信息输出添加到一个文件末尾
&> command &> file 将所有输出都定向到一个文件
&>> command &>> file 将所有输出都添加到一个文件
也可以这样写:command > alloutput 2>&1

关于管道和pipelines:UNIX 有两条基本定律,一是使用小程序来完成简单的一件事;二是所有的程序的输出可作为程序的输入。管道和pipelines 就是实现第二条的途径。
所有输出到标准输出的命令可以作为管道的左数;所有从标准输入输入的命令可作为管道的右数。
管道可以将多个命令串连,形成pipeline,一种UNIX 的强大机制。例如:
$ cut -f1 -d:passwd | sort -r | less
使用tee 命令可以使命令重定向到一个文件的同时重定向到另外一个程序。例如:
$ lspci -v | tee lspci.out | less

单元九:字符处理

head 和tail 命令缺省状态下显示文件的前10行。用-n 或者 --lines 参数来改变显示的行数。tail 命令中-f 选项非常有用,可以用来实时监控文件末尾的改动,特别是当查看日志文件时。

wc 命令统计文件中行数、字数和字符数。如果wc 后跟不止一个文件,则除了单个文件的统计,wc 还给出一个累计总数。

grep 命令在文本文件中搜索特定字符。例如 grep john /etc/passwd
-i 忽略大小写
-v 查找指定的项不在文件的行
-n 只在n行前查找
-c 只显示查找到行的总数
-l 只显示含有查找项的文件名
-r 递归查找,从当前目录开始
正则表达式在 grep 中的应用使得grep 成为最强大的搜索工具之一。以下是正则表达式规则:
. 表示与任一单个字母匹配
.* 表示与没有字母或者任意个字母匹配
[abc] 与字母a,b或c匹配
[^abc] 与除a,b,和c之外的字母匹配
a* 与a后面跟任意个a匹配
a? 与一个a相符或者没有任何字符
a+ 与单个a或者a后面重复任意个a相匹配
a\{n\} 与重复的n个a精确匹配
^ 在行首处匹配
$ 在行末处匹配
\ 后面跟的.或者其他正则表达式符号成为一般符号,例如\.
例如:
www\.redhat\.com 表示www.redhat.com
^^Yeps!$$ 整行是^Yeps!$

sort 命令将源文件排序,然后输出到stdout。
-r 降序排序(默认是升序)
-n 数字排序
-f 忽略大小写
-u 去除相同行
+m 从第m列开始,一直到行末,作为排序的键
+m -n 从第m列开始作为排序的键,但不包括第n列

uniq 命令将文件中相邻的重复的行删除。可以同sort -u 一起使用以消除所有的重复行。
-u 输出只出现过一次的行
-d 输出只出现过两次的行
-c 输出加上出现频率次数
-fn/-sn 避免比较第n列后的输出

cut 命令显示文件内容定制的列。
-f 设置显示第n列
-d 设置分界符(缺省是TAB)
-c 将第n到第m个字符中间的列输出,如 -c2-5

paste 命令将多个文件“垂直”合并为一个,然后从标准输出上输出。
-d 设置分界符,缺省为TAB键
例如:
$ cat fileA
1
2
3
$ cat fileB
a
b
c
$ paste fileA fileB
1 a
2 b
3 c

diff 比较两个文件,输出相异之处。< 代表第一个文件,> 代表第二个文件。
$ diff fileA fileB
33c33
< x = y + 2;
---
> x = y + 4;

tr 命令将输入中的字符替换或者删除。它不能直接接受文件名,而需要通过重定向接受文件内容。
-d tr 用于删除后跟的字符如tr -d "\n" < area.c > new.area.c
其中,\后跟的数字如"12" 表示相应的ASCII 字符。
又如:tr [A-Z] [a-z] < text1.txt > text2.txt 将所有的大写字母替换成小写字母。

aspell 命令用作拼写检查,aspell check filename,这是一个简单的菜单驱动的拼写工具。aspell -i 可以作为非互动的错字输出。

look 命令可以用作简单的拼写字典,当你需要拼写帮助的时候用它。

expand 命令将输入中的tab键转换为空格。
fmt 命令将输入中的字符格式化成段落,以-wn 控制每行字符数,-u 在每行末尾加上两个空格。
pr 命令将输入中的字符格式化成可输出的格式。
   
相关阅读 更多 +
排行榜 更多 +
Event Horizon

Event Horizon

飞行射击 下载
Counter Terrorist Sniper Shoot

Counter Terrorist Sniper Shoot

飞行射击 下载
Special Agent

Special Agent

飞行射击 下载