关机前常用:数据同步写入磁盘命令sync:
$ sync
惯用的关机命令:
$ shutdown
切换运行等级使用init命令。linux有7中运行等级,比如:
run level 0:关机
run level 3:纯文本模式
run level 5:含有图形接口模式
run level 6:重新启动
所以如下指令也可以关机:
$ init 0
fsck为文件系统检查的命令:
$ fsck /dev/sda7
w命令查看登录用户正在使用的进程信息,可以看到root用户有三个终端进程:
$ w
17:25:21 up 15 min, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 ****.****.****.**** 17:09 0.00s 0.02s 0.00s w
root pts/1 ****.****.****.**** 17:24 11.00s 0.00s 0.00s -bash
root pts/2 ****.****.****.**** 17:24 17.00s 0.01s 0.01s -bash
在Linux系统当中,默认的情况下,所有的系统上的账号信息都是记录在/etc/passwd这个文件内的。至于个人的密码则是记录在/etc/shadow这个文件下。 此外,Linux所有的组名都纪录在/etc/group内。
ls -al可用于查看文件详细信息:
-a:全部(all)。列举目录中的全部文件,包括隐藏文件(.filename)。位于这个列表的起首处的 .和 .. 依次是指父目录和你的当前目录。
-l:列举目录内容的细节,包括权限(模式)、所有者、组群、大小、创建日期、文件是否是到系统其它地方的链接,以及链接的指向。
[root@www ~]# ls -al
total 156
drwxr-x--- 4 root root 4096 Sep 8 14:06 . #第一个字符是d表示目录
drwxr-xr-x 23 root root 4096 Sep 8 14:21 ..
-rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg #第一个字符是-表示文件
-rw------- 1 root root 199 Sep 8 17:14 .bash_history
-rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout
-rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile
-rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc
-rw-r--r-- 1 root root 100 Jan 6 2007 .cshrc
drwx------ 3 root root 4096 Sep 5 10:37 .gconf <=范例说明处
drwx------ 2 root root 4096 Sep 5 14:09 .gconfd
-rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log <=范例说明处
-rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog
[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ]
[ 权限 ][连结][拥有者][群组][文件容量][ 修改日期 ][ 檔名 ]
注意每行第一个字符:
* 当为[ d ]则是目录,例如[上表](http://cn.linux.vbird.org/linux_basic/0210filepermission_2.php#table2.1.1)档名为『.gconf』的那一行;
* 当为[ - ]则是文件,例如[上表](http://cn.linux.vbird.org/linux_basic/0210filepermission_2.php#table2.1.1)档名为『install.log』那一行;
* 若是[ l ]则表示为连结档(link file);
* 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
* 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
关于目录的权限(即开头为d),只有对该目录具有x权限的用户才可以进入。
chgrp:改变文件所属群组:
[root@www ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录
都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
范例:
[root@www ~]# chgrp users install.log
[root@www ~]# ls -l
-rw-r--r-- 1 root users 68495 Jun 25 08:53 install.log
[root@www ~]# chgrp testing install.log (在/etc/group中不存在testing群组)
chgrp: invalid group name `testing' <== 发生错误讯息啰~找不到这个群组名~
chown:改变文件拥有着:
[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更
范例:将install.log的拥有者改为bin这个账号:
[root@www ~]# chown bin install.log #需要保证在/etc/passwd文件中存在bin用户
[root@www ~]# ls -l
-rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log
范例:将install.log的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
chmod:改变权限:
[root@www ~]# ls -al .bashrc
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
chmod命令还可以使用符号进行权限设定,其中u, g, o来代表三种身份,r,w,x代表三种权限,+,-,=表示三种权限变化:
[root@www ~]# chmod u=rwx,go=rx .bashrc
# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格!
[root@www ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc
为所有人增加写权限:
[root@www ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod a+w .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
拿掉所有人的可执行权限:
[root@www ~]# chmod a-x .bashrc
[root@www ~]# ls -al .bashrc
-rw-rw-rw- 1 root root 395 Jul 4 11:45 .bashrc
注意,对于文件有w写权限,并不代表可以删除文件。
权限对于目录的关系:
r:可以查询该目录下的文件名数据,比如使用ls
w:建立新的文件与目录;
删除已经存在的文件与目录(不论该文件的权限为何!)
将已存在的文件或目录进行更名;
搬移该目录内的文件、目录位置。
(可以理解为对文件名进行操作)
x:用户能否进入该目录,把该目录变为工作目录。类似于cd命令
注意,没有x权限但是有r权限表示仍然可以查看该目录下文件名列表 (比如在可进入的父目录里面用ls -R,但是无法查看到文件的具体内容)
如果你在某目录下不具有x的权限, 那么你就无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的r的权限。
我们的Linux在使用者登入时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够透过last这个指令读出来! 但是使用cat时,会读出乱码。
linux的目录树参考:http://cn.linux.vbird.org/linux_basic/0210filepermission_3.php
其中有各个目录大概涵盖哪些文件。
关于目录的标记:
. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表『目前使用者身份』所在的家目录
~account 代表 account 这个使用者的家目录(account是个帐号名称)
pwd:显示当前目录:
[root@www ~]# pwd [-P]
选项与参数:
-P :显示出确实的路径,而非使用连结 (link) 路径。
范例:单纯显示出目前的工作目录:
[root@www ~]# pwd
/root <== 显示出目录啦~
范例:显示出实际的工作目录,而非连结档本身的目录名而已
[root@www ~]# cd /var/mail <==注意,/var/mail是一个连结档
[root@www mail]# pwd
/var/mail <==列出目前的工作目录
[root@www mail]# pwd -P
/var/spool/mail <==怎么回事?有没有加 -P 差很多~
[root@www mail]# ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊!
mkdir创建目录命令:
[root@www tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4':
No such file or directory <== 没办法直接创建此目录啊!
[root@www tmp]# mkdir -p test1/test2/test3/test4
# 加了这个 -p 的选项,可以自行帮你创建多层目录!
范例:创建权限为rwx--x--x的目录
[root@www tmp]# mkdir -m 711 test2
[root@www tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
# 仔细看上面的权限部分,如果没有加上 -m 来强制配置属性,系统会使用默认属性。
mv:移动文件(剪切):
$ mv b.txt test #把当前目录下b.txt文件移动到当前目录下的test目录中
cp:文件复制:
范例一:用root身份,将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc
[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n <==n不覆盖,y为覆盖
# 重复作两次动作,由於 /tmp 底下已经存在 bashrc 了,加上 -i 选项后,
# 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 来二次确认呢!
范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:
[root@www ~]# cd /tmp
[root@www tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘
[root@www tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp #通常,目的文件的拥有者就是操作者
# 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变;
# 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了!
# 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 喔!如下所示:
[root@www tmp]# cp -a /var/log/wtmp wtmp_2
[root@www tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
# 了了吧!整个数据特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!
范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 底下
[root@www tmp]# cp /etc/ /tmp
cp: omitting directory `/etc' <== 如果是目录则不能直接复制,要加上 -r 的选项
[root@www tmp]# cp -r /etc/ /tmp
# 还是要再次的强调喔! -r 是可以复制目录,但是,文件与目录的权限可能会被改变
# 所以,也可以利用『 cp -a /etc /tmp 』来下达命令喔!尤其是在备份的情况下!
范例四:将范例一复制的 bashrc 创建一个连结档 (symbolic link)
[root@www tmp]# ls -l bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:02 bashrc <==先观察一下文件情况
[root@www tmp]# cp -s bashrc bashrc_slink
[root@www tmp]# cp -l bashrc bashrc_hlink
[root@www tmp]# ls -l bashrc*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc <==与原始文件不太一样了!
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc_hlink #硬链接
lrwxrwxrwx 1 root root 6 Sep 24 14:20 bashrc_slink -> bashrc #符号链接
范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
[root@www tmp]# cp -u ~/.bashrc /tmp/bashrc
# 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。
# 所以,比较常被用於『备份』的工作当中喔! ^_^
范例六:将范例四造成的 bashrc_slink 复制成为 bashrc_slink_1 与bashrc_slink_2
[root@www tmp]# cp bashrc_slink bashrc_slink_1
[root@www tmp]# cp -d bashrc_slink bashrc_slink_2
[root@www tmp]# ls -l bashrc bashrc_slink*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc
lrwxrwxrwx 1 root root 6 Sep 24 14:20 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:32 bashrc_slink_1 <==与原始文件相同
lrwxrwxrwx 1 root root 6 Sep 24 14:33 bashrc_slink_2 -> bashrc <==是连结档!
# 这个例子也是很有趣喔!原本复制的是连结档,但是却将连结档的实际文件复制过来了
# 也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非连结档的属性!
# 若要复制连结档的属性,就得要使用 -d 的选项了!如 bashrc_slink_2 所示。
范例七:将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下
[root@www tmp]# cp ~/.bashrc ~/.bash_history /tmp
# 可以将多个数据一次复制到同一个目录去!最后面一定是目录!
如果文件名以-开头:
#删除文件-aaa-
rm -aaa- #会认为-aaa-是选项
解决方法有两种:
rm ./-aaa-
rm -- -aaa-
取得路径的文件名称和目录名称:
[root@www ~]# basename /etc/sysconfig/network
network <== 很简单!就取得最后的档名~
[root@www ~]# dirname /etc/sysconfig/network
/etc/sysconfig <== 取得的变成目录名了!
mv:移动文件、目录,或更名(rename命令也可以更名):
[root@www ~]# mv [-fiu] source destination
[root@www ~]# mv [options] source1 source2 source3 .... directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会升级 (update)
范例一:复制一文件,创建一目录,将文件移动到目录中
[root@www ~]# cd /tmp
[root@www tmp]# cp ~/.bashrc bashrc
[root@www tmp]# mkdir mvtest
[root@www tmp]# mv bashrc mvtest
# 将某个文件移动到某个目录去,就是这样做!
范例二:将刚刚的目录名称更名为 mvtest2
[root@www tmp]# mv mvtest mvtest2 <== 这样就更名了!简单~
# 其实在 Linux 底下还有个有趣的命令,名称为 rename ,
# 该命令专职进行多个档名的同时更名,并非针对单一档名变更,与mv不同。请man rename。
范例三:再创建两个文件,再全部移动到 /tmp/mvtest2 当中
[root@www tmp]# cp ~/.bashrc bashrc1
[root@www tmp]# cp ~/.bashrc bashrc2
[root@www tmp]# mv bashrc1 bashrc2 mvtest2
# 注意到这边,如果有多个来源文件或目录,则最后一个目标档一定是『目录!』
# 意思是说,将所有的数据移动到该目录的意思!
查看文件的命令:
cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
od 以二进位的方式读取文件内容!
man这个命令就是呼叫less来显示说明文件的内容的。
umask:目前使用者在创建文件或目录时候的权限默认值:
[root@www ~]# umask
0022 <==与一般权限有关的是后面三个数字!
[root@www ~]# umask -S
u=rwx,g=rx,o=rx
其中,0022的后三位对应的是需要减去的值,减完以后就是755。
而在默认情况下,即umask为0000时:
若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:
-rw-rw-rw-
若使用者创建为『目录』,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:
drwxrwxrwx
所以在此时如果umask值为0022,则:
创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
[root@www ~]# umask
0022
[root@www ~]# touch test1
[root@www ~]# mkdir test2
[root@www ~]# ll
-rw-r--r-- 1 root root 0 Sep 27 00:25 test1
drwxr-xr-x 2 root root 4096 Sep 27 00:25 test2
如果我希望创建的文件可以被同组的用户编辑,则可以直接修改umask:
[root@www ~]# umask 002
[root@www ~]# touch test3
[root@www ~]# mkdir test4
[root@www ~]# ll
-rw-rw-r-- 1 root root 0 Sep 27 00:36 test3
drwxrwxr-x 2 root root 4096 Sep 27 00:36 test4
chattr:配置文件隐藏属性:
[root@www ~]# chattr [+-=][ASacdistu] 文件或目录名称
+ :添加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :配置一定,且仅有后面接的参数
a :当配置 a 之后,这个文件将只能添加数据,而不能删除也不能修改数据,只有root
才能配置这个属性。
i :他可以让一个文件『不能被删除、改名、配置连结也无法写入或新增数据!』对于系统安全性有相当大的助益!只有 root 能配置此属性
范例:请尝试到/tmp底下创建文件,并加入 i 的参数,尝试删除看看。
[root@www ~]# cd /tmp
[root@www tmp]# touch attrtest <==创建一个空文件
[root@www tmp]# chattr +i attrtest <==给予 i 的属性
[root@www tmp]# rm attrtest <==尝试删除看看
rm: remove write-protected regular empty file `attrtest'? y
rm: cannot remove `attrtest': Operation not permitted <==操作不许可
# 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除配置!
范例:请将该文件的 i 属性取消!
[root@www tmp]# chattr -i attrtest
lsattr:显示文件隐藏属性
[root@www ~]# lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏档的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的档名;
-R :连同子目录的数据也一并列出来!
[root@www tmp]# chattr +aij attrtest
[root@www tmp]# lsattr attrtest
----ia---j--- attrtest
有些文件的权限比较特殊:
[root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
-rwsr-xr-x 1 root root 22984 Jan 7 2007 /usr/bin/passwd
比如/usr/bin/passwd文件中出现在所有者位置上的s权限,表示Set UID权限:
SUID 权限仅对二进位程序(binary program)有效;
运行者对於该程序需要具有 x 的可运行权限;
本权限仅在运行该程序的过程中有效 (run-time);
运行者将具有该程序拥有者 (owner) 的权限。
另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对于目录也是无效的~这点要特别留意。
相似的,还有Set GID权限:
[root@www ~]# ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Mar 15 2007 /usr/bin/locate
该权限对于文件或者目录均有效。对于文件而言:
SGID 对二进位程序有用;
程序运行者对於该程序来说,需具备 x 的权限;
运行者在运行的过程中将会获得该程序群组的支持!
对于目录而言:
使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
Sticky Bit权限,即之前\tmp文件最后的t权限,只能运用于目录:
当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
SUID/SGID/SBIT 权限配置:
在3位权限描述符之前添加:
4 为 SUID
2 为 SGID
1 为 SBIT
比如:
[root@www ~]# cd /tmp
[root@www tmp]# touch test <==创建一个测试用空档
[root@www tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的权限
-rwsr-xr-x 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限
-rwsr-sr-x 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 权限
-rwSrwSrwT 1 root root 0 Sep 29 03:06 test
注意最后一个S和T都是大写,原因在于权限位7666,三类用户均不可执行,那么S和T代表的都为空。
也可以通过符号设定权限:
# 配置权限成为 -rws--x--x 的模样:
[root@www tmp]# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Aug 18 23:47 test
# 承上,加上 SGID 与 SBIT 在上述的文件权限中!
[root@www tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Aug 18 23:47 test
file:判断文件格式:
[root@www ~]# file ~/.bashrc
/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文字档啊!
[root@www ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1
(SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for
GNU/Linux 2.6.9, stripped
# 运行档的数据可就多的不得了!包括这个文件的 suid 权限、兼容於 Intel 386
# 等级的硬件平台、使用的是 Linux 核心 2.6.9 的动态函式库连结等等。
[root@www ~]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data <== 这是 data 文件!
which搜索命令:
[root@www ~]# which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称
范例一:分别用root与一般帐号搜寻 ifconfig 这个命令的完整档名
[root@www ~]# which ifconfig
/sbin/ifconfig <==用 root 可以找到正确的运行档名喔!
注意,不同的用户因为PATH不同,可能搜索到的命令也不一样。
whereis:查找数据库中的文件,比find快:
[root@www ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
locate:依据 /var/lib/mlocate内的数据库记载,找出使用者输入的关键字档名:
[root@www ~]# locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-r :后面可接正规表示法的显示方式
范例一:找出系统中所有与 passwd 相关的档名
[root@www ~]# locate passwd
/etc/passwd
/etc/passwd-
/etc/news/passwd.nntp
/etc/pam.d/passwd
....(底下省略)....
所以使用前需要更新数据库(该数据库一段时间也会自动更新):
updatedb:根据 /etc/updatedb.conf 的配置去搜寻系统硬盘内的档名,并升级/var/lib/mlocate 内的数据库文件。
find:查找文件命令:
-uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在/etc/passwd 里面与帐号名称对应的数字。
-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在/etc/group。
-user name :name 为使用者帐号名称。
-group name:name 为群组名称。
-name filename:搜寻文件名称为 filename 的文件;
-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.... 的属性存在!
比如:
范例五:找出档名为 passwd 这个文件
[root@www ~]# find / -name passwd
# 利用这个 -name 可以搜寻档名啊!
#搭配通配符
[root@www ~]# find /etc -name '*httpd*'
关于权限的一个例子:
#以root用户创建/tmp/test,对于该目录只赋予others用户r权限:
#以其他用户登录后,无法进入test目录,但是可以:
test@myblog:/tmp$ ls test
aaa.txt
test@myblog:/tmp$ cat test/aaa.txt
cat: test/aaa.txt: Permission denied
#以root用户对于该目录只赋予others只赋予x权限(删除r权限):
test@myblog:/tmp/test$ ls #有x权限所以可以进入该目录
ls: cannot open directory '.': Permission denied #没有r权限所以无法ls
test@myblog:/tmp/test$ cat aaa.txt #若是指定该文件名,则可以读取文件内容(前提是aaa.txt有r权限)
aaa
linux的inode/block文件存取系统:

对比一下FAT文件存取系统(windows 98 以前的微软操作系统的文件存取系统):

linux的ext2文件系统:

df:获取目前挂载的装置:
范例:找出我的根目录磁盘文件名,并观察文件系统的相关信息
[root@www ~]# df <==这个命令可以叫出目前挂载的装置
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hdc2 9920624 3822848 5585708 41% / <==就是这个光!
/dev/hdc3 4956316 141376 4559108 4% /home
/dev/hdc1 101086 11126 84741 12% /boot
tmpfs 371332 0 371332 0% /dev/shm
dumpe2fs:显示ext2、ext3、ext4文件系统的超级快和块组信息:
[root@www ~]# dumpe2fs /dev/hdc2
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name: /1 <==这个是文件系统的名称(Label)
Filesystem features: has_journal ext_attr resize_inode dir_index
filetype needs_recovery sparse_super large_file
Default mount options: user_xattr acl <==默认挂载的参数
Filesystem state: clean <==这个文件系统是没问题的(clean)
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 2560864 <==inode的总数
Block count: 2560359 <==block的总数
Free blocks: 1524760 <==还有多少个 block 可用
Free inodes: 2411225 <==还有多少个 inode 可用
First block: 0
Block size: 4096 <==每个 block 的大小啦!
Filesystem created: Fri Sep 5 01:49:20 2008
Last mount time: Mon Sep 22 12:09:30 2008
Last write time: Mon Sep 22 12:09:30 2008
Last checked: Fri Sep 5 01:49:20 2008
First inode: 11
Inode size: 128 <==每个 inode 的大小
Journal inode: 8 <==底下这三个与下一小节有关
Journal backup: inode blocks
Journal size: 128M
Group 0: (Blocks 0-32767) <==第一个 data group 内容, 包含 block 的启始/结束号码
Primary superblock at 0, Group descriptors at 1-1 <==超级区块在 0 号 block
Reserved GDT blocks at 2-626
Block bitmap at 627 (+627), Inode bitmap at 628 (+628)
Inode table at 629-1641 (+629) <==inode table 所在的 block
0 free blocks, 32405 free inodes, 2 directories <==所有 block 都用完了!
Free blocks:
Free inodes: 12-32416 <==剩余未使用的 inode 号码
Group 1: (Blocks 32768-65535)
....(底下省略)....
当我们在 Linux 下的 ext2 文件系统创建一个目录时, ext2 会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。所以说新增/删除/更名文件名与目录的 w 权限有关,因为文件名存储在目录的block而非inode中。
df:列出文件系统的整体磁盘使用量;(df的例子之前有了)
du:评估文件系统的磁盘使用量(常用在推估目录所占容量):
范例一:列出目前目录下的所有文件容量
[root@www ~]# du
8 ./test4 <==每个目录都会列出来
8 ./test2
....中间省略....
12 ./.gconfd <==包括隐藏文件的目录
220 . <==这个目录(.)所占用的总量
# 直接输入 du 没有加任何选项时,则 du 会分析『目前所在目录』
# 的文件与目录所占用的硬盘空间。但是,实际显示时,仅会显示目录容量(不含文件),
# 因此 . 目录有很多文件没有被列出来,所以全部的目录相加不会等于 . 的容量喔!
# 此外,输出的数值数据为 1K 大小的容量单位。
范例二:同范例一,但是将文件的容量也列出来
[root@www ~]# du -a
12 ./install.log.syslog <==有文件的列表了
8 ./.bash_logout
8 ./test4
8 ./test2
....中间省略....
12 ./.gconfd
220 .
实体链接:
实体链接指的是两个文件名指向同一个inode(在下面的例子中是1912701),那其实就是指向同一个block:
[root@www ~]# ln /etc/crontab . <==创建实体链接的命令
[root@www ~]# ll -i /etc/crontab /root/crontab
1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab
1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /root/crontab
符号链接:
可以看到两个文件的inode是不一样的,Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名。所以可以看到/root/crontab2的文件大小为12bytes,正好其指向的/etc/crontab文件名位12字符:
[root@www ~]# ln -s /etc/crontab crontab2
[root@www ~]# ll -i /etc/crontab /root/crontab2
1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab
654687 lrwxrwxrwx 1 root root 12 Oct 22 13:58 /root/crontab2 -> /etc/crontab
ln:制作链接:
[root@www ~]# ln [-sf] 来源文件 目标文件
选项与参数:
-s :如果不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
-f :如果 目标文件 存在时,就主动的将目标文件直接移除后再创建!
观察创建目录后链接数的变化:
[root@www ~]# ls -ld /tmp
drwxrwxrwt 5 root root 4096 Oct 22 14:22 /tmp
[root@www ~]# mkdir /tmp/testing1
[root@www ~]# ls -ld /tmp
drwxrwxrwt 6 root root 4096 Oct 22 14:37 /tmp #多了一个 /tmp/testing/..
[root@www ~]# ls -ld /tmp/testing1
drwxr-xr-x 2 root root 4096 Oct 22 14:37 /tmp/testing1 #多了/tmp/testing1和/tmp/testing1/.
mount:将文件系统挂载到某个目录上:
范例一:用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面!
[root@www ~]# mkdir /mnt/hdc6
[root@www ~]# mount /dev/hdc6 /mnt/hdc6
[root@www ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
.....中间省略.....
/dev/hdc6 1976312 42072 1833836 3% /mnt/hdc6
# 看起来,真的有挂载!且文件大小约为 2GB 左右啦!
范例二:观察目前『已挂载』的文件系统,包含各文件系统的Label名称
[root@www ~]# mount -l
/dev/hdc2 on / type ext3 (rw) [/1] #表示/dev/hdc2文件系统挂载到根目录/下,文件系统类型为ext3
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hdc3 on /home type ext3 (rw) [/home]
/dev/hdc1 on /boot type ext3 (rw) [/boot]
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/hdc6 on /mnt/hdc6 type ext3 (rw) [vbird_logical]
# 除了实际的文件系统外,很多特殊的文件系统(proc/sysfs...)也会被显示出来!
# 值得注意的是,加上 -l 选项可以列出如上特殊字体的标头(label)喔
mount:也可以用来挂载目录:
范例七:将 /home 这个目录暂时挂载到 /mnt/home 底下(需要--bind):
[root@www ~]# mkdir /mnt/home
[root@www ~]# mount --bind /home /mnt/home
[root@www ~]# ls -lid /home/ /mnt/home
2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home/
2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /mnt/home
[root@www ~]# mount -l
/home on /mnt/home type none (rw,bind) #单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称
unmount:将装置文件卸除
范例八:将本章之前自行挂载的文件系统全部卸除:
[root@www ~]# mount
.....前面省略.....
/dev/hdc6 on /mnt/hdc6 type ext3 (rw)
/dev/hdd on /media/cdrom type iso9660 (rw)
/dev/sda1 on /mnt/flash type vfat (rw,iocharset=cp950)
/home on /mnt/home type none (rw,bind)
# 先找一下已经挂载的文件系统,如上所示,特殊字体即为刚刚挂载的装置啰!
[root@www ~]# umount /dev/hdc6 <==用装置文件名来卸除
[root@www ~]# umount /media/cdrom <==用挂载点来卸除
[root@www ~]# umount /mnt/flash <==因为挂载点比较好记忆!
[root@www ~]# umount /dev/fd0 <==用装置文件名较好记!
[root@www ~]# umount /mnt/home <==一定要用挂载点!因为挂载的是目录
启动时自动挂载,是由/etc/fstab这个配置文件控制:
[root@www ~]# cat /etc/fstab
# Device Mount point filesystem parameters dump fsck
LABEL=/1 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-hdc5 swap swap defaults 0 0
# 上述特殊字体的部分与实际磁盘有关!其他则是虚拟文件系统或
# 与内存置换空间 (swap) 有关。
如何挂载本机下载好的映像文件(使用mount -o loop):
[root@www ~]# ll -h /root/centos5.2_x86_64.iso
-rw-r--r-- 1 root root 4.3G Oct 27 17:34 /root/centos5.2_x86_64.iso
# 看到上面的结果吧!这个文件就是映象档,文件非常的大吧!
[root@www ~]# mkdir /mnt/centos_dvd
[root@www ~]# mount -o loop /root/centos5.2_x86_64.iso /mnt/centos_dvd
[root@www ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/root/centos5.2_x86_64.iso
4493152 4493152 0 100% /mnt/centos_dvd
# 就是这个项目! .iso 映象文件内的所有数据可以在 /mnt/centos_dvd 看到!
[root@www ~]# ll /mnt/centos_dvd
total 584
drwxr-xr-x 2 root root 522240 Jun 24 00:57 CentOS <==瞧!就是DVD的内容啊!
-rw-r--r-- 8 root root 212 Nov 21 2007 EULA
-rw-r--r-- 8 root root 18009 Nov 21 2007 GPL
drwxr-xr-x 4 root root 2048 Jun 24 00:57 images
.....底下省略.....
[root@www ~]# umount /mnt/centos_dvd/
# 测试完成!记得将数据给他卸除!
例子:创建大文件并进行本机挂载:
首先创建大文件/home/loopdev:
[root@www ~]# dd if=/dev/zero of=/home/loopdev bs=1M count=512
512+0 records in <==读入 512 笔数据
512+0 records out <==输出 512 笔数据
536870912 bytes (537 MB) copied, 12.3484 seconds, 43.5 MB/s
# 这个命令的简单意义如下:
# if 是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的装置!
# of 是 output file ,将一堆零写入到后面接的文件中。
# bs 是每个 block 大小,就像文件系统那样的 block 意义;
# count 则是总共几个 bs 的意思。
[root@www ~]# ll -h /home/loopdev
-rw-r--r-- 1 root root 512M Oct 28 02:29 /home/loopdev
接着对其格式化:
[root@www ~]# mkfs -t ext3 /home/loopdev
mke2fs 1.39 (29-May-2006)
/home/loopdev is not a block special device.
Proceed anyway? (y,n) y <==由于不是正常的装置,所以这里会提示你!
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
.....以下省略.....
最后再挂载:
[root@www ~]# mount -o loop /home/loopdev /media/cdrom/
[root@www ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/home/loopdev 507748 18768 462766 4% /media/cdrom
swap:存储空间的一片区域。当内存不够时,会将内存中暂时不用的数据移到swap中。
集中压缩文件的扩展名:
*.Z compress 程序压缩的文件;
*.gz gzip 程序压缩的文件;
*.bz2 bzip2 程序压缩的文件;
*.tar tar 程序打包的数据,并没有压缩过;
*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
gzip:压缩与解压缩
zcat:读取纯文字档被压缩后的压缩档
[root@www ~]# gzip [-cdtv#] 档名
[root@www ~]# zcat 档名.gz
选项与参数:
-c :将压缩的数据输出到萤幕上,可透过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩档的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等资讯;
-# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
范例一:将 /etc/man.config 复制到 /tmp ,并且以 gzip 压缩
[root@www ~]# cd /tmp
[root@www tmp]# cp /etc/man.config .
[root@www tmp]# gzip -v man.config
man.config: 56.1% -- replaced with man.config.gz
[root@www tmp]# ll /etc/man.config /tmp/man*
-rw-r--r-- 1 root root 4617 Jan 6 2007 /etc/man.config
-rw-r--r-- 1 root root 2057 Nov 10 17:14 /tmp/man.config.gz <==gzip压缩比较佳
范例二:由於 man.config 是文字档,请将范例一的压缩档的内容读出来!
[root@www tmp]# zcat man.config.gz
# 由於 man.config 这个原本的文件是是文字档,因此我们可以尝试使用 zcat 去读取!
# 此时萤幕上会显示 man.config.gz 解压缩之后的文件内容!
范例三:将范例一的文件解压缩
[root@www tmp]# gzip -d man.config.gz
# 不要使用 gunzip 这个命令,不好背!使用 gzip -d 来进行解压缩!
# 与 gzip 相反, gzip -d 会将原本的 .gz 删除,产生原本的 man.config 文件。
bzip2:压缩比比gzip好,格式差不多:
[root@www ~]# bzip2 [-cdkzv#] 档名
[root@www ~]# bzcat 档名.bz2
选项与参数:
-c :将压缩的过程产生的数据输出到萤幕上!
-d :解压缩的参数
-k :保留原始文件,而不会删除原始的文件喔!
-z :压缩的参数
-v :可以显示出原文件/压缩文件的压缩比等资讯;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
范例一:将刚刚的 /tmp/man.config 以 bzip2 压缩
[root@www tmp]# bzip2 -z man.config
# 此时 man.config 会变成 man.config.bz2 !
范例二:将范例一的文件内容读出来!
[root@www tmp]# bzcat man.config.bz2
# 此时萤幕上会显示 man.config.bz2 解压缩之后的文件内容!!
范例三:将范例一的文件解压缩
[root@www tmp]# bzip2 -d man.config.bz2
tar:文件打包命令(配合-j或-z参数可以进行压缩/解压缩):
[root@www ~]# tar [-j|-z] [cv] [-f 创建的档名] filename... <==打包与压缩
[root@www ~]# tar [-j|-z] [tv] [-f 创建的档名] <==察看档名
[root@www ~]# tar [-j|-z] [xv] [-f 创建的档名] [-C 目录] <==解压缩
选项与参数:
-c :创建打包文件,可搭配 -v 来察看过程中被打包的档名(filename)
-t :察看打包文件的内容含有哪些档名,重点在察看『档名』就是了;
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
特别留意的是, -c, -t, -x 不可同时出现在一串命令列中。
-j :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2
-z :透过 gzip 的支持进行压缩/解压缩:此时档名最好为 *.tar.gz
-v :在压缩/解压缩的过程中,将正在处理的档名显示出来!
-f filename:-f 后面要立刻接要被处理的档名!建议 -f 单独写一个选项罗!
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
其他后续练习会使用到的选项介绍:
-p :保留备份数据的原本权限与属性,常用於备份(-c)重要的配置档
-P :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!
比如:打包并压缩/etc文件:
[root@www ~]# tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names <==注意这个警告信息,去除根目录/,防止解压缩后为绝对路径,覆盖了/etc/下的文件
/etc/
....中间省略....
/etc/esd.conf
/etc/crontab
# 由於加上 -v 这个选项,因此正在作用中的档名就会显示在萤幕上。
# 如果你可以翻到第一页,会发现出现上面的错误信息!底下会讲解。
# 至於 -p 的选项,重点在於『保留原本文件的权限与属性』之意。
[root@www ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
# 显示的信息会跟上面一模一样罗!
常用命令如下:
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
dd:也可以用来备份文件:
[root@www ~]# dd if="input_file" of="output_file" bs="block_size" \
> count="number"
选项与参数:
if :就是 input file 罗~也可以是装置喔!
of :就是 output file 喔~也可以是装置;
bs :规划的一个 block 的大小,若未指定则默认是 512 bytes(一个 sector 的大小)
count:多少个 bs 的意思。
范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
[root@www ~]# dd if=/etc/passwd of=/tmp/passwd.back
3+1 records in
3+1 records out
1945 bytes (1.9 kB) copied, 0.000332893 seconds, 5.8 MB/s
[root@www ~]# ll /etc/passwd /tmp/passwd.back
-rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd
-rw-r--r-- 1 root root 1945 Dec 17 18:09 /tmp/passwd.back
# 仔细的看一下,我的 /etc/passwd 文件大小为 1945 bytes,因为我没有配置 bs ,
# 所以默认是 512 bytes 为一个单位,因此,上面那个 3+1 表示有 3 个完整的
# 512 bytes,以及未满 512 bytes 的另一个 block 的意思啦!
# 事实上,感觉好像是 cp 这个命令啦~
cpio:也可以用于备份,一般配合find使用:
[root@www ~]# cpio -ovcB > [file|device] <==备份
[root@www ~]# cpio -ivcdu < [file|device] <==还原
[root@www ~]# cpio -ivct < [file|device] <==察看
备份会使用到的选项与参数:
-o :将数据 copy 输出到文件或装置上
-B :让默认的 Blocks 可以添加至 5120 bytes ,默认是 512 bytes !
这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)
还原会使用到的选项与参数:
-i :将数据自文件或装置 copy 出来系统当中
-d :自动创建目录!使用 cpio 所备份的数据内容不见得会在同一层目录中,因此我们
必须要让 cpio 在还原时可以创建新目录,此时就得要 -d 选项的帮助!
-u :自动的将较新的文件覆盖较旧的文件!
-t :需配合 -i 选项,可用在"察看"以 cpio 创建的文件或装置的内容
一些可共享的选项与参数:
-v :让储存的过程中文件名称可以在萤幕上显示
-c :一种较新的 portable format 方式储存
比如:
范例:找出 /boot 底下的所有文件,然后将他备份到 /tmp/boot.cpio 去!
[root@www ~]# find /boot -print
/boot
/boot/message
/boot/initrd-2.6.18-128.el5.img
....以下省略....
# 透过这个 find 我们可以找到 /boot 底下应该要存在的档名!包括文件与目录
[root@www ~]# find /boot | cpio -ocvB > /tmp/boot.cpio
[root@www ~]# ll -h /tmp/boot.cpio
-rw-r--r-- 1 root root 16M Dec 17 23:30 /tmp/boot.cpio
我们使用 find /boot 可以找出文件名,然后透过那条管线 |, 就能将文件名传给 cpio 来进行处理。接下来让我们来进行解压缩看看:
范例:将刚刚的文件给他在 /root/ 目录下解开
[root@www ~]# cpio -idvc < /tmp/boot.cpio
[root@www ~]# ll /root/boot
# 你可以自行比较一下 /root/boot 与 /boot 的内容是否一模一样!