国外设计欣赏网站 - DOOOOR.com

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

[Drupal优化/SEO/环境] Drupal环境搭建系统Linux应用设置教程--一篇即懂LINUX

[复制链接]
发表于 2-29-2012 03:54 | 显示全部楼层 |阅读模式
1.linux的发展及应用
; s4 M+ }# R7 M3 o# d* V' b
/ R' U! X5 |- J- j( ?! G1.1什么是操作系统- \" H$ N5 e- G% M' B$ `5 }

- R% d, V; W8 _5 z, N3 x& S什么是操作系统?
: h% E4 F. H5 c' n$ H# u6 f9 p) f( ~- u, L
操作系统是一个能够协调、控制计算机系统硬件和软件资源的控制程序,位于计算机硬件和应用程序之间,核心程序处于中心,提供最基本的计算功能。操作系统实现了用户与计算机之间的交互。操作系统主要提供以下基本服务程序:1. 文件系统2. 设备驱动程序3. 用户接口4. 系统服务程序
+ \3 A" L) S/ ?1 s1 C7 Y  s
/ s1 p) a( c: E: a$ }  \' M

  d* v/ q' d2 z$ O, P6 d& }( Y. D5 |8 v. ?* l
1.2 UNIX 发展史
9 r, U9 g- c( a; ?( W: x8 V
+ O/ {: x# r: A& k$ o6 u* D. i(1)1965年,美国麻省理工学院(MIT)、通用电气公司(GE)及AT&T的贝尔实验室联合开发Multics工程计划,其目标是开发一种交互式的具有多道程序处理能力的分时操作系统,但Multics追求的目标过于庞大复杂,项目进度远远落后于计划,最后贝尔实验室宣布退出。6 O4 [* {0 x3 D5 }6 q" t; L

6 k% K* d% s# s- u/ d: j
(2)1969年,美国贝尔实验室的肯 • 汤普森在DEC PDP-7机器上开发出了UNIX系统。(3)1971年,肯 • 汤普森的同事丹尼斯 • 里奇发明了C语言;1973年,UNIX系统的绝大部分源代码用C语言重写,这为提高UNIX系统的可移植性打下基础(4)UNIX此后逐渐演变成为两大分支:a. AT&T开发的版本 —— System Vb. 加州大学伯克利分校的版本 —— BSD

# {( l, d5 |- f# U1.3 UNIX 主要版本
- u8 Z# z! N9 L8 |
, {( {& q6 L* ]7 V- T0 B6 wUNIX 主要版本+ V  _7 V: |- K- T

5 L/ M3 G4 l6 ]( p0 Y. z# F( U8 L, b2 Q* E4 g' Q
, G) ~  t: X% ]' f$ j7 X
1.4 Linux 系统简介
/ b. i0 g! J2 ]
& d& v+ P9 L0 E% \Linux 系统简介0 s4 @0 r4 Y8 C; U6 d9 a# r
( k$ z" D& G5 c& @5 m& L
Linux系统出现于1991年,由芬兰大学生李纳斯(Linus Torvalds)和后来陆续加入的众多爱好者共同开发完成。Linux是一个自由软件,是源代码开放的UNIX。
2 B5 O# Z' X1 _
1.5 自由软件介绍: E* u5 E  c& U- t4 t( `0 o

( \; I: s7 Y: D8 L$ ~自由软件介绍' D; ^5 C4 H$ S8 X. ?/ x" h
' Z9 B$ G6 p9 j! W0 J
使用的自由可以不受任何限制地使用软件研究的自由可以获得软件源代码、研究软件运作方式散布的自由可以自由复制软件及散布给他人改良的自由可以自行改良软件并散布改良后的版本

$ c8 L, d. h1 v: D2 s1.6 Linux 优良特性
  F$ k! L7 f* G% n7 W0 e4 a! u) Y  d  R8 }) O
Linux 优良特性6 f- M9 u9 J9 t' j' v9 `1 c

1 [% n6 J# k2 ]6 C' t' y/ \
1) 分时的多用户、多任务的操作系统2) 多数网络协议支持,方便的远程管理3) 强大的内存管理和文件管理系统4) 大量的可用软件和免费软件5) 优良的稳定性和安全性6) 良好的可移植性和灵活性7) 可供选择的厂商多

4 ]( H, j* }$ F* ~3 e4 |1.7 Linux网络应用/ y3 K$ b, h9 s  N3 t, W
# y1 h1 p( g' ?% x4 y
基于LAMP的网站论坛及B/S架构应用* e6 B; ?9 R7 O5 z. d' \" e
' o( f( f/ \4 {# @* x9 U
基于Linux的负载均衡和集群基于Linux的防火墙及代理服务器基于Linux的网游服务器

  S' L* `. F* i1.8 linux大型应用/ n9 t$ z' T) [0 P0 G8 W; U+ q& I/ Z

