鸟哥学习

鸟哥linux私房菜

1 文档

1.1 档案说明

档案属性的示意图

  • 第一栏代表这个档案的类型与权限(permission):

这个地方最需要注意了!仔细看的话,你应该可以发现这一栏其实共有十个字元:(图2.1.1及图2.1.2内的权限并无关系)

档案的类型与权限之内容

    • 第一个字元代表这个档案是『目录、档案或连结档等等』:
      • 当为[ d ]则是目录,例如上表档名为『.gconf』的那一行;
      • 当为[ - ]则是档案,例如上表档名为『install.log』那一行;
      • 若是[ l ]则表示为连结档(link file);
      • 若是[ b ]则表示为装置档里面的可供储存的周边设备(可随机存取装置);
      • 若是[ c ]则表示为装置档里面的序列埠设备,例如键盘、滑鼠(一次性读取装置)。
    • 接下来的字元中,以三个为一组,且均为『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---) , 则clas​​s1, class2, class3三人对于该档案都具有可读、可写、可执行的权限(看群组权限)。但如果是不属于projecta的其他帐号,对于此档案就不具有任何权限了。

  • 第五栏为这个档案的容量大小,预设单位为bytes;
  • 第六栏为这个档案的建档日期或者是最近的修改日期:

这一栏的内容分别为日期(月/日)及时间。如果这个档案被修改的时间距离现在太久了,那么时间部分会仅显示年份而已。

如果想要显示完整的时间格式,可以利用ls的选项,亦即:『ls -l --full-time』就能够显示出完整的时间格式了!

  • 第七栏为这个档案的档名

这个栏位就是档名了。比较特殊的是:如果档名之前多一个『 . 』,则代表这个档案为『隐藏档』。你可以使用『ls』及『ls -a』这两个指令去感受一下什么是隐藏档啰!

1.2 档案权限管理

  • chgrp :改变档案所属群组
  • chown :改变档案拥有者
  • chmod :改变档案的权限; r:4 w:2 x:1
chmod


a
+(加入) 
-(除去) 
=(设定)


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/等等。另外,其下重要的目录有:
  • /etc/init.d/:所有服务的预设启动script都是放在这里的,例如要启动或者关闭iptables的话:『 /etc/init.d/iptables start』、『/etc/init.d/ iptables stop』
  • /etc/xinetd.d/:这就是所谓的super daemon管理的各项服务的设定档目录。
  • /etc/X11/:与X Window有关的各种设定档都在这里,尤其是xorg.conf这个X Server的设定档。
/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 相关的时间参数意义

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   <==这两行其实是同一行啦!
 

 

posted @ 2014-10-29 10:02  settingsun1225  阅读(228)  评论(0编辑  收藏  举报