鸟哥学习
鸟哥linux私房菜
1 文档
1.1 档案说明
- 第一栏代表这个档案的类型与权限(permission):
这个地方最需要注意了!仔细看的话,你应该可以发现这一栏其实共有十个字元:(图2.1.1及图2.1.2内的权限并无关系)
-
- 第一个字元代表这个档案是『目录、档案或连结档等等』:
- 接下来的字元中,以三个为一组,且均为『rwx』的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
- 第一组为『档案拥有者的权限』,以『install.log』那个档案为例,该档案的拥有者可以读写,但不可执行;
- 第二组为『同群组的权限』;
- 第三组为『其他非本群组的权限』。
- 第一个字元代表这个档案是『目录、档案或连结档等等』:
- 第二栏表示有多少档名连结到此节点(i-node):
每个档案都会将他的权限与属性记录到档案系统的i-node中,不过,我们使用的目录树却是使用档名来记录,因此每个档名就会连结到一个i-node啰!这个属性记录的,就是有多少不同的档名连结到相同的一个i-node号码去就是了。关于i-node的相关资料我们会在第八章谈到档案系统时再加强介绍的。
- 第三栏表示这个档案(或目录)的『拥有者帐号』
- 第四栏表示这个档案的所属群组
在Linux系统下,你的帐号会附属于一个或多个的群组中。举刚刚我们提到的例子,class1, class2, class3均属于projecta这个群组,假设某个档案所属的群组为projecta,且该档案的权限如图2.1.2所示(-rwxrwx---) , 则class1, class2, class3三人对于该档案都具有可读、可写、可执行的权限(看群组权限)。但如果是不属于projecta的其他帐号,对于此档案就不具有任何权限了。
- 第五栏为这个档案的容量大小,预设单位为bytes;
- 第六栏为这个档案的建档日期或者是最近的修改日期:
这一栏的内容分别为日期(月/日)及时间。如果这个档案被修改的时间距离现在太久了,那么时间部分会仅显示年份而已。
如果想要显示完整的时间格式,可以利用ls的选项,亦即:『ls -l --full-time』就能够显示出完整的时间格式了!
- 第七栏为这个档案的档名
这个栏位就是档名了。比较特殊的是:如果档名之前多一个『 . 』,则代表这个档案为『隐藏档』。你可以使用『ls』及『ls -a』这两个指令去感受一下什么是隐藏档啰!
1.2 档案权限管理
- chgrp :改变档案所属群组
- chown :改变档案拥有者
- chmod :改变档案的权限; r:4 w:2 x:1
chmod | u g o a |
+(加入) -(除去) =(设定) |
r w x |
档案或目录 |
2 目录
2.1 Linux目录配置
目录 | 应放置文件内容 |
/bin | 系统有很多放置执行档的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。 在/bin底下的指令可以被root与一般帐号所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等等常用的指令。 |
/boot | 这个目录主要在放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需设定档等等。 Linux kernel常用的档名为:vmlinuz,如果使用的是grub这个开机管理程式,则还会存在/boot/grub/这个目录喔! |
/dev | 在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中的。你只要透过存取这个目录底下的某个档案,就等于存取某个装置啰~比要重要的档案有/dev/null, /dev/zero, /dev/tty , /dev/lp*, / dev/hd*, /dev/sd*等等 |
/etc | 系统主要的设定档几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。一般来说,这个目录下的各档案属性是可以让一般使用者查阅的,但是只有root有权力修改。FHS建议不要放置可执行档(binary)在这个目录中喔。比较重要的档案有: /etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。另外,其下重要的目录有:
|
/home | 这是系统预设的使用者家目录(home directory)。在你新增一个一般使用者帐号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号喔:~:代表目前这个使用者的家目录,而~dmtsai:则代表dmtsai的家目录! |
/lib | 系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已。什么是函式库呢?妳可以将他想成是『外挂』,某些指令必须要有这些『外挂』才能够顺利完成程式的执行之意。尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)喔! |
/media | media是『媒体』的英文,顾名思义,这个/media底下放置的就是可移除的装置啦! 包括软碟、光碟、DVD等等装置都暂时挂载于此。常见的档名有:/media/floppy, /media/cdrom等等。 |
/mnt | 如果妳想要暂时挂载某些额外的装置,一般建议妳可以放置到这个目录中。在古早时候,这个目录的用途与/media相同啦!只是有了/media之后,这个目录就用来暂时挂载用了。 |
/opt | 这个是给第三方协力软体放置的目录。什么是第三方协力软体啊?举例来说,KDE这个桌面管理系统是一个独立的计画,不过他可以安装到Linux系统中,因此KDE的软体就建议放置到此目录下了。另外,如果妳想要自行安装额外的软体(非原本的distribution提供的),那么也能够将你的软体安装到这里来。不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下呢! |
/root | 系统管理员(root)的家目录。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时, 该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分割槽中。 |
/sbin | Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来『设定』系统,其他使用者最多只能用来『查询』而已。 放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。 至于某些伺服器软体程式,一般则放置到/usr/sbin/当中。至于本机自行安装的软体所产生的系统执行档(system binary),则放置到/usr/local/sbin/当中了。常见的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。 |
/srv | srv可以视为『service』的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。常见的服务例如WWW, FTP等等。举例来说,WWW伺服器需要的网页资料就可以放置在/srv/www/里面。 |
/tmp | 这是让一般使用者或者是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要资料不可放置在此目录啊!因为FHS甚至建议在开机时,应该要将/tmp下的资料都删除唷! |
/lost+found | 这个目录是使用标准的ext2/ext3档案系统格式才会产生的一个目录,目的在于当档案系统发生错误时, 将一些遗失的片段放置到这个目录下。这个目录通常会在分割槽的最顶层存在, 例如你加装一颗硬碟于/disk中,那在这个系统下就会自动产生一个这样的目录『/disk/lost+found』 |
/proc | 这个目录本身是一个『虚拟档案系统(virtual filesystem)』喔!他放置的资料都是在记忆体当中,例如系统核心、行程资讯(process)、周边装置的状态及网路状态等等。因为这个目录下的资料都是在记忆体当中,所以本身不占任何硬碟空间啊!比较重要的档案例如:/proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。 |
/sys | 这个目录其实跟/proc非常类似,也是一个虚拟的档案系统,主要也是记录与核心相关的资讯。包括目前已载入的核心模组与核心侦测到的硬体装置资讯等等。这个目录同样不占硬碟容量喔! |
# 修改path变量 :
> PATH="$PATH":/root
# 取得文件或者路径:
> basename /etc/sysconfig/network
network
> dirname /etc/sysconfig/network
/etc/sysconfig
# 显示文件内容的几个命令
cat / tac(反向) / nl(添加行号列印) / od(显示非文字文件,例如 binary file)
2.2 文件特殊权限 SUID, SGID, SBIT
2.2.1 set uid
当s这个标志出现在档案拥有者的x权限上时,例如刚刚提到的/usr/bin/passwd这个档案的权限状态:『-rw s r-xr-x』,此时就被称为Set UID,简称为SUID的特殊权限。那么SUID的权限对于一个档案的特殊功能是什么呢?基本上SUID有这样的限制与功能:
- SUID 权限仅对二进位程式(binary program)有效;
- 执行者对于该程式需要具有x 的可执行权限;
- 本权限仅在执行该程式的过程中有效(run-time);
- 执行者将具有该程式拥有者(owner) 的权限。
2.2.2 set gid
如果是对档案来说, SGID 有如下的功能:
- SGID 对二进位程式有用;
- 程式执行者对于该程式来说,需具备x 的权限;
- 执行者在执行的过程中将会获得该程式群组的支援!
当一个目录设定了SGID 的权限后,他将具有如下的功能:
- 使用者若对于此目录具有r 与x 的权限时,该使用者能够进入此目录;
- 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若使用者在此目录下具有w 的权限(可以新建档案),则使用者所建立的新档案,该新档案的群组与此目录的群组相同。
2.2.3 sticky bit
这个Sticky Bit, SBIT 目前只针对目录有效,对于档案已经没有效果了。SBIT 对于目录的作用是:
- 当使用者对于此目录具有w, x 权限,亦即具有写入的权限时;
- 当使用者在该目录下建立档案或目录时,仅有自己与root 才有权力删除该档案
2.2.4 上述权限设置
- 4 为SUID
- 2 为SGID
- 1 为SBIT
> chmod 4755 filename
2.3 其他文件操作
# 查看文件类型
> file filename
# 寻找执行文件
> which [-a] command
# 文件名寻找
> whereis [-bmsu]文件或者目录名
# 查找文件
> location -[ir] keyword(文件部分名称)
# 查找文件(时间参数见下面图)
> fine [PATH] [option][action]
选项与参数:
1. 与时间有关的选项:共有-atime, -ctime 与-mtime ,以-mtime 说明
-mtime n :n 为数字,意义为在n 天之前的『一天之内』被更动过内容的档案;0 表示当前时间,即从现在到24小时前
-mtime +n :列出在n 天之前(不含n 天本身)被更动过内容的档案档名;
-mtime -n :列出在n 天之内(含n 天本身)被更动过内容的档案档名。
-newer file :file 为一个存在的档案,列出比file 还要新的档案档名
- +4代表大于等于5天前的档名:ex> find /var -mtime +4
- -4代表小于等于4天内的档案档名:ex> find /var -mtime -4
- 4则是代表4-5那一天的档案档名:ex> find /var -mtime 4
图. find 相关的时间参数意义
find选项参数,与使用者或群组名称有关的参数:
-uid n :n 为数字,这个数字是使用者的帐号ID,亦即UID ,这个UID 是记录在
/etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。
-gid n :n 为数字,这个数字是群组名称的ID,亦即GID,这个GID 记录在
/etc/group,相关的介绍我们会第四篇说明~
-user name :name 为使用者帐号名称喔!例如dmtsai
-group name:name 为群组名称喔,例如users ;
-nouser :寻找档案的拥有者不存在/etc/passwd 的人!
-nogroup :寻找档案的拥有群组不存在于/etc/group 的档案!
当你自行安装软体时,很可能该软体的属性当中并没有档案拥有者,
这是可能的!在这个时候,就可以使用-nouser 与-nogroup 搜寻。
find选项参数,与档案权限及名称有关的参数:
-name filename:搜寻档案名称为filename 的档案;
-size [+-]SIZE:搜寻比SIZE 还要大(+)或小(-)的档案。这个SIZE 的规格有:
c: 代表byte, k: 代表1024bytes。所以,要找比50KB
还要大的档案,就是『 -size +50k 』
-type TYPE :搜寻档案的类型为TYPE 的,类型主要有:一般正规档案(f),
装置档案(b, c), 目录(d), 连结档(l), socket (s),
及FIFO (p) 等属性。
-perm mode :搜寻档案权限『刚好等于』 mode 的档案,这个mode 为类似chmod
的属性值,举例来说, -rwsr-xr-x 的属性为4755 !
-perm -mode :搜寻档案权限『必须要全部囊括mode 的权限』的档案,举例来说,
我们要搜寻-rwxr--r-- ,亦即0744 的档案,使用-perm -0744,
当一个档案的权限为-rwsr-xr-x ,亦即4755 时,也会被列出来,
因为-rwsr-xr-x 的属性已经囊括了-rwxr--r-- 的属性了。
-perm +mode :搜寻档案权限『包含任一mode 的权限』的档案,举例来说,我们搜寻
-rwxr-xr-x ,亦即-perm +755 时,但一个档案属性为-rw-------
也会被列出来,因为他有-rw.... 的属性存在!
find选项参数,额外可进行的动作:
-exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到
的结果。
-print :将结果列印到萤幕上,这个动作是预设动作!
案档名:ex> find /var -mtime -4
3 认识学习bash
>type cd cd is a function cd () { if builtin cd "$@"; then [[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true; __rvm_cd_functions_set; return 0; else return $?; fi }
>env <==观察所有环境变量 HOSTNAME=www.vbird.tsai <==这部主机的主机名称 TERM=xterm <==这个终端机使用的环境是什么类型 SHELL=/bin/bash <==目前这个环境下,使用的Shell是哪一个程式? HISTSIZE=1000 <== 『记录指令的笔数』在CentOS预设可记录1000笔 USER=root <==使用者的名称啊! LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01: or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32: *.btm=0 0;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00; 31:*.taz= 00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00; 31:*.bz=00;3 1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35: *.xbm=00 ;35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <==一些颜色显示 MAIL=/var/spool/mail/root <==这个使用者所取用的mailbox位置 PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin: /root/bin <==不再多讲啊!是执行档指令搜寻路径 INPUTRC=/etc/inputrc <==与键盘按键功能有关。可以设定特殊按键! PWD=/root <==目前使用者所在的工作目录(利用pwd取出!) LANG=en_US <==这个与语系有关,底下会再介绍! HOME=/root <==这个使用者的家目录啊! _=/bin/env <==上一次使用的指令的最后一个参数(或指令本身)
>set <== 观察所有环境变量和自定义变脸
>echo PS1 <== 显示命令提示字元
- \d :可显示出『星期月日』的日期格式,如:"Mon Feb 2"
- \H :完整的主机名称。举例来说,鸟哥的练习机为『www.vbird.tsai』
- \h :仅取主机名称在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略
- \t :显示时间,为24 小时格式的『HH:MM:SS』
- \T :显示时间,为12 小时格式的『HH:MM:SS』
- \A :显示时间,为24 小时格式的『HH:MM』
- \@ :显示时间,为12 小时格式的『am/pm』样式
- \u :目前使用者的帐号名称,如『root』;
- \v :BASH 的版本资讯,如鸟哥的测试主机版本为3.2.25(1),仅取『3.2』显示
- \w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以~ 取代;
- \W :利用basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
- \# :下达的第几个指令。
- \$ :提示字元,如果是root 时,提示字元为# ,否则就是$ 啰~
>read atest this is a test <==用户输入 >echo $atest this is a test
>read -l 'please keyin your name :' -t 30 named
please keyin your name : VBird Tsai <==彩色为提示字元
>echo $named
VBird Tsai
> declare [-aixr] variable 选项与参数: -a :将后面名为variable 的变数定义成为阵列(array) 类型 -i :将后面名为variable 的变数定义成为整数数字(integer) 类型 -x :用法与export 一样,就是将后面的variable 变成环境变数; -r :将变数设定成为readonly 类型,该变数不可被更改内容,也不能unset 范例一:让变数sum进行100+300+50的加总结果 > sum=100+300+50 > echo $sum 100+300+50 <==咦!怎么没有帮我计算加总?因为这是文字型态的变数属性啊! > declare -i sum=100+300+50 > echo $sum 450
范例二:将sum变成环境变数
> declare -x sum
> export | grep sum
declare -ix sum="450" <==果然出现了!包括有i与x的宣告!
范例三:让sum变成唯读属性,不可更动!
> declare -r sum
> sum=tesgting
-bash: sum: readonly variable <==老天爷~不能改这个变数了!
范例四:让sum变成非环境变数的自订变数吧!
> declare +x sum <==将-变成+可以进行『取消』动作
> declare -p sum <== -p可以单独列出变数的类型
declare -ir sum="450" <==看吧!只剩下i, r的类型,不具有x啰!
范例:设定上面提到的var[1] ~ var[3]的变数。
> var[1]="small min"
> var[2]="big min"
> var[3]="nice min"
> echo "${var[1]}, ${var[2]}, ${var[3]}"
small min, big min, nice min
范例一:先让小写的path自订变数设定的与PATH内容相同
> path=${PATH}
> echo $path
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!
范例二:假设我不喜欢kerberos,所以要将前两个目录删除掉,如何显示?
>echo ${path#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
范例三:我想要删除前面所有的目录,仅保留最后一个目录
> echo ${path#/*:}
/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:
/root/bin <==这两行其实是同一行啦!
#由于一个#仅删除掉最短的那个,因此他删除的情况可以用底下的删除线来看:
# /usr/kerberos/sbin: /usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!
> echo ${path##/*:}
/root/bin
# 嘿!多加了一个# 变成## 之后,他变成『删除掉最长的那个资料』!亦即是:
# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin: /root/bin <==这两行其实是同一行啦!