' f; F0 h6 \/ P7 }9 A0 s% Z逻辑卷管理、磁盘阵列、双机热备等, B# n# d& I2 Z1 R4 N
) F% H( S: D! P' k# C
基于集群的科学计算基于Linux for alpha的图形图像处理

- ?0 f% N: B$ {, W1.9 linux 嵌入式应用
1 W' H  g" @7 ^  e5 v9 i- L& Y* t& M3 |. J+ T5 Y! X
生物特征识别系统
6 `6 g# ^9 ^* f- @) f- b9 t7 Y
& ?* p8 c+ H  I1 O
智能卡系统掌上电脑、手机、信息家电路由器、机顶盒、数码相机

/ ]' S" V2 z% j6 u7 o$ U2.安装Linux操作系统4 [6 k4 b' N3 g9 \, o. ~( h+ H
2.1 安装前的准备( L: \  V% {, ?1 s% t/ w5 y
' Y% ^+ I, H. L9 P' K9 Q
1.介绍计算机引导记录% k6 G( P  @# [' c) i( T
/ c7 r. ^6 c- v! r8 ~, Y' \
BIOS基本输入输出系统固化在主板上MBRMaster Boot Record,主引导记录位于硬盘的前512个字节第一个分区的0扇区例如Windows下C:的引导记录
* j% |) i* q9 }1 I+ S/ [6 F
2.硬盘相关概念的介绍IDE硬盘通常的计算机都是IDE硬盘一台计算机最多有两条IDE总线每条IDE总线最多可以挂接2个IDE设备一台计算机最多有4个IDE设备

8 @4 f; k7 I/ Z0 D& `" e
3. 分区的概念为了让硬盘更好的组织数据,为了分开不同的数据,可以给硬盘分区partition基本分区(Primary Partition)扩展分区(Extended Partition)逻辑分区(Logical Partition
- h& X3 W' t) X+ c8 @2 j! O% U
Windows系统中,给每个分区一个字符来进行标识

7 `4 Q3 Q! K3 s
Linux当中,对于分区的命名是这样的
3 m- P: O7 Y0 R. W, Z/ Z8 @! l
Linux中对于分区的表示法

% t+ a) J5 M7 Y  m) g
4. 文件系统的介绍格式化:分区上保存数据必须格式化Format格式化有低级格式化和高级格式化Windows 的文件系统FAT32/FAT/NTFS/Linux的文件系统EXT3/ReiserFS /JFS/Swap
' L- r( K" H% `3 ~) u
2.2 Red Hat的安装# r3 F, O6 R- w; B: C
$ y* e# _$ ^& l* z) J$ [0 n4 A
Red Hat的安装4 a3 c( }. V* N* g' L* q
' d7 w; R1 ~. y  R& b; M
1. 安装模式正常安装模式正常的安装操作系统linux[回车]文本安装模式若遇到显示卡无法识别等情况可尝试文本安装linux text[回车]急救模式对已经安装了的系统进行修复时使用linux rescue[回车]RedHat9.0的安装2.安装步骤RedHat9.0的安装2.安装步骤RedHat9.0的安装2.安装步骤RedHat9.0的安装2.安装步骤

* i! K. a. M% w+ J( }  t
RedHat9.0的安装2.安装步骤RedHat9.0的安装2.安装步骤挂接点:1. 目录树的概念2. 从根开始,唯一的根目录3. 每个文件系统(分区)安装到Linux目录结构树上的一个分支,安装点就是挂接点。4. 安装时,至少给根分区指定一个挂接点5. 交换分区不需要挂接,也不需要挂接点
  [/ K2 y  q$ n7 r' ^$ [4 q
RedHat9.0的安装2.安装步骤分区类型:1. ext3:常用的Linux分区类型2. reiserfs:常用的Linux分区类型3. LVM:简单介绍Linux Volume Manager4. soft RAID:简单介绍Soft RAID5. swap:交换分区6. vfat:fat32,Windows98的文件系统类型RedHat9.0的安装2.安装步骤
, B( I( v9 a! s: G
RedHat9.0的安装2.安装步骤RedHat9.0的安装2.安装步骤RedHat9.0的安装2.安装步骤开始拷贝文件RedHat的软件是以RPM格式发布的全部安装后,所需磁盘空间大概为1.7GB安装时间跟以下几个因素有关:硬盘速度光盘读取速度(制约因素)计算机解压缩速度大概需要30-40分钟完成拷贝文件注意:安装过程中,光驱门是锁死的,不能弹出。RedHat9.0的安装2.安装步骤完成安装自动重新启动计算机弹出光盘进入启动界面选择操作系统
9 j7 P% J# a' l) k" e( P7 W
RedHat9.0的安装2.安装步骤

1 y% S- n, @3 k. l1 |- d" @
完成第一次启动的设置
安装全部结束
进入登录界面
7 {0 U  U$ @. @5 ?" O8 [
2.3 Linux与Windows系统共存& I$ X8 v/ Q* Q: A) [

! x; p0 {( _4 V& ]( HLinux与Windows系统共存0 T  w( K" B8 T3 z
3 \5 h3 d) m3 ~4 w; ^! K7 H
已经有Windows系统,再安装Linux系统假设Windows有两个分区,分别为C:和D:,还有空余分区,大小为5GB。方法:使用Linux光盘启动系统,正常安装Linux.分区时,在空闲分区上新建根分区;新建交换分区开始安装Linux结束后,Linux自动检测到Windows系统,并配置引导管理器启动双系统简单,方便

3 D  M" a0 r# J( v8 }
已经有Linux操作系统,再安装Windows假设Linux占两个分区,hda1和hda2,硬盘上还有空余分区,大小为10GB使用Windows光盘引导系统,进行安装分区使用空闲分区,作为C:安装结束后,需要重新设置Linux的启动管理器,否则,将无法进行双系统引导注意:Windows的引导记录不使用MBR,它会清空MBR,所以安装Windows后,要重新设置Linux启动管理器。

. f  G( g" V5 u) q: `9 R/ t
重新设置Linux启动管理器的方法和步骤Linux的启动管理器叫做Grub使用光盘引导系统,当出现boot:提示符的时候,键入linux rescue进入下图,提示将搜索系统当中的Linux,并且挂载。
+ u& R; r. V* z2 Q# o" Z. C
重新设置Linux启动管理器的方法和步骤系统搜索到之后,把它挂载在/mnt/sysimage目录下。并给出提示信息参照提示信息进行操作

( U1 j4 z9 h1 x0 l) j8 Y/ s2 X
重新设置Linux启动管理器的方法和步骤再编辑/etc/grub.conf,增加如下项:title Windows XProotnoverify (hd0,1) #假设windows xp安装在/dev/hda2上makeactivechainloader +1再运行命令grub-install /dev/hda重新启动计算机

6 l% _3 M/ _% ]# _* ]. W2.4 linux下的基本工作环境+ d- w2 M* g/ K

! u) U& i: T8 t$ D  `. y1.传统的Linux目录结构& x2 K4 R' \4 y& f) i
/boot -- 保存系统的引导相关的文件内核文件 vmlinuz-2.4.xGrub等/etc -- 系统常用的配置文件系统管理员经常需要修改的文件决定系统行为的配置文件/bin -- 用户常用的命令文件和目录的操作命令所有用户都能使用7 f7 B7 k+ Q" F  o7 j$ L
8 W: r  N- v" E- ?4 T3 B
1.传统的Linux目录结构/sbin -- 保存系统维护所使用的命令文件Fdisk/mkfs等很多命令普通用户都不能使用,只有root/lib -- 系统运行所需的库文件静态库, .a文件动态库, .so文件/dev -- 系统的设备文件/dev/cdrom/dev/psauxlinux下的基本工作环境1.传统的Linux目录结构/var -- 保存变化的数据日志文件脱机文件,如打印队列,邮件队列等/mnt -- 系统用来安装文件系统设备的目录光盘/mnt/cdrom软盘/mnt/floppy/proc -- 系统内存/CPU的映射虚拟的文件系统,不占用空间kcore

$ _( f0 _" g6 u3 W2 A" x) U
1.传统的Linux目录结构/tmp -- 保存系统运行时产生的临时文件程序的临时文件文件是有格式的/home -- 系统中普通用户的主目录/root -- 系统中超级用户的主目录/usr -- 系统中保存与用户相关的信息除以上目录以外的文件系统当中最大的一个目录
3 e7 S: }7 R  P, J# B1 s7 ?+ J
2.5 linux系统登陆及退出
; e$ e" R' W: u$ n& a
# Q# Z( g- H$ n, q- R3 _5 f* Flinux系统登陆及退出
. H8 T; A" E: ]' w# P) N" a% i: y* C9 O6 m: e0 y7 Z4 Q1 f
字符登录方式图形登录方式
. O: G5 v1 {3 J) x5 l, p5 \
关闭计算机菜单操作:Ctrl+alt+del:字符操作: halt重新启动计算机菜单操作:Ctrl+alt+del字符操作:reboot
. Z# c4 v1 D2 ~/ P, e+ K  `/ F# t
3. Linux常用命令
+ `4 t: i% h2 o/ k

* e' q  Y: ^+ N8 u5 f, |3.1 Linux文件系统结构
: s/ _. x5 X; s+ T  H( s% T. `& Z; v: y$ X" v1 W5 O  J, s

# t2 T8 Z7 |5 B  X! N) \! N4 N
3 W4 P# x+ C" c- d/ Q/ ]3.2 Linux文件命名规则& O( P  S! @/ ?  ~2 D+ v. `

6 u5 D% i" n9 ^7 D2 T6 r在Linux系统中可以使用长文件或目录名,可以给目录和文件取任何名字,但必须遵循下列规则:1 r* e8 }. }1 I" H
! H; B4 @8 t5 t7 M# A
1)除了 / 之外,所有的字符都合法。2)有些字符最好不用,如空格符、制表符、退格符和字符 @ # $ & ( ) - 等。3)避免使用加减号或 . 作为普通文件名的第一个字符。4)大小写敏感。
& C% j* J+ K% }$ j6 ^1 K) v2 P  m
3.3 Linux命令格式
( g- D; m; T9 N! Y0 I7 `% k) X; ~5 T6 A/ F% j
命令格式 :命令 -选项 参数
4 g& W  b6 p# J' y' C/ A* l& F7 }9 n! ~" E
例 : ls -la /etc/default说明:当有多个参数时,可以写在一起。绝对路径 :是从根开始一级一级地进入各个子目录,最后指定该命令或文件。相对路径 :是从当前目录进入某目录,最后指定该命令或文件。两个特殊的目录 . 和 .. ,分别指示当前目录和当前目录的父目录。

* ?9 h3 E: j9 F8 }' Q% B, w3.4 linux 通配符
6 O. Q7 F. m2 Y) v5 g7 Q: h- k- n( T# o4 T
常用的通配符:
. C, ?; R0 T  v! `- H. k1 i. b* ^
$ c7 ^3 [! K, w
* 匹配任何字符或任何数目的字符? 匹配任何单字符[…] 匹配任何包含在括号里的单字符

! _/ f7 @" d* z" a& ]3.5 登录和退出
, r3 g/ I  @( a: Y
* ]& M2 R& t9 {' n8 M/ t/ N0 lLinux是一个多用户、多任务的操作系统,允许多个用户同时使用系统资源。为了让系统知道用户是谁,拥有什么权力,可以使用什么资源,用户必须首先向系统表明自己的身份,这个过程称为登录(login)。( ^" i( ?. O4 C' F; ?& W3 X
) v) J9 \2 K2 o1 z
当显示出系统缺省的主提示符(对普通用户,缺省的主提示符是$;对超级用户root,缺省的主提示符是#),就表明用户登录成功了。若登录不成功,系统将要求用户重新登录。用户退出系统的方法有两种:1 ) 键入命令:exit2 ) 在提示符下按Ctrl+D组合键

: u9 r( b! {+ H9 Q: h; P! V  P3.6 文件处理指令:ls$ Q# s0 F5 R- W; F5 [
0 P3 ^* Z7 k1 [$ d
指令名称:ls4 [$ |5 i1 ?& T0 K6 A* y
+ B- ^6 u: [* B- g( W
指令英文原义:list指令所在路径:/bin/ls执行权限:All User语法:ls 选项[-alFR] [文件或目录]-a 显示所有文件,包括隐藏文件-l 使用长格式显示-F 附加文件类别,符号在文件名最后功能描述:显示目录文件
7 k2 }$ f) _7 }, J+ n) N# n2 T
3.7 文件处理指令:touch. W  k5 M; y- G
' k9 e# Y" T, @; l% f
指令名称:touch( m& ^' A6 C0 ~$ J; F2 |6 N# }, ]
( Q% x/ F: @$ Y2 I7 _
指令所在路径:/bin/touch执行权限:All User语法:touch 选项 [文件名]功能描述:生成空文件范例: $ touch abc
9 z- b' F: n! s5 P+ A
3.8 文件处理指令:cd
0 R7 a! F) Y  \6 s( Y0 |& I' S* S  ~% j+ }% Q/ L
指令名称:cd
* _/ r( I5 O, W- @& _9 x; |
( y, a* g( N2 E) ?# g( X+ U
指令英文原义:change directory指令所在路径:Shell内部指令执行权限:All User语法:cd [目录]功能描述:切换目录范例: $ cd .. 回到上一级目录$ cd ~ 回到用户的宿主目录$ cd / 切换到根目录$ cd ../usr 切换到上一层目录的usr目录
- f6 G9 h: S3 g) e7 u
3.9 文件处理指令:pwd
3 L8 p+ O& T/ W. o/ u: T8 |) o" V3 G( l8 n$ A' @0 N
指令名称:pwd
1 y" O5 s2 b3 e" b
/ c& h& j- b) o& {
指令英文原义:print work directory指令所在路径:/bin/pwd执行权限:All User语法:pwd功能描述:显示目前所在的工作目录范例:$ pwd/usr/X11R6/bin显示当前工作目录为/usr/X11R6/bin
& Z# m3 E' c6 D, k- R: h9 s" Z4 S9 n
3.10 文件处理指令:cp' M' y6 d( @2 X/ N  z
指令名称:cp
  ~& O, ?* P' n
( l( F1 r$ M. D9 D5 g$ D
指令英文原义:copy指令所在路径:/bin/cp执行权限:All User语法:cp -afp [源文件或目录] [目的文件或目录]-a 复制所有目录并包含子目录-f 强制复制文件-p 保留原文件的日期功能描述:复制文件文件处理指令:cp范例:$ cp file1 file2 dir将文件file1,file2复制到目录dir$ cp -a dir1 dir2将dir1下的所有目录包括子目录陆续地复制到dir2

( R6 R! N# q: K" ^( y# l8 p' y8 s3.10 文件处理指令:cp
- {1 }9 b6 x, m2 _6 l" Y$ r
2 o- r5 g' n# X1 t% {# K# Y指令名称:cp
! R$ K8 V1 x" i# `: D
5 ]8 [' w. y  i. T+ ]! [4 s* A7 |* k# I0 w
指令英文原义:copy指令所在路径:/bin/cp执行权限:All User语法:cp -afp [源文件或目录] [目的文件或目录]-a 复制所有目录并包含子目录-f 强制复制文件-p 保留原文件的日期功能描述:复制文件文件处理指令:cp范例:$ cp file1 file2 dir将文件file1,file2复制到目录dir$ cp -a dir1 dir2将dir1下的所有目录包括子目录陆续地复制到dir2
4 G/ E2 f: Y! I/ E+ X
3.12 文件处理指令:mv
* p+ ^  R% Y; u  q# w* A; T. K9 v: T) z$ p2 m; W% H. B  |, r
Submitted by  on 星期四, 03/12/2009 - 12:51似曾相识2 s/ X' }/ I# P7 _& w- A

0 K+ t  j+ @: W/ h" S, B- S
指令名称:mv指令英文原义:move指令所在路径:/bin/mv执行权限:All User语法:mv -f [源文件或目录] [目的文件或目录]-f 强制移动功能描述:移动文件
4 c# d4 ~; f/ q# ~: C
文件处理指令:mv范例:$ mv file1 file2将文件file1移动到文件file2,其实也就是更名地操作;若file2为目录,则是将file1移动到file2目录下

+ [* q$ |. q) a4 a* c6 m' N3.13 文件处理指令:cat! X! |& K6 x' W  i0 Z
指令名称:cat
4 k) \$ k! f9 t+ q+ j7 X. d  c) B; `* b# y! h0 f
指令所在路径:/bin/cat执行权限:All User语法:cat [文件名]功能描述:显示文件内容范例: $ cat cc.txt
% \. P  l5 {- r9 h
3.14 文件处理指令:more  O, w. C$ J3 d* j1 |
/ R5 G4 ~& ]/ ~
指令名称:more9 t+ @" ]( X0 ]( Q" x$ U6 ^3 }
3 R4 O0 f! N( ~3 `& K; l& M
指令所在路径:/bin/more执行权限:All User语法:more [文件名]f或(空格) 显示下一页(Enter) 显示下一行q或Q 退出more功能描述:分页显示文件内容范例: $ more /etc/services$ ls /etc | more
  i8 h. ^$ Z8 u# {
3.15 文件处理指令:head
* f2 Z+ x1 z+ |4 _- o2 y) ]6 O" E+ Y+ g1 k$ `% f8 W6 ~, T
指令名称:head# w- o; F0 F% f$ C7 X7 F

( V% b$ R' B7 \
指令所在路径:/usr/bin/head执行权限:All User语法:head -num [文件名]-num 显示文件的前num行功能描述:查看文件的前几行范例:$ head -20 /etc/services

/ D9 D* }# E1 f7 y; ~3.16 文件处理指令:tail1 I6 J& ?+ V7 Q+ C

! M) j% M) b  n! @/ J. I% C指令名称:tail. W: w. |' O1 Y+ y

. X/ C; p! A/ `; h  P+ t+ E9 E7 H
指令所在路径:/usr/bin/tail执行权限:All User语法:tail -num [文件名]-num 显示文件的后num行功能描述:查看文件的后几行范例: $ tail -30 /etc/services
3.17 文件处理指令:ln: n' K2 e/ {7 Y# |- g# M
$ `; E$ f8 Z& l2 }) H+ }4 x
指令名称:ln
% @: v' a# p4 V6 y. D! ~
& \: ]1 S( F& D+ b# I
指令英文原义:link指令所在路径:/bin/ln执行权限:All User语法:ln -s [源文件] [目标文件]-s 符号链接功能描述:产生链接文件

/ q2 v0 U. z; n* s9 `/ x
文件处理指令:ln范例:$ ln -s /bin/less /usr/local/bin/less将/bin/less链接到/usr/local/bin/less$ ln /etc/csh.cshrc /root/.cshrc将/etc/csh.cshrc硬链接到/root/.cshrc

& s: C5 e% B. |3.18 文件处理指令:mkdir
* l7 b! S# ]/ a2 r, G8 X* f* E% Z; F, H+ L# x7 N. D1 g9 U5 C
指令名称:mkdir+ `/ _. d% ~; g/ T6 m

6 F+ _- N; g' }4 g
指令所在路径:/bin/mkdir执行权限:All User语法:mkdir 选项[-p] [目录名]-p 依次创建目录功能描述:建立目录范例: $ mkdir int$ mkdir -p int1/mail/

5 M/ x; `! p' t& N1 t8 Q9 F3.19 文件处理指令:rmdir- @( J3 {: V" U% E0 R

8 b( d) B& ~4 ~; \) |. `指令名称:rmdir
  \- F- W& C; j5 f3 h' l* W' d. _4 B/ n& ]( l$ U3 c# E3 M( w
指令所在路径:/bin/rmdir执行权限:All User语法:rmdir 选项 [目录名]功能描述:删除目录范例: $ rmdir int

# T  x0 ?1 r" M8 i% R/ C, D, i* D3.20 文件处理指令:rmdir* ]0 g1 f( Q* U6 g( m
  c) S: X  S0 d7 S2 b
指令名称:rmdir( k; L+ W( |4 l) v% d0 L
& ]; [0 y2 W" e. f' i  C$ u
指令所在路径:/bin/rmdir执行权限:All User语法:rmdir 选项 [目录名]功能描述:删除目录范例: $ rmdir int
1 P7 f9 s' B3 a6 F- {- n
3.21 权限管理指令:chmod
; k5 C$ L9 Y8 i( v
( x& G: X" d# g7 s7 @& [" z指令名称:chmod: F8 \9 `: S2 L0 T! }) r1 b: T
' j! P0 Z* C$ z& W' i8 |
指令英文原义:change file or directory’s mode指令所在路径:/bin/chmod执行权限:All User语法:chmod -R [mode=4,2,1 or {a,u,g,o}{+,-,=}{r,w,x}] [文件或目录]功能描述:改变文件或目录的权限范例: $ chmod a+r file1所有用户对file1有读的权利

, Q% l5 `5 u* N; ^
权限管理指令:chmod范例:$ chmod og-x file1删除group与other用户对file1文件的执行权利$ chmod u=rwx file1将file1的文件所有人权限设为可读、可写、可执行$ chmod 777 file2指定file2为所有用户可读、可写、可执行$ chmod -R 644 dir/将dir目录下的所有文件权限设置为644
; e& j) [+ A' s6 k0 I9 V5 M
3.22 权限管理指令:chown
: I0 W+ n6 f8 U0 m+ B; ]' t" A' b: n3 Y3 U; s+ W7 k+ V% G
权限管理指令:chown4 D& U4 E4 }$ Q7 B- u  i

0 M1 s8 {( U+ f. Q# a+ ^
指令名称:chown指令英文原义:change file or directory’s owner指令所在路径:/bin/chown执行权限:All User语法:chown -R [用户[.群组]] [文件或目录]功能描述:改变文件或目录的所有人范例:$ chown sam file改文件file的所有人为sam

* x5 b4 B& E# N  ?9 }+ [
权限管理指令:chown范例:$ chown -R gem dir/将dir目录的所有文件所有人改为gem

7 q$ K9 ~5 r: d! b* t3 a: Z3.23 权限管理指令:chgrp
( d8 m$ w9 c" o5 v) t) z' H  N+ v. M7 y
指令名称:chgrp
$ `3 a4 g; |# ?
. f% A; E' v3 I! y
指令英文原义:change file or directory’s group指令所在路径:/bin/chgrp执行权限:All User语法:chgrp -R [群组] [文件或目录]功能描述:改变文件或目录的所属组范例:$ chgrp sunny file改文件file的所属组为sunny
7 a( T* p6 A4 L; _3 s& m8 D6 H
权限管理指令:chgrp范例:$ chgrp -R rick dir/将目录dir所有文件的所属组改为rick$ chown -R gem.sam dir/将目录dir的所有文件所有人改为gem,所属组改为sam
' I* w) U; p6 y* x  |2 G- `
3.24 权限管理指令:umask
; @2 s# v6 ~5 R* R, D5 ^2 u* v. m" t8 }7 U: t4 m  @7 p8 Y
指令名称:umask
/ Q; W% ~: |  S' b' o
7 I0 H) h& ?' y
指令所在路径:Shell内置命令执行权限:All User语法:umask功能描述:设置文件的默认生成掩码范例: $ umask$ umask 022
* ?* M- y8 Y6 R5 W  m
3.25 文件搜索指令:whereis  x  s3 o' C  k8 I' V& o8 l7 D! ]
  J9 f$ K* G( }! @% i/ S
指令名称:whereis; H/ u0 R; H( w! e5 L

+ q7 ]5 |' J. q( }0 N6 W( A. V
指令英文原义:where is file指令所在路径:/usr/bin/whereis执行权限:All User语法:whereis [文件或目录]功能描述:显示系统命令所在目录范例:$ whereis ls/bin/ls显示ls文件的所在位置为/bin/ls
5 H4 Y7 M& Y; G" u) y" B. `% \# ]
3.26 文件搜索指令:find! X* P% J2 @. D! I

+ \& n5 u' S" q) S7 ?& l, y) A9 O. l指令名称:find6 _5 W* [: o3 D/ U5 ~9 k
- e* b1 |: `! G: h- [+ E1 X9 K9 G
指令英文原义:find指令所在路径:/usr/bin/find执行权限:All User语法:find [搜索路径] [搜寻关键字] [文件或目录]功能描述:查找文件或目录文件搜索指令:find范例:$ find / -name file1执行find从根目录/寻找file1的位置并把输出显示到屏幕上$ find /etc -name f*在/etc目录下搜寻所有以f开头的文件$ find /etc -name c??搜寻所有以c开头后面有两个字符的文件
" I( S* M, n6 O. T0 i! w3 }
3.27 文件搜索指令:grep
. A2 e( _) t; y$ T3 m9 H( `. a% h+ h
指令名称:grep$ ~+ @9 Q4 [0 e7 `( z

' T% N& F# h, o. t0 F9 t
指令所在路径:/bin/grep执行权限:All User语法:grep [要找的字串] [要寻找字串的源文件]功能描述:在文件中搜寻字串匹配的行并输出范例:# grep root /etc/passwd# ls -l /etc | grep services
* w0 E$ L6 z8 Q% }  S
3.28 文件搜索指令:locate
1 u* p8 b+ G2 u; i
& E; N& U9 T9 x& H1 Z5 M指令名称:locate% n& [1 E$ d+ n+ r5 h( q  ?
指令英文原义:list files in databases指令所在路径:/usr/bin/locate执行权限:All User语法:locate [搜索关键字]功能描述:寻找文件或目录范例: $ locate file列出所有跟file相关的文件
- Z8 x! o" d2 x8 S; v+ R% Z9 H
0 q  E/ `( g0 ?: X3.29 文件搜索指令:updatedb
8 T5 z5 h1 \5 P: p
; Q0 C. s3 l# o- ?' D指令名称:updatedb
* k: t0 u2 \5 M" G+ h! w! R- d/ Q) t! }& R9 M  m: v- O! t5 ^
指令英文原义:update the slocate database指令所在路径:/usr/bin/updatedb执行权限:root语法:updatedb功能描述:建立整个系统目录文件的数据库范例:# updatedb

8 U+ ^% N) l" _" R* w3.30 帮助指令:man: J9 C5 B) N+ b) A, s' r
) m/ Y0 v& \( }, k9 X, E
指令名称:man( e- D) [4 G) J8 p, R6 p
: i: N' G! U( H, h4 b' e! |
指令英文原义:manual指令所在路径:/usr/bin/man执行权限:All User语法:man [任何关键字]功能描述:获得帮助信息范例: $ man ls查看ls指令的帮助信息$ man services查看配置文件services的帮助信息

9 N  n+ q2 M9 s3.31 帮助指令:info
6 f8 C* d, n) o* i: P! ~9 c' E- {/ n) R" W8 D; m3 {8 V
指令名称:info  e! U3 B9 t: |$ ~% i4 {/ x0 }2 `
; t( r5 M6 @" g0 f
指令英文原义:information指令所在路径:/usr/bin/info执行权限:All User语法:info [任何关键字]功能描述:获得帮助信息范例: $ info ls查看ls指令的帮助信息

  I. T1 w+ k6 B2 q/ D1 y3.32 帮助指令:whatis1 a8 v0 \6 L2 ^4 \/ {9 M) }/ R

6 B0 z0 a2 K1 f0 y3 T4 V指令名称:whatis apropos makewhatis- f8 u1 O* J9 l
3 v3 ], E; ?  B1 D3 c  g. T3 t. N
指令英文原义:search the whatis database for strings指令所在路径:/usr/bin/whatis apropos/usr/sbin/makewhatis执行权限:All User, All User,root语法:whatis apropos [任何关键字]功能描述:获得索引的简短说明信息范例: $ whatis ls$ apropos fstab 相当于man -k

$ o) u9 k! b+ L8 ]5 E, u( `  A
帮助指令:whatis范例:# makewhatis建立whatis和apropos搜索使用的数据库,当使用这两个命令发生错误时,就是whatis database没有建立
) G% O  ?, d9 T# H7 L8 ?
3.33 压缩解压指令:gzip
4 R! d* `3 r/ m( V' q- q4 v0 }# n5 q3 K/ @0 l+ @
指令名称:gzip2 J) v9 n, n' E5 f. v! A4 B
. E5 H& M* ?0 b  y/ p1 H
指令英文原义:GNU zip指令所在路径:/usr/bin/gzip,/bin/gzip执行权限:All User语法:gzip 选项 [-19] [文件]-1 是数字1,表示快速压缩-9 9代表最佳状况压缩,读音nine约等于nice功能描述:用Lempel-Ziv coding (LZ77) 技术压缩文件压缩后文件格式:.gz压缩解压指令:gzip范例:$ gzip -1 news.exe快速压缩news.exe生成news.exe.gz压缩文件

8 w# Z  @: n/ J$ ]. m3.34 压缩解压指令:gunzip4 e. k5 u2 P7 R; e* W+ Y
  J* g" c4 l. Q2 X, F
指令名称:gunzip' Q% ?4 W# r7 I) E
, O7 q$ J2 T) i$ \% Q) R7 r4 Y6 N
指令英文原义:GNU unzip指令所在路径:/usr/bin/gunzip,/bin/gunzip执行权限:All User语法:gunzip 选项 [文件或目录]功能描述:解压缩以gzip压缩的.gz文件范例: $ gunzip news.exe.gz等同于gzip -d ,-d是解压缩的意
$ o8 {, o. }( w. y$ x/ O) ^3 c" D
3.35 压缩解压指令:tar! j( u7 |& Q8 z. k* e: M

' N, t0 M  Q, x+ M  v: ~9 Z1 s压缩解压指令:tar
* Z5 ?6 \  A, C8 n3 @3 g, z
0 v9 Y3 Z9 T6 P6 \+ l; e0 e6 `
指令名称:tar指令英文原义:指令所在路径:/bin/tar执行权限:All User语法:tar 选项[zcvf] [文件或目录]-z 使用gzip压缩.tar文件-c 产生一个.tar文件-v 观看压缩过程-f 指定压缩后的文件名功能描述:压缩文件目录压缩后文件格式:.tar.gz 或 .tgz压缩解压指令:tar范例:$ tar cvf mymail.tar Mail/$ gzip -9 mymail.tar$ tar -zcvf mymail.tar.gz Mail/将目录Mail/下所有文件压缩成一个压缩文件$ tar zcvf mymail.tgz Mail/
7 }" q7 a: O* K! M$ t
压缩解压指令:tartar的解压缩语法:tar zxvf tarfile.tar.gz (或.tgz)-x 将打包文件tar开-t 测试tarball压缩文件-z 如果配合选项c使用是压缩,配合x使用是解压缩-v 将解压缩的过程显示在屏幕上-f 指定解压对象为文件如:$ tar zxvf mymail.tar.gz$ tar ztvf mymail.tar.gz
! D! `" k; X- O5 F; v" ~
3.36 压缩解压指令:zip/ [# [3 J" c4 e4 g* R3 L+ \
. Q+ Z9 h$ M& a9 H% U8 U7 F
压缩解压指令:zip; Q  A0 p' R' q1 b
- |3 I6 I3 s3 c
指令名称:zip指令所在路径:/usr/bin/zip执行权限:All User语法:zip -rfF [压缩后的文件名] [被压缩的文件或目录]-r 压缩目录-f 更新压缩-F 修理压缩文件功能描述:压缩文件或目录压缩后文件格式:.zip

: t5 M5 C6 \# L/ _
压缩解压指令:zip范例:$ zip ee.gif.zip ee.gif$ zip -r mail.zip mail/
; I' a. B9 j& i5 z' O6 M
3.37 压缩解压指令:unzip# s2 f( a/ W1 \
6 S' K$ e% u3 k
压缩解压指令:unzip
& J4 @& W$ c  s4 n0 [& _5 O) e
3 B( d% U3 }. D6 i+ g0 S/ R/ s
指令名称:unzip指令所在路径:/usr/bin/unzip执行权限:All User语法:unzip -d [压缩文件名]-d 连子目录一起解开功能描述:解开用zip压缩过的压缩文件范例:$ unzip -d mail.zip
1 |1 m2 s+ C; u# p' Y7 A+ G, b, W' ]
3.38 网络通信指令:write+ [# n- L8 q5 S4 b8 K3 U

3 d, o6 S8 _& W) S1 V: X# \指令名称:write  t& X4 q. M( E. k
指令所在路径:/usr/bin/write执行权限:All User语法:write 功能描述:向另外一个用户发信息,以Ctrl+D作为结束范例: $ write webmaster
' e) M1 F" d2 w3 G- r1 O+ S$ T3 ~$ l: k0 p2 I% M( a7 w5 C0 x  d1 Q" ?
3.39 网络通信指令:wall
) a  r: d% e& H3 g3 [: `5 z1 i* [1 Q: Z& i: I* _% k; x( L
指令名称:wall0 \( T5 W( q2 y7 o, J1 [( f

. n, r, ^. m4 j. m
指令所在路径:/usr/bin/wall执行权限:All User语法:wall [message] [文件名]功能描述:向所有用户广播信息范例: $ wall Drupaluser.otg!

. Y% k0 \: i! D5 E+ c8 l3.40 网络通信指令:mesg
! m# U' E5 H2 ^+ P
, I$ H2 c1 M1 S7 B* b指令名称:mesg
2 W1 @/ H4 ?9 {; N/ f" P
8 f. {. V& I: T. f& f6 p* G! F3 v
指令所在路径:/usr/bin/mesg执行权限:All User语法:mesg 选项[yn]y 接受从其他用户发来的信息n 不接受从其他用户发来的信息功能描述:显示当前是否接受其他用户发来信息范例: $ mesg$ mesg n
% m6 |; D# Q* ^1 W8 m  e/ _  ]) E
3.41 网络通信指令:ping
# z$ o8 C; K( F
6 j) ~0 }0 p/ E" t+ {% s指令名称:ping1 Y* C, _+ Y6 b/ L2 A$ a

' M  b' u. x4 L$ ]6 z" z% {) \
指令所在路径:/bin/ping执行权限:All User语法:ping 选项[-ciR] 主机名(或IP地址)-c 共发出多少条信息-i 等待多少秒后发下一条信息-R 显示路由表的详细信息功能描述:测试网络连通性范例: $ ping 192.168.0.222
8 y$ u6 {: ?! u. z9 r
3.42 网络通信指令:ifconfig. [" ?6 K( v0 F% Y3 Q
指令名称:ifconfig# D4 v9 ^2 U9 S. u' G+ g/ f
- D1 d8 l1 M4 K" \2 B. Z. Y
指令所在路径:/sbin/ifconfig执行权限:root语法:ifconfig [网卡设备标识]功能描述:查看系统网络设置信息范例:# ifconfig

* _& D5 U% q" G- a3 y% c- X2 o+ C3.43 网络通信指令:mail  v3 N( R! [+ k/ b" v) f# \
( H* N: z6 ~7 G: J9 ?
指令名称:mail
8 x7 o8 P: b2 v& ]5 ]' Z  H" q# I7 @) |/ P+ O1 f$ W8 ~
指令所在路径:/bin/mail执行权限:All User语法:mail功能描述:阅读邮件范例:$ mail
2 A2 C$ p2 [+ c, ]* n6 a1 N
3.44 系统关机指令:shutdown8 u2 \! R4 }5 \
) l- J* O; W' y6 D& h
指令名称:shutdown
9 d! d3 S( m. A" e# _  v
* n( ?  M9 i) o7 C
指令所在路径:/sbin/shutdown执行权限:root语法:shutdown 选项[now -y -t]功能描述:关机范例:# shutdown now系统马上关机
( r9 N. V$ V) q- W5 P) n
( C; M3 d, Y. t8 o) ~" H
 楼主| 发表于 2-29-2012 03:55 | 显示全部楼层
4. linux用户管理
4.1 Linux下的三类用户
超级用户(root)具有操作系统的一切权限UID值为0
普通用户具有操作系统有限的权限UID值500~6000

伪用户是为了方便系统管理,満足相应的系统进程对文件属主的的要求,伪用户不能登录,UID值1~499



4.2 用户账户文件-passwd

passwd文件用于定义系统的用户账号,该文件位于“/etc/”目录下。由于所有用户都对passwd有读权限,所以该文件中只定义账号,而不保存口令
# ll /etc/passwd 查看权限
# cat /etc/passwd    查看passwd文件



4.3 passwd文件格式

xmb : x : 500 : 500 : : /home/ xmb : /bin / bash
账号名称:登陆用名,在系统中是唯一的
用户密码:此字段存放加密口令
用户标识码(User ID):用户身份编号
组标识码(Group ID):登陆默认所在组编号
用户相关信息:用户全名或注释
用户目录:用户主目录
用户环境:用户默认使用的shell



4.4 vipw命令
vipw命令vipw命令用于直接对用户账号文件passwd进行编辑,使用的默认编辑器是vi,在功能上等同于“vi /etc/passwd”命令

# vipw
# vi /etc/passwd



4.5 用户口令文件-shadow
用户口令文件-shadowShadow文件位于“/etc”目录下,用于存放用户口令等重要信息,所以该文件只有root用户可以读取

 # ll /etc/shadow     查看shadow权限
 # tail /etc/shadow 查看shadow后10行

shadow文件格式
shadow文件中每条记录由用冒号间隔的9个字段组成
用户名:登陆用名,惟一
口令:存放加密的口令
最后一次修改时间:从1970年1月1日起到密码上一次被修改时间
最大时间间隔:密码再过几天可以被变更(0表示随时可被变更)
最小时间间隔:密码再过几天必须被变更(99999表示永不过期)
警告时间:密码过期前几天系统提醒用户(默认为1周)
不活动时间:口令过期少天后,该账号被禁用
失效时间:从1971年1月1日算起,多少天后帐号失效



4.6 创建用户账号:useradd

创建用户账号:useradd命令格式:useradd 用户名功能描述:用于添加用户账号。在使用useradd命令添加账号后需要用passwd命令设置用户口令,才可以用此账号登录,否则此账号被禁止登录# useradd user1# tail -1 /etc/passwduser1:x:502:502:/home/user1:/bin/bash# tail -1 /etc/shadowuser1:!!:13216:0:99999:7:::useradd命令选项[ root]# useradd [] useradd命令选项-u uid:指定新用户的uid,默认用当前最大UID加1-g group:指定新用户所在的组,该组必须存在-G group:指定新用户的附加组-d dir:指定新用户的主目录-s shell:指定新用户使用的Shell,默认为bash-c comment:说新用户的附加信息,如全名等-e expire:指定用户的登录失效时间(05/20/2006)-k skel-dir:指定skel目录,默认存放在/etc/skel-m:建立新用户的主目录-M:不建立新用户的自家目录-r:建立一个系统用户

root@host

4.7 设置帐户密码

在Red Hat Linux中,不论执行adduser或useradd命令,其实都是指向/usr/sbin/useradd这个文件,因而任选一个命令执行即可:[ root]# useradd xmb 创建xmb账号[ root]# passwd xmb 设置密码Changing passwdord for user xmbNew password: 输入密码Retype new passwd 再输入一次密码Passwd:allauthentication tokens update successfully


root@host
root@host

4.8 在添加用户账号时指定用户私有组

命令格式 useradd –g 组名 用户名功能描述:用于添加用户账号并设置该用户的私有组。如不指定“-g”参数,useradd命令将自动建立与用户账号同名的组作为该账号的私有组# useradd –g root xmb# tail -1 /etc/passwdxmb:x:501:0::/home/xmb:/bin/bash[ root]# useradd –g root –e 05/20/2006 xmb[ root]# passwd xmb 为xmb设置passwd建立一个属于root组的用户xmb,登录失效时间为2006-05-20


root@host
root@host

4.9 删除用户账号

命令格式 userdel 用户名功能描述:userdel 命令用于删除指定的用户账号# grep user1 /etc/passwd 查询账号user1user1:x:501:501::/home/user1:/bin/bash# userdel user1 删除账号user1# grep user1 /etc/passwd 再次查询账号user1# ll –d /home/user1 查看user1的自家目录


4.10 删除用户同时删除用户主目录

命令格式 userdel –r 用户名功能描述:用于删除指定账号的同时也删除用户主目录(包括其中的文件)以用户的邮件池文件。# ll –d /home/user1/ 查看user1目录# userdel –r user1 删除user1及自家目录# ll –d /home/user1/  再次查看user1目录ls:/home/user1/:No such file or directory


4.11 改变用户账号名

命令格式 usermod –l 新用户登录名 当前用户登录名功能描述:usermod –l 命令用户改变已有用户的登录名# usermod –l user2 user1 改变user1的登录名为user2# tail -1 /etc/passwd 查看passwd文件中发生的改变user2:x:502:502::/home/user1:/bin/bash


4.12 锁定用户账号

命令格式 usermod –L 用户账号功能描述:用于锁定指定用户账号,使其不能登录系统。该命令是通过在shadow文件中指定用户账号的口令字段前加入锁定符号“!”锁定该用户账号# usermod –L user1# tail –l /etc/shadow


4.13 解锁用户账号

命令格式 usermod –U 用户名功能描述:用于对已锁定的用户账号进行解锁,使其能正常登录系统。该命令是通过在shadow文件中指定用户账号的口令字段中去除锁定符号“!”来解锁该账号的# tail -1 /etc/shadow 查看shadow文件# usermod –U user1     解锁user1账号# tail -1 /etc/shadow     再次查看shadow文件


4.14 配置useradd

useradd命令的默认值useradd命令的默认值是指当使用useradd命令添加账号时,如末指定相应的参数则使用默认值设置命令格式 useradd –D功能描述:用于显示或设置useradd命令使用的默认


配置useradd默认文件“useradd –D”命令显示的是/etc/default/useradd的内容# vi /etc/default/useradd


4.15 停用用户账号

停用用户账号将账号停用的意思是暂时不允许用户登录系统,而其数据仍要予以保留。可以编辑/etc/passwd文件,把要停止使用的账号标注起来:…cassia:x:502:502::/home/cassia:/bin/bash#silent:x:600:600::/home/cassia:/bin/bash在账号前面加上“#”将该行注释掉便可停用该账号


4.16 锁定账号口令

命令格式 passwd –l 用户账号名功能描述:用于锁定指定用户账号的口令,该命令只有root用户可以使用# passwd –S xmb   查询xmb口令状态Password set ,MD5 crpt    # passwd – l xmb      锁定xmb口令Locking password for user xmbPasswd:Success      xmb口令被成功锁定#passwd –S xmb       查询xmb口令状态Password locket


4.17 解锁指定用户口令

命令格式 passwd –u 用户账号名功能描述:用于解锁指定用户账号,该账号是被“passw-l”命令锁定口令的。只有root用户可以使用该命令# passwd –S xmb   查看xmb口令状态Password locked    当前xmb的口令状态为锁定# passwd –u xmb     解锁xmb口令Unlocking password for user xmbPasswd:Success.     解锁口令成功


4.18 用户组管理

组分为私有组(g)当在创建一个新用户user时,若没有指定他所属于的组,RedHat就建立一个和该用户同名的私有组。标准组 (G)标准组可以容纳多个用户,若使用标准组,在创建一个新的用户时就应该指定他所属于的组。组文件/etc/group组名 -----------用户登录时所在组组口令---------一般不使用GID------------组标识号组内用户列表---属于该组的所有用户名表


4.19 改变组账号名称

命令格式 groupmod –n 新组名 原组名功能描述:groupmod –n 命令用于改变用户组的名称,其GID保持不变# grep mygroup /etc/groupmygroup:x:502:# groupmod –n newgroup mygroup# grep 502 /etc/groupnewgroup:x:502:


4.20 删除组账号

命令格式groupdel 组账号名称功能描述groupdel命令用于删除指定的组账号,该组账号必须存在且不能作为私有组被用户账号引用


4.21 应用实例

应用实例查询用户账号mygroup存在# grep mygroup /etc/groupmygroup:x:502:添加用户账号myuser并将mygroup作为私有组# useradd –g mygroup myuser删除mygroup用户组# groupdel mygroupgroupdel:cannot remove user’s primary group当有用户使用组账号作为私有组时不能删除该组账号先删除myuser用户账号# userdel –r myuser再删除mygroup# groupdel mygroup


4.22 添加用户到组

添加用户到组命令格式 gpasswd –a 用户账号 组账号名功能描述:用于将指定用户账号添加到指定用户组# groups xmbxmb : xmb使用gpsswd命令添加用户test到xmb组# gpasswd –a test xmbAdding user test to group xmb# groups testtest: test xmb


4.23 从组中删除用户

命令格式 gpsswd –d 用户账号 组账号名功能描述:用于将指定用户从指定用户组中删除# groups testtest : test xmb# gpasswd –d test xmbRemoving user test from group xmb# group testtest :test


4.24 id命令

id命令功能:查看一个用户的UID和GID格式:id [选项]用户名[ xmb]$ id xmbUid=500(xmb) gid=500(xmb) groups=500(xmb)参数:-g:只显示用户的组的GID-G:只显示用户的附属组的GID-u:只显示UID


xmb@host

4.25 finger命令

finger命令可以查看用户的相关信息,包括用户的主目录、启动shell、用户名等。格式:finger [选项]账号[ root]# finger xmb-l以长格显示,默认选项-s以短格形式显示


root@host

4.26 变换身份为管理员 su

变换身份为管理员当root使用一般账号登录系统,随后想要转变成root身份进行系统的相关设置时,并不需要重新录,只要执行su命令并输入root账号的密码,即可转换为root账号。[ xmb]$ su   转换root用户命令Passwd:       输入root用户密码[ xmb]#    切换成root账号,exit命令可再回 到原来账号注意此处仍是在xmb的目录这样只是登录的身份转变为root,但诸如文件之类的环境变量仍然是原登录xmb的。



xmb@host

root@host

4.27 Su -命令

若要变换身份的同时更改环境变量,则必须执行su -命令:[ xmb]$ su -    转换root用户passwd:[ root]# 完全变为root若要切换成其它用户,可在su命令后加上该用户的账号[ root]# su xmb[ root]$ 转变成xmb用户提示:root转变成普通用户不需输入密码


xmb@host

root@host

root@host
xmb@host

4.28 只允许root登录

如果希望这台计算机除了root账号之外,其他账号都不得登录,可在/etc目录下建立一个名为nologin的文件。当其他用户要登录时,系统只要发现此文件存在,就全禁止他们登录:用test账号登录输入正确密码即使密码正确也会失败,这种情况通常用于管理员要维护系统时。若要再恢复用户登录,则只要将/etc/nologin 文件删除即可。


5. Vi编辑器完全使用手册

一、Unix编辑器概述

编辑器是使用计算机的重要工具之一,在各种操作系统中,编辑器都是必不可少的部件。Unix及其相似的ix操作系统系列中,为方便各种用户在各个不同的环境中使用,提供了一系列的ex编辑器,包括 ex, edit,ed 和vi.其中ex,edit,ed都是行编辑器,现在已很少有人使用,Unix提供他们的原因是考虑到满足各种用户特别是某些终端用户的需要。

值得庆幸的是,Unix提供了全屏幕的Vi编辑器,这使我们的工作轻松不少。不少DOS用户抱怨Vi编辑器不象DOS下的编辑器如edit那么好用,这是因为Vi考虑到各种用户的需要,没有使用某些通用的编辑键(在各个不同的终端机上他们的定义是不同的,在某些终端机上甚至没有这些键)。而是采用状态切换的方法,但这只是习惯的问题,一旦你熟练的使用上了vi你就会觉得它其实也很好用。

虽然 Vi采用了状态切换的方法,但电脑的硬件及操作系统多种多样,某些电脑的键盘上没有特定的几个功能键!那麽不就有某些功能不能用了?这个问题在 Unix 系统上也一样,几乎各大电脑厂商都有自己的 Unix 系统,而 vi 的操作方法也会随之有点出入。这里我们采用 PC 的键盘来说明 vi 的操作,但在具体的环境中还要参考相应的资料,这一点是值得注意的。

二、Vi入门

(一)、进入vi

在系统提示字符(如$、#)下敲入vi <档案名称>,vi 可以自动帮你载入所要编辑的文件或是开启一个新文件(如果该文件不存在或缺少文件名)。进入 vi 后萤幕左方会出现波浪符号,凡是列首有该符号就代表此列目前是空的。

(二)、两种模式

如上所述,vi存在两种模式:指令模式和输入模式。在指令模式下输入的按键将做为指令来处理:如输入a,vi即认为是在当前位置插入字符。而在输入模式下,vi则把输入的按键当作插入的字符来处理。指令模式切换到输入模式只需键入相应的输入命令即可(如a,A),而要从输入模式切换到指令模式,则需在输入模式下键入ESC键,如果不晓得现在是处於什麽模式,可以多按几次 [ESC],系统如发出哔哔声就表示已处于指令模式下了。

付:有指令模式进入输入模式的指令:

新增 (append)

a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。

A: 从光标所在列最後面的地方开始新增资料。

插入 (insert)

i: 从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。

I :从光标所在列的第一个非空白字元前面开始插入资料。

开始 (open)

o :在光标所在列下新增一列并进入输入模式。

O: 在光标所在列上方新增一列并进入输入模式。

(三)、退出vi

在指令模式下键入:q,:q!,:wq或:x(注意:号),就会退出vi。其中:wq和:x是存盘退出,而:q是直接退出,如果文件已有新的变化,vi会提示你保存文件而:q命令也会失效,这时你可以用:w命令保存文件后再用:q退出,或用:wq或:x命令退出,如果你不想保存改变后的文件,你就需要用:q!命令,这个命令将不保存文件而直接退出vi。

(四)、基本编辑

配合一般键盘上的功能键,像是方向键、[Insert] 、[Delete] 等等,现在你应该已经可以利用 vi 来编辑文件了。当然 vi 还提供其他许许多多功能让文字的处理更为方便。

何谓编辑?一般认为是文字的新增、修改以及删除,甚至包括文字区块的搬移、复制等等。先这里介绍 vi的如何做删除与修改。(注意:在 vi 的原始观念里,输入跟编辑是两码子事。编辑是在指令模式下操作的,先利用指令移动光标来定位要进行编辑的地方,然後才下指令做编辑。)

删除与修改文件的命令:

x: 删除光标所在字符。

dd :删除光标所在的列。

r :修改光标所在字元,r 後接著要修正的字符。

R: 进入取替换状态,新增文字会覆盖原先文字,直到按 [ESC] 回到指令模式下为止。

s: 删除光标所在字元,并进入输入模式。

S: 删除光标所在的列,并进入输入模式。

其实呢,在PC上根本没有这麽麻烦!输入跟编辑都可以在输入模式下完成。例如要删除字元,直接按 [Delete] 不就得了。而插入状态与取代状态可以直接用 [Insert] 切换,犯不著用什麽指令模式的编辑指令。不过就如前面所提到的,这些指令几乎是每台终端机都能用,而不是仅仅在 PC 上。在指令模式下移动光标的基本指令是 h, j, k, l 。想来各位现在也应该能猜到只要直接用 PC 的方向键就可以了,而且无论在指令模式或输入模式下都可以。多容易不是。当然 PC 键盘也有不足之处。有个很好用的指令 u 可以恢复被删除的文字,而 U 指令则可以恢复光标所在列的所有改变。这与某些电脑上的 [Undo] 按键功能相同。

三、附件:vi详细指令表(一)、基本编辑指令:新增 (append)



a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。

A: 从光标所在列最後面的地方开始新增资料。

插入 (insert)

i: 从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。

I :从光标所在列的第一个非空白字元前面开始插入资料。

开始 (open)

o :在光标所在列下新增一列并进入输入模式。

O: 在光标所在列上方新增一列并进入输入模式。

x: 删除光标所在字符。

dd :删除光标所在的列。

r :修改光标所在字元,r 後接著要修正的字符。

R: 进入取替换状态,新增文字会覆盖原先文字,直到按 [ESC] 回到指令模式下为止。

s: 删除光标所在字元,并进入输入模式。

S: 删除光标所在的列,并进入输入模式。

(二)、光标移动指令:
由於许多编辑工作是藉由光标来定位,所以 vi 提供许多移动光标的方式,这个我们列几张简表来说明(这些当然是指令模式下的指令):
┌—————┬—————————————┬—————┐
│指令 │说明 │功能键 │
├—————┼—————————————┼—————┤
│0 │移动到光标所在列的最前面 │[Home] │
├—————┼—————————————┼—————┤
│$ │移动到光标所在列的最後面 │[End] │
├—————┼—————————————┼—————┤
│[CTRL][d] │向下半页 │ │
├—————┼—————————————┼—————┤
│[CTRL][f] │向下一页 │[PageDown]│
├—————┼—————————————┼—————┤
│[CTRL][u] │向上半页 │ │
├—————┼—————————————┼—————┤
│[CTRL] │向上一页 │ [PageUp] │
└—————┴—————————————┴—————┘
┌——┬—————————————————┐
│指令│说明 │
├——┼—————————————————┤
│H │移动到视窗的第一列 │
├——┼—————————————————┤
│M │移动到视窗的中间列 │
├——┼—————————————————┤
│L │移动到视窗的最後列 │
├——┼—————————————————┤
│b │移动到下个字的第一个字母 │
├——┼—————————————————┤
│w │移动到上个字的第一个字母 │
├——┼—————————————————┤
│e │移动到下个字的最後一个字母 │
├——┼—————————————————┤
│^ │移动到光标所在列的第一个非空白字元│
└——┴—————————————————┘
┌——┬———————————————————┐
│指令│说明 │
├——┼———————————————————┤
│n- │减号移动到上一列的第一个非空白字元 │
│ │前面加上数字可以指定移动到以上 n 列 │
├——┼———————————————————┤
│n+ │加号移动到下一列的第一个非空白字元 │
│ │前面加上数字可以指定移动到以下 n 列 │
├——┼———————————————————┤
│nG │直接用数字 n 加上大写 G 移动到第 n 列 │
└——┴———————————————————┘
┌————┬———————————————┐
│指令 │说明 │
├————┼———————————————┤
│fx │往右移动到 x 字元上 │
│Fx │往左移动到 x 字元上 │
├————┼———————————————┤
│tx │往右移动到 x 字元前 │
│Tx │往左移动到 x 字元前 │
├————┼———————————————┤
│; │配合 f&t 使用,重复一次 │
│, │配合 f&t 使用,反方向重复一次 │
├————┼———————————————┤
│/string │往右移动到有 string 的地方 │
│?string │往左移动到有 string 的地方 │
├————┼———————————————┤
│n │配合 /&? 使用,重复一次 │
│N │配合 /&? 使用,反方向重复一次 │
└————┴———————————————┘
┌————┬———————————————————┬——————————┐
│指令 │说明 │备注 │
├————┼———————————————————┼——————————┤
│n( │左括号移动到句子的最前面 │句子是以 │
│ │前面加上数字可以指定往前移动 n 个句子 │! . ? 三种符号来界定│
│n) │右括号移动到下个句子的最前面 │ │
│ │前面加上数字可以指定往後移动 n 个句子 │ │
├————┼———————————————————┼——————————┤
│n{ │左括弧移动到段落的最前面 │段落是以 │
│ │前面加上数字可以指定往前移动 n 个段落 │段落间的空白列界定 │
│n} │右括弧移动到下个段落的最前面 │ │
│ │前面加上数字可以指定往後移动 n 个段落 │ │
└————┴———————————————————┴——————————┘
(三)、更多的编辑指令
这些编辑指令非常有弹性,基本上可以说是由指令与范围所构成。例如 dw 是由删除指令 d 与范围 w 所组成,代表删除一个字 d(elete) w(ord) 。
指令列表如下:
d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)
范围可以是下列几个:
e 光标所在位置到该字的最後一个字母
w 光标所在位置到下个字的第一个字母
b 光标所在位置到上个字的第一个字母
$ 光标所在位置到该列的最後一个字母
0 光标所在位置到该列的第一个字母
) 光标所在位置到下个句子的第一个字母
( 光标所在位置到该句子的第一个字母
} 光标所在位置到该段落的最後一个字母
{ 光标所在位置到该段落的第一个字母
说实在的,组合这些指令来编辑文件有一点点艺术气息。不管怎麽样,它们提供更多编辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里,然後就可以用指令 p 贴到其它地方去,这是 vi 用来处理区段拷贝与搬移的办法。某些 vi 版本,例如 Linux 所用的 elvis 可以大幅简化这一坨指令。如果稍微观察一下这些编辑指令就会发现问题其实是定范围的方式有点杂,实际上只有四个指令罢了。指令 v 非常好用,只要按下 v 键,光标所在的位置就会反白,然後就可以移动光标来设定范围,接著再直接下指令进行编辑即可。对於整列操作, vi 另外提供了更方便的编辑指令。前面曾经提到过删除整列文字的指令 dd 就是其中一个;cc 可以修改整列文字;而 yy 则是复制整列文字;指令 D 则可以删除光标到该列结束为止所有的文字。
(四)、文件操作指令
文件操作指令多以 : 开头,这跟编辑指令有点区别。
:q 结束编辑(quit)
:q! 不存档而要放弃编辑过的文件。
:w 保存文件(write)其後可加所要存档的档名。
:wq 即存档後离开。
zz 功能与 :wq 相同。
:x 与:wq相同 
(三)、更多的编辑指令
这些编辑指令非常有弹性,基本上可以说是由指令与范围所构成。例如 dw 是由删除指令 d 与范围 w 所组成,代表删除一个字 d(elete) w(ord) 。
指令列表如下:
d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)
范围可以是下列几个:
e 光标所在位置到该字的最後一个字母
w 光标所在位置到下个字的第一个字母
b 光标所在位置到上个字的第一个字母
$ 光标所在位置到该列的最後一个字母
0 光标所在位置到该列的第一个字母
) 光标所在位置到下个句子的第一个字母
( 光标所在位置到该句子的第一个字母
} 光标所在位置到该段落的最後一个字母
{ 光标所在位置到该段落的第一个字母
说实在的,组合这些指令来编辑文件有一点点艺术气息。不管怎麽样,它们提供更多编辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里,然後就可以用指令 p 贴到其它地方去,这是 vi 用来处理区段拷贝与搬移的办法。某些 vi 版本,例如 Linux 所用的 elvis 可以大幅简化这一坨指令。如果稍微观察一下这些编辑指令就会发现问题其实是定范围的方式有点杂,实际上只有四个指令罢了。指令 v 非常好用,只要按下 v 键,光标所在的位置就会反白,然後就可以移动光标来设定范围,接著再直接下指令进行编辑即可。对於整列操作, vi 另外提供了更方便的编辑指令。前面曾经提到过删除整列文字的指令 dd 就是其中一个;cc 可以修改整列文字;而 yy 则是复制整列文字;指令 D 则可以删除光标到该列结束为止所有的文字。
(四)、文件操作指令
文件操作指令多以 : 开头,这跟编辑指令有点区别。
:q 结束编辑(quit)
:q! 不存档而要放弃编辑过的文件。
:w 保存文件(write)其後可加所要存档的档名。
:wq 即存档後离开。
zz 功能与 :wq 相同。
:x 与:wq相同


6. Shell 编程

众所皆知地,UNIX上以小工具著名,利用许多简单的小工具,来完成原本需要大量软体开发的工作,这一点特色,使得UNIX成为许多人心目中理想的系统平台。 在众多的小工具中,Shell Script算得上是最基本、最强大、运用最广泛的一个。它运用围之广,不但从系统启动、程式编译、定期作业、上网连线,甚至安装整个Linux系统,都可以用它来完成。 

因为Shell Script是利用您平日在使用的一些指令,将之组合起来,成为一个"程式"。如果您平日某些序列的指令下得特别频繁,便可以将这些指令组合起来,成为另 一个新的指令。这样,不但可以简化并加速操作速度,甚至还可以干脆自动定期执行,大大简化系统管理工作。 
*************************Bash(GNU Bourne-Again SHell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等, Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种Shell上使用。 这里我介绍您bash的使用方法。事实上,当您"man bash"时,就可以看到bash的说明书,不过对许多人来说,这份说明书犹如"无字天书"一样难懂。这份文件,主要资料来源为"man bash",我加上一些实际日常的应用例来说明。希望这样能让那些始终不得其门而入的人们,多多少少能有点概念。 

教学例子
"Hello world" Shell Script 照传统程式教学例,这一节介绍Shell Script的"Hello World"如何撰写。 

*************************
#!/bin/sh # Filename : hello echo "Hello world!" 

*************************
大家应该会注意到第一行的"#!/bin/sh"。在UNIX下,所有的可执行Script,不管是那一种语言,其开头都是"#!",例如Perl是 "#!/usr/bin/perl",tcl/tk是"#!/usr/bin/wish",看您要执行的Script程式位置在那里。您也可以用"#! /bin/bash"、"#!/bin/tcsh"等等,来指定使用特定的Shell。 echo是个bash的内建指令。 

*************************
接下来,执行hello这个script: 要执行一个Script的方式有很多种。 

*************************
第一种 : 将hello这个档案的权限设定为可执行。 [ bash]# chmod 755 hello 执行 [ bash]# ./hello hello world 
foxman@foxman

foxman@foxman

*************************
第二种 : 使用bash内建指令"source"或"."。 [ bash]# source hello hello world 或 [ bash]# . hello hello world 
foxman@foxman

foxman@foxman

*************************
第三种 : 直接使用sh/bash/tcsh指令来执行。 [ bash]# sh hello hello world 或 [ bash]# bash hello hello world 
foxman@foxman

foxman@foxman

*************************
Bash执行选项 
*************************
-c string : 读取string来当命令。 -i : 互动介面。 -s : 由stdin读取命令。 - : 取消往后选项的读取。 -norc : 不要读~/.bashrc来执行。 -noprofile : 不要读/etc/profile、~/.bash_profile、~/.bash_login、~/.profile等等来执行。 -rcfile filename : 执行filename,而非~/.bashrc -version : 显示版本。 -quiet : 启动时不要哩唆。 -login : 确保bash是个login shell。 -nobraceexpansion : 不要用curly brace expansion({}符号展开)。 -nolineediting : 不用readline来读取命令列。 -posix : 改采Posix 1003.2标准。 

用于自动备份的Shell Script
一个用于自动备份的Shell Script我们先前提到,可利用Shell Script搭配crond来作定期的工作。要作定期性的工作,在UNIX上,就是与crond的搭配运用。 

*************************
首先我们先来研究如何对系统进行备份。 要对系统进行备份,不外乎便是利用一些压缩工具。在许多UNIX系统上,tar及gzip是de facto的资料交换标准。我们经常可以看见一些tar.gz或tgz档,这些档案,被称为tarball。当然了,您也可以用bzip2、zip等等压 缩工具来进行压缩,不必限定于gzip。但tar配合gzip是最普遍的,也是最方便的方式。 

要将我们想要的资料压缩起来,进行备份,可以结合tar及gzip一起进行。方式有很多种,最常用的指令是以下这一种: 
tar -c file/dir ... | gzip -9 > xxxx.tar.gz 
您也可以分开来做: 
tar -r file/dir ... -f xxxx.tar gzip -9 xxxx.tar 

或 
tar -r file/dir ... -f xxxx.tar gzip -9 xxxx.tar.gz 

*************************
在解过Linux下档案备份的基本知识后,我们来写一个将档案备份的Script。 #!/bin/sh # Filename : backup 


DIRS="/etc /var /your_directories_or_files" BACKUP="/tmp/backup.tgz" 

tar -c $DIRS | gzip -9 > $BACKUP 
其中DIRS放的是您要备份的档案及目录,BACKUP是您的备份档。可不要将/tmp放进DIRS中,那样做,您是在做备份的备份,可能将您的硬碟塞爆。 
*************************
接下来测试 [ bash]# chmod 755 backup [ bash]# ./backup 
foxman@foxman
foxman@foxman
执行完成后在/tmp就会有一个backup.tgz,里面储存了您重要的资料。您可用 
gzip -dc /tmp/backup.tgz | tar -vt 或 tar vtfz /tmp/backup.tgz 


来看看里面的档案列表。 
要解开时,可用以下指令来完成复原: 
gzip -dc /tmp/backup.tgz | tar -xv 或 tar xvfz /tmp/backup.tgz 


备份通常是仅备份系统通常最重要的部份,/etc可说是不可缺少的一部份。另外,看您系统中有那些重要的资料需要备份。通常来说,您没有必要备份 /bin、/sbin、/usr/bin、/usr/sbin、/usr/X11R6/bin等等这些执行档目录。只要备份您重要的档案即可,别把整个硬 碟备份,那是蛮呆的动作。 
*************************
如果您有许多台机器,可利用其中一台任务较轻的内部网路主机,做为主要备份主机。将所有机器都自动执行备份,然后利用NFS/Coda/Samba等网路档案系统,将备份的资料放到该备份机器中,该机器则定时收取备份资料,然后您再由该机器中进行一次备份。 这里是整个系统备份方案的图示。 

在您进行之前,先解一下,系统中那些是要备份的,那些是不需要的。 
*************************
新的backup#!/bin/sh HOSTNAME=`hostname` DIRS="/etc /var /your_important_directory" BACKUP="/tmp/$HOSTNAME.tgz" NFS="/mnt/nfs" 

tar -c $DIRS | gzip -9 > $BACKUP mv -f $BACKUP $NFS 

*************************
备份主机内的Script : collect_backup#!/bin/sh NFS="/mnt/nfs" BACKUP="/backup" 

mv -f $NFS/*.tgz $BACKUP 
在此,您不能够将所有备份都直接放在/mnt/nfs,这是危险的。万一任一台机器不小心将/mnt/nfs所有内容删除,那么备份就会消失。因此,您需要将/mnt/nfs移到一个只有该备份主机可存取的目录中。 
*************************
当这些个别的Script都测试好以后,接下来我们将他们放到crontab里面。找到您的crontab,它的位置可能在/var/spool/cron/crontabs/root、/etc/crontab、/var/cron/tabs/root。 在crontab中选择以下之一加入(看您定期的时间): 

Slackware : /var/spool/cron/crontabs/root01 * * * * /full_backup_script_path/backup 1> /dev/null 2> /dev/null # 每小时(太过火一点) 30 16 * * * /full_backup_script_path/backup 1> /dev/null 2> /dev/null # 每日16:30,下班前备份 30 16 * * 0 /full_backup_script_path/backup 1> /dev/null 2> /dev/null # 每周一16:30 0 5 1 * * /full_backup_script_path/backup 1> /dev/null 2> /dev/null # 每月一号5:0 RedHat/Debian : /etc/crontabRedHat可直接将backup放入/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly。或采用如上加入/etc/crontab的方式: 有关crontab的用法,可查"man 5 crontab",在此不详述。 

备份主机的设定类同。 
注意: 所有机器不要同时进行备份,否则网路会大塞车。备份主机收取备份的时间要设为最后,否则会收不到备份资料。您可以在实作后,将时间间隔调整一下。 
*************************
看看,两个小小不到三行的Shell Script,配合cron这个定时工具。可以让原本需要耗时多个小时的人工备份工作,简化到不到十分钟。善用您的想像力,多加一点变化,可你让您的生活变得轻松异常,快乐悠哉。
档案系统检查
系统安全一向是大多数电脑用户关心的事,在UNIX系统中,最重视的事,即系统中有没有"木马"(Trojan horse)。不管Trojan horse如何放进来的,有一点始终会不变,即被放置木马的档案,其档案日期一定会被改变,甚至会有其它的状态改变。此外,许多状况下,系统会多出一些不 知名的档案。因此,平日检查整个档案系统的状态是否有被改变,将所有状态有改变的档案,以及目前有那些程式正在执行,自动报告给系统管理员,是个避免坐上 "木马"的良方。 
*************************
#!/bin/sh # Filename : whatever_you_name_it DIRS="/etc /home /bin /sbin /usr/bin /usr/sbin /usr/local /var /your_directory" ADMIN="" FROM="" # 写入Sendmail的标头 echo "Subject: $HOSTNAME filesystem check" > /tmp/today.mail echo "From: $FROM" >> /tmp/today.mail echo "To: $ADMIN" >> /tmp/today.mail echo "This is filesystem report comes from $HOSTNAME" >> /tmp/today.mail # 报告目前正在执行的程式 ps axf >> /tmp/today.mail # 档案系统检查 echo "File System Check" >> /tmp/today.mail ls -alR $DIRS | gzip -9 > /tmp/today.gz zdiff /tmp/today.gz /tmp/yesterday.gz >> /tmp/today.mail mv -f /tmp/today.gz /tmp/yesterday.gz # 寄出信件 sendmail -t

email@your.domain.com
admin@your.domain.com

然后把它放到一个不显眼的地方去,让别人找不到。 
把它加入crontab中。 
30 7 * * * /full_check_script_path/whatever_you_name_it 1> /dev/null 2> /dev/null #上班前检查 
有些档案是固定会更动的,像/var/log/messages、/var/log/syslog、/dev/ttyX等等,不要太大惊小怪。
控制圈for
演示了几个简单的Shell Script,相信您应该对Shell Script有点概念了。现在我们开始来仔细研究一些较高等的Shell Script写作。一些进一步的说明,例如"$"、">"、">"、"1>"、"2>"符号的使用,会在 稍后解释。 
*************************
for name [ in word; ] do list ; done控制圈。 word是一序列的字,for会将word中的个别字展开,然后设定到name上面。list是一序列的工作。如果[in word;]省略掉,那么name将会被设定为Script后面所加的参数。 

*************************
例一: #!/bin/sh 

for i in a b c d e f ; do echo $i done 

它将会显示出a到f。 
*************************
例二: 另一种用法,A-Z#!/bin/sh WORD="a b c d e f g h i j l m n o p q r s t u v w x y z" 

for i in $WORD ; do echo $i done 

这个Script将会显示a到z。 
*************************
例三 : 修改副档名如果您有许多的.txt档想要改名成.doc档,您不需要一个一个来。 #!/bin/sh 

FILES=`ls /txt/*.txt` 
for txt in $FILES ; do doc=`echo $txt | sed "s/.txt/.doc/"` mv $txt $doc done 

这样可以将*.txt档修改成*.doc档。 
*************************
例四 : meow#!/bin/sh # Filename : meow for i ; do cat $i done 

当您输入"meow file1 file2 ..."时,其作用就跟"cat file1 file2 ..."一样。 
*************************
例五 : listbin #!/bin/sh # Filename : listbin 

for i in /bin/* ; do echo $i done 

当您输入"listbin"时,其作用就跟"ls /bin/*"一样。 
*************************
例六 : /etc/rc.d/rc 拿一个实际的例来说,Red Hat的/etc/rc.d/rc的启动程式中的一个片断。 

for i in /etc/rc.d/rc$runlevel.d/S*; do # Check if the script is there. [ ! -f $i ] && continue 

# Check if the subsystem is already up. subsys=${i#/etc/rc.d/rc$runlevel.d/S??} [ -f /var/lock/subsys/$subsys ] || \ [ -f /var/lock/subsys/${subsys}.init ] && continue 

# Bring the subsystem up. $i start done 

这个例中,它找出/etc/rc.d/rcX.d/S*所有档案,检查它是否存在,然后一一执行。 
流程控制case
case word in [ pattern [ | pattern ] ... ) list ;; ] ... esaccase/esac的标准用法大致如下: case $arg in pattern | sample) # arg in pattern or sample ;; pattern1) # arg in pattern1 ;; *) #default ;; esac arg是您所引入的参数,如果arg内容符合pattern项目的话,那么便会执行pattern以下的程式码,而该段程式码则以两个分号";;"做结尾。 

可以注意到"case"及"esac"是对称的,如果记不起来的话,把"case"颠倒过来即可。 
*************************
例一 : paranoia#!/bin/sh case $1 in start | begin) echo "start something" ;; stop | end) echo "stop something" ;; *) echo "Ignorant" ;; esac 

执行[ bash]# chmod 755 paranoia [ bash]# ./paranoia Ignorant [ bash]# ./paranoia start start something [ bash]# ./paranoia begin start something [ bash]# ./paranoia stop stop something [ bash]# ./paranoia end stop something 
foxman@foxman
foxman@foxman

foxman@foxman

foxman@foxman

foxman@foxman

foxman@foxman

*************************
例二 : inetpanel许多的daemon都会附上一个管理用的Shell Script,像BIND就附上ndc,Apache就附上apachectl。这些管理程式都是用shell script来写的,以下示一个管理inetd的shell script。 #!/bin/sh 

case $1 in start | begin | commence) /usr/sbin/inetd ;; stop | end | destroy) killall inetd ;; restart | again) killall -HUP inetd ;; *) echo "usage: inetpanel [start | begin | commence | stop | end | destory | restart | again]" ;; esac 

*************************
例三 : 判断系统有时候,您所写的Script可能会跨越好几种平台,如Linux、FreeBSD、Solaris等等,而各平台之间,多多少少都有不同之处,有时候需要判断目前正在那一种平台上执行。此时,我们可以利用uname来找出系统资讯。 #!/bin/sh 


SYSTEM=`uname -s` 
case $SYSTEM in Linux) echo "My system is Linux" echo "Do Linux stuff here..." ;; FreeBSD) echo "My system is FreeBSD" echo "Do FreeBSD stuff here..." ;; *) echo "Unknown system : $SYSTEM" echo "I don't what to do..." ;; esac 

流程控制select
select name [ in word; ] do list ; doneselect顾名思义就是在word中选择一项。与for相同,如果[in word;]省略,将会使用Script后面所加的参数。 例:#!/bin/sh WORD="a b c" 

select i in $WORD ; do case $i in a) echo "I am A" ;; b) echo "I am B" ;; c) echo "I am C" ;; *) break; ;; esac done 

执行结果[ bash]# ./select_demo 1) a 2) b 3) c #? 1 I am A 1) a 2) b 3) c #? 2 I am B 1) a 2) b 3) c #? 3 I am C 1) a 2) b 3) c #? 4 
foxman@foxman

返回状态Exit
在继续下去之前,我们必须要切入另一个话题,即返回状态值 - Exit Status。因为if/while/until都迁涉到了使用Exit Status来控制程式流程的问题。 
*************************
许多人都知道,在许多语言中(C/C++/Perl....),都有一个exit的函数,甚至连Bash自己都有个exit的内建命令。而exit后面所带的数字,便是返回状态值 - Exit Status。 返回状态值可以使得程式与程式之间,利用Shell script来结合的可能性大增,利用小程式,透过Shell script,来完成很杂的工作。 

在shell中,返回值为零表示成功(True),非零值为失败(False)。 
*************************
举例来说,以下这个两个小程式yes/no分别会返回0/1(成功/失败): /* yes.c */ void main(void) { exit(0); } /* no.c */ void main(void) { exit(1); } 那么以下这个"YES"的shell script便会显示"YES"。 #!/bin/sh # YES if yes ; then echo "YES" fi 而"NO"不会显示任何东西。 #!/bin/sh # NO if no ; then echo "YES" fi 

*************************
test express [ express ] 在Shell script中,test express/[ express ]这个语法被大量地使用,它是个非常实用的指令。由于它的返回值即Exit Status,经常被运用在if/while/until的场合中。而在后面,我们也会大量运用到,在进入介绍if/while/until之前,有必要 先解一下。 


其返回值为0(True)或1(False),要看表述(express)的结果为何。 
express格式 
-b file : 当档案存在并且属性是Block special(通常是/dev/xxx)时,返回True。 -c file : 当档案存在并且属性是character special(通常是/dev/xxx)时,返回True。 -d file : 当档案存在并且属性是目录时,返回True。 -e file : 当档案存在时,返回True。 -f file : 当档案存在并且是正常档案时,返回True。 -g file : 当档案存在并且是set-group-id时,返回True。 -k file : 当档案存在并且有"sticky" bit被设定时,返回True。 -L file : 当档案存在并且是symbolic link时,返回True。 -p file : 当档案存在并且是name pipe时,返回True。 -r file : 当档案存在并且可读取时,返回True。 -s file : 当档案存在并且档案大小大于零时,返回True。 -S file : 当档案存在并且是socket时,返回True。 -t fd : 当fd被开启为terminal时,返回True。 -u file : 当档案存在并且set-user-id bit被设定时,返回True。 -w file : 当档案存在并且可写入时,返回True。 -x file : 当档案存在并且可执行时,返回True。 -O file : 当档案存在并且是被执行的user id所拥有时,返回True。 -G file : 当档案存在并且是被执行的group id所拥有时,返回True。 file1 -nt file2 : 当file1比file2新时(根据修改时间),返回True。 file1 -ot file2 : 当file1比file2旧时(根据修改时间),返回True。 file1 -ef file2 : 当file1与file2有相同的device及inode number时,返回True。 -z string : 当string的长度为零时,返回True。 -n string : 当string的长度不为零时,返回True。 string1 = string2 : string1与string2相等时,返回True。 string1 != string2 : string1与string2不相等时,返回True。 ! express : express为False时,返回True。 expr1 -a expr2 : expr1及expr2为True。 expr1 -o expr2 : expr1或expr2其中之一为True。 arg1 OP arg2 : OP是-eq[equal]、-ne[not-equal]、-lt[less-than]、-le[less-than-or-equal]、-gt [greater-than]、-ge[greater-than-or-equal]的其中之一。 


*************************
在Bash中,当错误发生在致命信号时,bash会返回128+signal number做为返回值。如果找不到命令,将会返回127。如果命令找到了,但该命令是不可执行的,将返回126。除此以外,Bash本身会返回最后一个 指令的返回值。若是执行中发生错误,将会返回一个非零的值。 Fatal Signal : 128 + signo Can't not find command : 127 Can't not execute : 126 Shell script successfully executed : return the last command exit status Fatal during execution : return non-zero

流程控制if
if list then list [ elif list then list ] ... [ else list ] fi几种可能的写法 

*************************
第一种 if list then do something here fi 当list表述返回值为True(0)时,将会执行"do something here"。 

例一 : 当我们要执行一个命令或程式之前,有时候需要检查该命令是否存在,然后才执行。 if [ -x /sbin/quotaon ] ; then echo "Turning on Quota for root filesystem" /sbin/quotaon / fi 

例二 : 当我们将某个档案做为设定档时,可先检查是否存在,然后将该档案设定值载入。 # Filename : /etc/ppp/settings PHONE=1-800-COLLECT 

#!/bin/sh # Filename : phonebill if [ -f /etc/ppp/settings ] ; then source /etc/ppp/settings echo $PHONE fi 执行 [ ppp]# ./phonebill 1-800-COLLECT 

foxman@foxman

*************************
第二种 if list then do something here else do something else here fi 例三 : Hostname #!/bin/sh if [ -f /etc/HOSTNAME ] ; then HOSTNAME=`cat /etc/HOSTNAME` else HOSTNAME=localhost fi 

*************************
第三种 if list then do something here elif list then do another thing here fi 例四 : 如果某个设定档允许有好几个位置的话,例如crontab,可利用if then elif fi来找寻。 #!/bin/sh 

if [ -f /etc/crontab ] ; then CRONTAB="/etc/crontab" elif [ -f /var/spool/cron/crontabs/root ] ; then CRONTAB="/var/spool/cron/crontabs/root" elif [ -f /var/cron/tabs/root ] ; then CRONTAB="/var/cron/tabs/root" fi export CRONTAB 

*************************
第四种 if list then do something here elif list then do another thing here else do something else here fi 例五 : 我们可利用uname来判断目前系统,并分别做各系统状况不同的事。 #!/bin/sh 

SYSTEM=`uname -s` 
if [ $SYSTEM = "Linux" ] ; then echo "Linux" elif [ $SYSTEM = "FreeBSD" ] ; then echo "FreeBSD" elif [ $SYSTEM = "Solaris" ] ; then echo "Solaris" else echo "What?" fi 

控制圈while/until
while list do list done当list为True时,该圈会不停地执行。 例一 : 无限回圈写法 #!/bin/sh 

while : ; do echo "do something forever here" sleep 5 done 

例二 : 强迫把pppd杀掉。 #!/bin/sh 

while [ -f /var/run/ppp0.pid ] ; do killall pppd done 

*************************
until list do list done当list为False(non-zero)时,该圈会不停地执行。 例一 : 等待pppd上线。 #!/bin/sh until [ -f /var/run/ppp0.pid ] ; do sleep 1 done 


本文选自:似曾相识,非常感谢!



|2011-2026-版权声明|平台(网站)公约|手机版|手机版|DOOOOR 设计网 ( 吉ICP备2022003869号 )

GMT+8, 11-11-2025 21:36 , Processed in 0.289959 second(s), 374 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表