linux指令学习

linux指令学习

求助指令

[指令] --help:查看指令使用说明
man [指令] :查看指令详细文档   man的文档地址在:/usr/share/man中   配置文件在/etc/man_db.conf中
man -f [指令]:查看man详细文档中与指令相关的文档
man -k [关键字]:查看所有包含关键字的文档
info [指令]:查看指令,与man不同的是,该文档分节点查看   文档地址在/usr/share/info中
       N:下一个节点     P:上一个节点     U:上一个节点

切换界面

ctrl+alt+[f1-f6]:
f1:x window 界面
f2-f6:命令行界面

切换身份

su -:切换为root身份
exit:回到普通用户身份

日期时间

date:显示日期
date +Y%/m%/d%:显示年月日
date +H%:M%:显示时分

cal:显示本月日历
cal 2015:显示2015年的日历
cal 10 2015:显示2015年10月的日历

语言设定

locale:查看当前系统使用的语言
export LANG=en_US.UTF-8:临时修改当前系统使用的语言
export LC_ALL=en_US.UTF-8:临时修改当前系统语言配置信息

关机

[root@study ~]# shutdown -h now 

立刻关机,其中 now 相当于时间为 0 的状态 

[root@study ~]# shutdown -h 20:25 

系统在今天的 20:25 分会关机,若在21:25才下达此指令,则隔天才关机 

[root@study ~]# shutdown -h +10 

系统再过十分钟后自动关机 

[root@study ~]# shutdown -r now 

系统立刻重新开机 

[root@study ~]# shutdown -r +30 'The system will reboot' 

再过三十分钟系统会重新开机,并显示后面的讯息给所有在线上的使用者 

[root@study ~]# shutdown -k now 'This system will reboot' 

仅发出警告信件的参数!系统并不会关机啦!吓唬人! 

重启

[root@study ~]# sync; reboot
[root@study ~]# sync; half
[root@study ~]# sync; poweroff

文件权限

用户身份一般分为三类
owner:使用者
group:群组
others:其他人
三种身份各有 
read:读
write:写
execute :执行
权限

查看文件列表

ls:list,列出当前文件下的文件列表,不包括隐藏文件
ls -l:可缩写为:ll 列出所有文件,及各文件的属性
ls -a:列出所有文件,包括隐藏文件    
ls -al:列出所有文件,包括隐藏文件,及各文件的属性
ls -al+文件名:查看指定文件,及文件的属性
ls -l --full-time:能够显示出完整 的时间格式包括年月日
[root@study ~]# ls [-aAdfFhilnrRSt] 文件名或目录名称.. 

[root@study ~]# ls [--color={never,auto,always}] 文件名或目录名称.. 

[root@study ~]# ls [--full-time] 文件名或目录名称.. 

选项与参数: 

-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用) 

-A :全部的文件,连同隐藏文件,但不包括 ... 这两个目录 

-d :仅列出目录本身,而不是列出目录内的文件数据(常用) 

-f :直接列出结果,而不进行排序 (ls 默认会以文件名排序!) 

-F :根据文件、目录等信息,给予附加数据结构,例如: 

*:代表可可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件; 

-h :将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来; 

-i :列出 inode 号码,inode 的意义下一章将会介绍; 

-l :长数据串行出,包含文件的属性与权限等等数据;(常用) 

-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!) 

-r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小; 

-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来; 

-S :以文件大小大小排序,而不是用文件名排序; 

-t :依时间排序,而不是用文件名。 

--color=never :不要依据文件特性给予颜色显示; 

--color=always :显示颜色 

--color=auto :让系统自行依据设置来判断是否给予颜色 

--full-time :以完整时间模式 (包含年、月、日、时、分) 输出 

--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime) 

而非内容变更时间 (modification time)

image-20210805085118365

文件权限解释

image-20210805085217746

  • 第一个字符代表这个文件是“目录、文件或链接文件等等”:

当为[ d ]则是目录,例如上表文件名为“.config”的那一行;

当为[ - ]则是文件,例如上表文件名为“initial-setup-ks.cfg”那一行;

若是[ l ]则表示为链接文件(link file);

若是[ b ]则表示为设备文件里面的可供储存的周边设备(可随机存取设备);

若是[ c ]则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)。

  • 接下来的字符中,以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r ]代表可读

(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。

第一组为“文件拥有者可具备的权限”,以“initial-setup-ks.cfg”那个文件为例, 该文件的拥有者可以读写,但不可执行;

第二组为“加入此群组之帐号的权限”;

第三组为“非本人且没有加入本群组之其他帐号的权限”。

当文件权限为[ ---------- ]时,说明只有root用户能够使用该文件,root基本上是不受系统的权限所限制的, 所以无论文 件权限为何,默认root都可以存取

修改文件群组

[root@study ~]# chgrp [-R] dirname/filename ... 

选项与参数: 

-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件、目录 

都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。 

范例: 

[root@study ~]# chgrp users initial-setup-ks.cfg 

[root@study ~]# ls -l 

-rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg 

[root@study ~]# chgrp testing initial-setup-ks.cfg 

chgrp: invalid group: `testing' <== 发生错误讯息啰~找不到这个群组名~

修改文件拥有者

[root@study ~]# chown [-R] 帐号名称 文件或目录 

[root@study ~]# chown [-R] 帐号名称:群组名称 文件或目录 

选项与参数: 

-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都变更 

范例:将 initial-setup-ks.cfg 的拥有者改为bin这个帐号: 

[root@study ~]# chown bin initial-setup-ks.cfg 

[root@study ~]# ls -l 

-rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg 

范例:将 initial-setup-ks.cfg 的拥有者与群组改回为root: 

[root@study ~]# chown root:root initial-setup-ks.cfg 

[root@study ~]# ls -l 

-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg 

chown .sshd initial-setup-ks.cfg:修改群组为.sshd

修改文件权限

方式一:数字修改

r:4 > w:2 > x:1
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx—] 分数则是: > owner = rwx = 4+2+1 = 7 > group = rwx = 4+2+1 = 7 > others= — = 0+0+0 = 0

所以等一下我们设置权限的变更时,该文件的权限数字就是770啦!变更权限的指令 chmod的语法是这样的:

[root@study ~]# chmod [-R] xyz 文件或目录 选项与参数: 
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都会变更


[root@study ~]# ls -al .bashrc 
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod 777 .bashrc 
[root@study ~]# ls -al .bashrc 
-rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc

方式二:符号类型改变文件权限

| chmod | u g o a | +(加入) -(除去) =(设置) | r w x | 文件或目录 |

user (u):具有可读、可写、可执行的权限;

group 与 others (g/o):具有可读与执行的权限。 所以就是

[root@study ~]# chmod u=rwx,go=rx .bashrc 

# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空白字符! 
[root@study ~]# ls -al .bashrc 
-rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc

那么假如是“ -rwxr-xr-- ”这样的权限呢?可以使用“ chmod u=rwx,g=rx,o=r filename ”来设

置。此外,如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均

可写入的权限, 那么我就可以使用:

[root@study ~]# ls -al .bashrc 

-rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc 

[root@study ~]# chmod a+w .bashrc 

[root@study ~]# ls -al .bashrc 

-rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc 

而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:

[root@study ~]# chmod a-x .bashrc 

[root@study ~]# ls -al .bashrc 

-rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc 

[root@study ~]# chmod 644 .bashrc # 测试完毕得要改回来喔!

image-20210805101052863

根据上述的分析,你可以看到,对一般文件来说,rwx 主要是针对“文件的内容”来设计权限,

对目录来说,rwx则是针对“目录内的文件名列表”来设计权限。 其中最有趣的大概就属目录的

x 权限了!“文件名怎么执行”?没道理嘛!其实,这个 x 权限设计,就相当于“该目录,也就是

该抽屉的 “钥匙” ”啦! 没有钥匙你怎么能够打开抽屉呢?对吧!

文件权限案例

假设你现在在系统使用 dmtsai 这个帐号,那么这个帐号针对 /dir1, /dir1/file1, /dir2 这三个文

件名来说,分别需要“哪些最小的权限”才能达成各项任务? 鸟哥汇整如下,如果你看得懂,

恭喜你,如果你看不懂~没关系~未来再来继续学!

image-20210805104225183

复制文件

[root@study ~]# cp 来源文件 目的文件
[root@study ~]# cp .bashrc .bashrc_test 
[root@study ~]# ls -al .bashrc* 
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc 
-rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test &lt;==新文件的属性没变

查看版本

\# 1\. 通过 uname 检查 Linux 核心与操作系统的位版本 

[dmtsai@study ~]$ uname -r # 查看核心版本 

3.10.0-229.el7.x86_64 

[dmtsai@study ~]$ uname -m # 查看操作系统的位版本 

x86_64

目录操作

cd:变换目录 

pwd:显示目前的目录 

mkdir:创建一个新的目录 

rmdir:删除一个空的目录

change directory

. 代表此层目录 .. 代表上一层目录 \- 代表前一个工作目录 ~ 代表“目前使用者身份”所在的主文件夹 ~account 代表 account 这个使用者的主文件夹(account是个帐号名称)

pwd

print Working directory

[root@study ~]# pwd [-P] 选项与参数: -P :显示出确实的路径,而非使用链接 (link) 路径。 范例:单纯显示出目前的工作目录: [root@study ~]# pwd /root <== 显示出目录啦~ 范例:显示出实际的工作目录,而非链接文件本身的目录名而已 [root@study ~]# cd /var/mail <==注意,/var/mail是一个链接文件 [root@study mail]# pwd /var/mail <==列出目前的工作目录 [root@study mail]# pwd -P /var/spool/mail <==怎么回事?有没有加 -P 差很多~ [root@study mail]# ls -ld /var/mail lrwxrwxrwx. 1 root root 10 May 4 17:51 /var/mail -> spool/mail \# 看到这里应该知道为啥了吧?因为 /var/mail 是链接文件,链接到 /var/spool/mail \# 所以,加上 pwd -P 的选项后,会不以链接文件的数据显示,而是显示正确的完整路径啊! 

mkdir

(make directory)

[root@study ~]# mkdir [-mp] 目录名称 选项与参数: -m :设置文件的权限喔!直接设置,不需要看默认权限 (umask) 的脸色~ -p :帮助你直接将所需要的目录(包含上层目录)递回创建起来! 范例:请到/tmp下面尝试创建数个新目录看看: [root@study ~]# cd /tmp [root@study tmp]# mkdir test <==创建一名为 test 的新目录 [root@study tmp]# mkdir test1/test2/test3/test4 mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory \# 话说,系统告诉我们,没可能创建这个目录啊!就是没有目录才要创建的!见鬼嘛? [root@study tmp]# mkdir -p test1/test2/test3/test4 \# 原来是要建 test4 上层没先建 test3 之故!加了这个 -p 的选项,可以自行帮你创建多层目录! 范例:创建权限为rwx--x--x的目录 [root@study tmp]# mkdir -m 711 test2 [root@study tmp]# ls -ld test* drwxr-xr-x. 2 root root 6 Jun 4 19:03 test drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1 drwx--x--x. 2 root root 6 Jun 4 19:05 test2 \# 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用默认属性。 \# 那么你的默认属性为何?这要通过下面介绍的 [umask](../Text/index.html#umask) 才能了解喔! ^_^ 

rmdir

rm -r test:不管文件是否非空,都删掉
rm -f test:不需要询问,直接删掉
rm -rf test:不管文件是否非空,不需要询问,直接删掉
[root@study ~]# rmdir [-p] 目录名称 

选项与参数: 

-p :连同“上层”“空的”目录也一起删除 

范例:将于mkdir范例中创建的目录(/tmp下面)删除掉! 

[root@study tmp]# ls -ld test* <==看看有多少目录存在? 

drwxr-xr-x. 2 root root 6 Jun 4 19:03 test 

drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1 

drwx--x--x. 2 root root 6 Jun 4 19:05 test2 

[root@study tmp]# rmdir test <==可直接删除掉,没问题 

[root@study tmp]# rmdir test1 <==因为尚有内容,所以无法删除! 

rmdir: failed to remove ‘test1’: Directory not empty 

[root@study tmp]# rmdir -p test1/test2/test3/test4 

[root@study tmp]# ls -ld test* <==您看看,下面的输出中test与test1不见了! 

drwx--x--x. 2 root root 6 Jun 4 19:05 test2 

\# 瞧!利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除~ 

\# 不过要注意的是,这个 rmdir 仅能“删除空的目录”喔! 


echo

echo:查看
[dmtsai@study ~]$ echo $PATH 

$PATH

范例:先用root的身份列出搜寻的路径为何? 

[root@study ~]# echo $PATH 

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 

范例:用dmtsai的身份列出搜寻的路径为何? 

[root@study ~]# exit # 由之前的 su - 离开,变回原本的帐号!或再取得一个终端机皆可! 

[dmtsai@study ~]$ echo $PATH 

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin 

\# 记不记得我们前一章说过,目前 /bin 是链接到 /usr/bin 当中的喔!

PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔 开, 每个目录是有“顺序”之分的。仔细看一下上面的输出,你可以发现到无论是root还是 dmtsai都有 /bin 或 /usr/bin 这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找 6.1 目录与路径到/bin/ls可执行文件啰!因为 /bin 在 CentOS 7 当中,就是链接到 /usr/bin 去的! 所以这两个目录内容会一模一样!

如何将一个路径添加到$path路径变量中

[root@study ~]# PATH="${PATH}:/root"

cp、mv、rm

cp

[root@study ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination) 

[root@study ~]# cp [options] source1 source2 source3 .... directory 

选项与参数: 

-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用) 

-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身; 

-f :为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次; 

-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用) 

-l :进行硬式链接(hard link)的链接文件创建,而非复制文件本身; 

-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用); 

-r :递回持续复制,用于目录的复制行为;(常用) 

-s :复制成为符号链接文件 (symbolic link),亦即“捷径”文件; 

-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。 

--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。 

最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!

复制(cp)这个指令是非常重要的,不同身份者执行这个指令会有不同的结果产生,尤其是那个-a, -p的选项, 对于不同身份来说,差异则非常的大!下面的练习中,有的身份为root有的身份为一般帐号 (在我这里用 dmtsai 这个帐号), 练习时请特别注意身份的差别喔!好!开始来做复制的练习与观察:

范例一:用root身份,将主文件夹下的 .bashrc 复制到 /tmp 下,并更名为 bashrc 

[root@study ~]# cp ~/.bashrc /tmp/bashrc 

[root@study ~]# cp -i ~/.bashrc /tmp/bashrc 

cp: overwrite `/tmp/bashrc'? n <==n不覆盖,y为覆盖 

\# 重复作两次动作,由于 /tmp 下面已经存在 bashrc 了,加上 -i 选项后, 

\# 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 来二次确认呢! 

范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性: 

[root@study ~]# cd /tmp 

[root@study tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘 

[root@study tmp]# ls -l /var/log/wtmp wtmp 

-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp 

-rw-r--r--. 1 root root 28416 Jun 11 19:01 wtmp 

\# 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变; 

\# 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了! 

\# 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 喔!如下所示: 

[root@study tmp]# cp -a /var/log/wtmp wtmp_2 

[root@study tmp]# ls -l /var/log/wtmp wtmp_2 

-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp 

-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 wtmp_2 

\# 瞭了吧!整个数据特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!

如果直接复制过来的文件,他的权限会变成复制者的默认权限,要想连通文件原来的权限复制过来,就需要-p选项

范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 下面 [root@study tmp]# cp /etc/ /tmp cp: omitting directory `/etc' <== 如果是目录则不能直接复制,要加上 -r 的选项 [root@study tmp]# cp -r /etc/ /tmp \# 还是要再次的强调喔! -r 是可以复制目录,但是,文件与目录的权限可能会被改变 \# 所以,也可以利用“ cp -a /etc /tmp ”来下达指令喔!尤其是在备份的情况下! 范例四:将范例一复制的 bashrc 创建一个链接文件 (symbolic link) [root@study tmp]# ls -l bashrc -rw-r--r--. 1 root root 176 Jun 11 19:01 bashrc <==先观察一下文件情况 [root@study tmp]# cp -s bashrc bashrc_slink [root@study tmp]# cp -l bashrc bashrc_hlink [root@study tmp]# ls -l bashrc* -rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc <==与原始文件不太一样了! -rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc_hlink lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc 

范例四可有趣了!使用 -l 及 -s 都会创建所谓的链接文件(link file),但是这两种链接文件却 有不一样的情况。这是怎么一回事啊? 那个 -l 就是所谓的实体链接(hard link),至于 -s 则 是符号链接(symbolic link), 简单来说,bashrc_slink 是一个“捷径”,这个捷径会链接到bashrc去!所以你会看到文件名右侧会有个指向(->)的符号!

范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来 [root@study tmp]# cp -u ~/.bashrc /tmp/bashrc \# 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。 \# 所以,比较常被用于“备份”的工作当中喔! ^_^ 范例六:将范例四造成的 bashrc_slink 复制成为 bashrc_slink_1 与bashrc_slink_2 [root@study tmp]# cp bashrc_slink bashrc_slink_1 [root@study tmp]# cp -d bashrc_slink bashrc_slink_2 [root@study tmp]# ls -l bashrc bashrc_slink* -rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc -rw-r--r--. 1 root root 176 Jun 11 19:09 bashrc_slink_1 <==与原始文件相同 lrwxrwxrwx. 1 root root 6 Jun 11 19:10 bashrc_slink_2 -> bashrc <==是链接文件! \# 这个例子也是很有趣喔!原本复制的是链接文件,但是却将链接文件的实际文件复制过来了 \# 也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非链接文件的属性! \# 若要复制链接文件的属性,就得要使用 -d 的选项了!如 bashrc_slink_2 所示。 范例七:将主文件夹的 .bashrc 及 .bash_history 复制到 /tmp 下面 [root@study tmp]# cp ~/.bashrc ~/.bash_history /tmp \# 可以将多个数据一次复制到同一个目录去!最后面一定是目录! 

总之,由于 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到:

是否需要完整的保留来源文件的信息?

来源文件是否为链接文件 (symbolic link file)?

来源文件是否为特殊的文件,例如 FIFO, socket 等?

来源文件是否为目录?

rm

(移除文件或目录)[root@study ~]# rm [-fir] 文件或目录 选项与参数: -f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息; -i :互动模式,在删除前会询问使用者是否动作 -r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!! 范例一:将刚刚在 cp 的范例中创建的 bashrc 删除掉! [root@study ~]# cd /tmp [root@study tmp]# rm -i bashrc rm: remove regular file `bashrc'? y \# 如果加上 -i 的选项就会主动询问喔,避免你删除到错误的文件名! 范例二:通过万用字符*的帮忙,将/tmp下面开头为bashrc的文件名通通删除: [root@study tmp]# rm -i bashrc* \# 注意那个星号,代表的是 0 到无穷多个任意字符喔!很好用的东西! 范例三:将 cp 范例中所创建的 /tmp/etc/ 这个目录删除掉! [root@study tmp]# rmdir /tmp/etc rmdir: failed to remove '/tmp/etc': Directory not empty <== 删不掉啊!因为这不是空的目录! [root@study tmp]# rm -r /tmp/etc rm: descend into directory `/tmp/etc'? y rm: remove regular file `/tmp/etc/fstab'? y rm: remove regular empty file `/tmp/etc/crypttab'? ^C <== 按下 [crtl]+c 中断 .....(中间省略)..... \# 因为身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y 才会删除! \# 如果不想要继续按 y ,可以按下“ [ctrl]-c ”来结束 rm 的工作。 \# 这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做: [root@study tmp]# \rm -r /tmp/etc \# 在指令前加上反斜线,可以忽略掉 alias 的指定选项喔!至于 alias 我们在bash再谈! \# 拜托!这个范例很可怕!你不要删错了!删除 /etc 系统是会挂掉的! 范例四:删除一个带有 - 开头的文件 [root@study tmp]# touch ./-aaa- <==[touch](../Text/index.html#touch)这个指令可以创建空文件! [root@study tmp]# ls -l -rw-r--r--. 1 root root 0 Jun 11 19:22 -aaa- <==文件大小为0,所以是空文件 [root@study tmp]# rm -aaa- rm: invalid option -- 'a' <== 因为 "-" 是选项嘛!所以系统误判了! Try 'rm ./-aaa-' to remove the file `-aaa-'. <== 新的 bash 有给建议的 Try 'rm --help' for more information. [root@study tmp]# rm ./-aaa- 

这是移除的指令(remove),要注意的是,通常在Linux系统下,为了怕文件被 root 误杀,

所以很多 distributions 都已经默认加入 -i 这个选项了!而如果要连目录下的东西都一起杀掉

的话, 例如子目录里面还有子目录时,那就要使用 -r 这个选项了!不过,使用“ rm -r ”这个指

令之前,请千万注意了,因为该目录或文件“肯定”会被 root 杀掉!因为系统不会再次询问你

是否要砍掉呦!所以那是个超级严重的指令下达呦! 得特别注意!不过,如果你确定该目录

不要了,那么使用 rm -r 来循环杀掉是不错的方式!

另外,范例四也是很有趣的例子,我们在之前就谈过,文件名最好不要使用 “-” 号开头, 因为

“-” 后面接的是选项,因此,单纯的使用“ rm -aaa- ”系统的指令就会误判啦! 那如果使用后面

会谈到的正则表达式时,还是会出问题的!所以,只能用避过首位字符是 “-” 的方法啦! 就是

加上本目录“ ./ ”即可!如果 man rm 的话,其实还有一种方法,那就是“ rm – -aaa- ”也可以

啊!

mv

[root@study ~]# mv [-fiu] source destination 

[root@study ~]# mv [options] source1 source2 source3 .... directory 

选项与参数: 

-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; 

-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖! 

-u :若目标文件已经存在,且 source 比较新,才会更新 (update) 

范例一:复制一文件,创建一目录,将文件移动到目录中 

[root@study ~]# cd /tmp 

[root@study tmp]# cp ~/.bashrc bashrc 

[root@study tmp]# mkdir mvtest 

[root@study tmp]# mv bashrc mvtest 

\# 将某个文件移动到某个目录去,就是这样做! 

范例二:将刚刚的目录名称更名为 mvtest2 

[root@study tmp]# mv mvtest mvtest2 <== 这样就更名了!简单~ 

\# 其实在 Linux 下面还有个有趣的指令,名称为 rename\# 该指令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。请man rename。 

范例三:再创建两个文件,再全部移动到 /tmp/mvtest2 当中 

[root@study tmp]# cp ~/.bashrc bashrc1 

[root@study tmp]# cp ~/.bashrc bashrc2 

[root@study tmp]# mv bashrc1 bashrc2 mvtest2 

\# 注意到这边,如果有多个来源文件或目录,则最后一个目标文件一定是“目录!” 

\# 意思是说,将所有的数据移动到该目录的意思! 

basename 与 dirname

[root@study ~]# basename /etc/sysconfig/network network &lt;== 很简单!就取得最后的文件名~[root@study ~]# dirname /etc/sysconfig/network /etc/sysconfig &lt;== 取得的变成目录名了!

文件内容查阅

如果我们要查阅一个文件的内容时,该如何是好呢?这里有相当多有趣的指令可以来分享一

下: 最常使用的显示文件内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查

看一个很大型的文件 (好几百MB时),但是我们只需要后端的几行字而已,那么该如何是

好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到这个目的喔!好了,说说各个指令的用

途吧!

  • cat 由第一行开始显示文件内容

  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

  • nl 显示的时候,顺道输出行号!

  • more 一页一页的显示文件内容

  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

  • head 只看头几行

  • tail 只看尾巴几行

  • od 以二进制的方式读取文件内容!

cat

Concatenate (连续)

[root@study ~]# cat [-AbEnTv] 

选项与参数: 

-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已; 

-b :列出行号,仅针对非空白行做行号显示,空白行不标行号! 

-E :将结尾的断行字符 $ 显示出来; 

-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同; 

-T :将 [tab] 按键以 ^I 显示出来; 

-v :列出一些看不出来的特殊字符 

范例一:检阅 /etc/issue 这个文件的内容 

[root@study ~]# cat /etc/issue 

\S

Kernel \r on an \m 

范例二:承上题,如果还要加印行号呢? 

[root@study ~]# cat -n /etc/issue 

1 \S 

2 Kernel \r on an \m 

3 

\# 所以这个文件有三行!看到了吧!可以印出行号呢!这对于大文件要找某个特定的行时,有点用处! 

\# 如果不想要编排空白行的行号,可以使用“cat -b /etc/issue”,自己测试看看: 

范例三:将 /etc/man_db.conf 的内容完整的显示出来(包含特殊字符) 

[root@study ~]# cat -A /etc/man_db.conf 

\# $ 

....(中间省略).... 

MANPATH_MAP^I/bin^I^I^I/usr/share/man$ 

MANPATH_MAP^I/usr/bin^I^I/usr/share/man$ 

MANPATH_MAP^I/sbin^I^I^I/usr/share/man$ 

MANPATH_MAP^I/usr/sbin^I^I/usr/share/man$ 

.....(下面省略)..... 

\# 上面的结果限于篇幅,鸟哥删除掉很多数据了。另外,输出的结果并不会有特殊字体, 

\# 鸟哥上面的特殊字体是要让您发现差异点在哪里就是了。基本上,在一般的环境中, 

\# 使用 [tab] 与空白键的效果差不多,都是一堆空白啊!我们无法知道两者的差别。 

\# 此时使用 cat -A 就能够发现那些空白的地方是啥鬼东西了![tab]会以 ^I 表示, 

\# 断行字符则是以 $ 表示,所以你可以发现每一行后面都是 $ 啊!不过断行字符 

\# 在Windows/Linux则不太相同,Windows的断行字符是 ^M$ 啰。 

\# 这部分我们会在[第九章 vim 软件](../Text/index.html#tips_dos)的介绍时,再次的说明到喔!

tac

反向列示

[root@study ~]# tac /etc/issue Kernel \r on an \m \S\# 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔! 

nl

添加行号打印[root@study ~]# nl [-bnw] 文件 选项与参数: -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); -b t :如果有空行,空的那一行不要列出行号(默认值); -n :列出行号表示的方法,主要有三种: -n ln :行号在屏幕的最左方显示; -n rn :行号在自己字段的最右方显示,且不加 0 ; -n rz :行号在自己字段的最右方显示,且加 0 ; -w :行号字段的占用的字符数。 范例一:用 nl 列出 /etc/issue 的内容 [root@study ~]# nl /etc/issue 1 \S 2 Kernel \r on an \m \# 注意看,这个文件其实有三行,第三行为空白(没有任何字符), \# 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做: [root@study ~]# nl -b a /etc/issue 1 \S 2 Kernel \r on an \m 3 \# 呵呵!行号加上来啰~那么如果要让行号前面自动补上 0 呢?可这样 [root@study ~]# nl -b a -n rz /etc/issue 000001 \S 000002 Kernel \r on an \m 000003 \# 嘿嘿!自动在自己字段的地方补上 0 了~默认字段是六位数,如果想要改成 3 位数? [root@study ~]# nl -b a -n rz -w 3 /etc/issue 001 \S 002 Kernel \r on an \m 003 \# 变成仅有 3 位数啰~ 

nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将

行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能呢。

more

可翻页检视

[root@study ~]# more /etc/man_db.conf

空白键 (space):代表向下翻一页;

Enter :代表向下翻“一行”;

/字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字;

:f :立刻显示出文件名以及目前显示的行数;

q :代表立刻离开 more ,不再显示该文件内容。

b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

less

less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,你瞧,是不是更容易使用来观看一个文件的内容了呢!

空白键 :向下翻动一页;

[pagedown]:向下翻动一页;

[pageup] :向上翻动一页;

/字串 :向下搜寻“字串”的功能;

?字串 :向上搜寻“字串”的功能;

n :重复前一个搜寻 (与 / 或 ? 有关!)

N :反向的重复前一个搜寻 (与 / 或 ? 有关!)

g :前进到这个数据的第一行去;

G :前进到这个数据的最后一行去 (注意大小写);

q :离开 less 这个程序;

数据撷取

head

取出前面几行

[root@study ~]# head [-n number] 文件 选项与参数: -n :后面接数字,代表显示几行的意思 [root@study ~]# head /etc/man_db.conf \# 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样: [root@study ~]# head -n 20 /etc/man_db.conf 范例:如果后面100行的数据都不打印,只打印/etc/man_db.conf的前面几行,该如何是好? [root@study ~]# head -n -100 /etc/man_db.conf 

head 的英文意思就是“头”啦,那么这个东西的用法自然就是显示出一个文件的前几行啰! 没

错!就是这样!若没有加上 -n 这个选项时,默认只显示十行,若只要一行呢?那就加入“

head -n 1 filename ”即可!

另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列前

的所有行数, 但不包括后面100行。举例来说 CentOS 7.1 的 /etc/mandb.conf 共有131行,

则上述的指令*“head -n -100 /etc/man_db.conf”* 就会列出前面31行,后面100行不会打印出来

了。这样说,比较容易懂了吧? ^

tail

取出后面几行

[root@study ~]# tail [-n number] 文件 

选项与参数: 

-n :后面接数字,代表显示几行的意思 

-f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测 

[root@study ~]# tail /etc/man_db.conf 

\# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样: 

[root@study ~]# tail -n 20 /etc/man_db.conf 

范例一:如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据时? 

[root@study ~]# tail -n +100 /etc/man_db.conf 

范例二:持续侦测/var/log/messages的内容 

[root@study ~]# tail -f /var/log/messages 

<==要等到输入[crtl]-c之后才会离开tail这个指令的侦测!

例题:假如我想要显示 /etc/man_db.conf 的第 11 到第 20 行呢?答:这个应该不算难,想一 想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:“ head -n 20 /etc/man_db.conf | tail -n 10 ”,这样就可以得到第 11 到第 20 行之间的内容了!

这两个指令中间有个管线 (|) 的符号存在,这个管线的意思是:“前面的指令所输出的讯 息,请通过管线交由后续的指令继续使用”的意思。 所以, head -n 20 /etc/man_db.conf 会将 文件内的 20 行取出来,但不输出到屏幕上,而是转交给后续的 tail 指令继续处理。 因此 tail “不需要接文件名”,因为 tail 所需要的数据是来自于 head 处理后的结果!这样说,有没有理解?

非纯文本文件:od

我们上面提到的,都是在查阅纯文本文件的内容。那么万一我们想要查阅非文本文件,举例 来说,例如 /usr/bin/passwd 这个可执行文件的内容时, 又该如何去读出信息呢?事实上,由 于可执行文件通常是 binary file ,使用上头提到的指令来读取他的内容时, 确实会产生类似 乱码的数据啊!那怎么办?没关系,我们可以利用 od 这个指令来读取喔!

[root@study ~]# od [-t TYPE] 文件 

选项或参数: 

-t :后面可以接各种“类型 (TYPE)”的输出,例如: 

a :利用默认的字符来输出; 

c :使用 ASCII 字符来输出 

d[size] :利用十进制(decimal)来输出数据,每个整数占用 size Bytes ; 

f[size] :利用浮点数值(floating)来输出数据,每个数占用 size Bytes ; 

o[size] :利用八进位(octal)来输出数据,每个整数占用 size Bytes ; 

x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size Bytes ; 

范例一:请将/usr/bin/passwd的内容使用ASCII方式来展现! 

[root@study ~]# od -t c /usr/bin/passwd 

0000000 177 E L F 002 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 

0000020 003 \0 > \0 001 \0 \0 \0 364 3 \0 \0 \0 \0 \0 \0 

0000040 @ \0 \0 \0 \0 \0 \0 \0 x e \0 \0 \0 \0 \0 \0 

0000060 \0 \0 \0 \0 @ \0 8 \0 \t \0 @ \0 035 \0 034 \0 

0000100 006 \0 \0 \0 005 \0 \0 \0 @ \0 \0 \0 \0 \0 \0 \0 

.....(后面省略).... 

\# 最左边第一栏是以 8 进位来表示Bytes数。以上面范例来说,第二栏0000020代表开头是 

\# 第 16 个 byes (2x8) 的内容之意。 

范例二:请将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表 

[root@study ~]# od -t oCc /etc/issue 

0000000 134 123 012 113 145 162 156 145 154 040 134 162 040 157 156 040 

\ S \n K e r n e l \ r o n 

0000020 141 156 040 134 155 012 012 

a n \ m \n \n 

0000027 

\# 如上所示,可以发现每个字符可以对应到的数值为何!要注意的是,该数值是 8 进位喔! 

\# 例如 S 对应的记录数值为 123 ,转成十进制:1x8^2+2x8+3=83

例题:我不想找 google,想要立刻找到 password 这几个字的 ASCII 对照,该如何通过 od

来判断?答:其实可以通过刚刚上一个小节谈到的管线命令来处理!如下所示: echo

password | od -t oCc echo 可以在屏幕上面显示任何信息,而这个信息不由屏幕输出,而是传

给 od 去继续处理!就可以得到 ASCII code 对照啰!

touch

修改文件时间或创建新文件

modification timemtime): 当该文件的“内容数据”变更时,就会更新这个时间!内

容数据指的是文件的内容,而不是文件的属性或权限喔!

status timectime): 当该文件的“状态 (status)”改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。

access timeatime): 当“该文件的内容被取用”时,就会更新这个读取时间(access)。举例来说,我们使用 cat 去读取 /etc/man_db.conf , 就会更新该文件的atime 了。

[root@study ~]# date; ls -l /etc/man_db.conf ; ls -l --time=atime /etc/man_db.conf ; \ 

\> ls -l --time=ctime /etc/man_db.conf # 这两行其实是同一行喔!用分号隔开 

Tue Jun 16 00:43:17 CST 2015 # 目前的时间啊! 

-rw-r--r--. 1 root root 5171 Jun 10 2014 /etc/man_db.conf # 在 2014/06/10 创建的内容(mtime) 

-rw-r--r--. 1 root root 5171 Jun 15 23:46 /etc/man_db.conf # 在 2015/06/15 读取过内容(atime) 

-rw-r--r--. 1 root root 5171 May 4 17:54 /etc/man_db.conf # 在 2015/05/04 更新过状态(ctime) 

\# 为了要让数据输出比较好看,所以鸟哥将三个指令同时依序执行,三个指令中间用分号 (;) 隔开即可。 
[root@study ~]# touch [-acdmt] 文件 

选项与参数: 

-a :仅修订 access time; 

-c :仅修改文件的时间,若该文件不存在则不创建新文件; 

-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间" 

-m :仅修改 mtime ; 

-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm] 

范例一:新建一个空的文件并观察时间 

[dmtsai@study ~]# cd /tmp 

[dmtsai@study tmp]# touch testtouch 

[dmtsai@study tmp]# ls -l testtouch 

-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch 

\# 注意到,这个文件的大小是 0 呢!在默认的状态下,如果 touch 后面有接文件, 

\# 则该文件的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该文件不存在, 

\# 则会主动的创建一个新的空的文件喔!例如上面这个例子! 

范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期 

[dmtsai@study tmp]# cp -a ~/.bashrc bashrc 

[dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc 

Tue Jun 16 00:49:24 CST 2015 <==这是目前的时间 

-rw-r--r--. 1 dmtsai dmtsai 231 Mar 6 06:06 bashrc <==这是 mtime 

-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 23:44 bashrc <==这是 atime 

-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:47 bashrc <==这是 ctime

至于执行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间

(mtime)与原本文件相同。 但是由于这个文件是刚刚被创建的,因此状态(ctime)就变成

现在的时间啦!那如果你想要变更这个文件的时间呢?可以这样做:

范例三:修改案例二的 bashrc 文件,将日期调整为两天前 [dmtsai@study tmp]# touch -d "2 days ago" bashrc [dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc Tue Jun 16 00:51:52 CST 2015 -rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc -rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc -rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:51 bashrc \# 跟上个范例比较看看,本来是 16 日变成 14 日了 (atime/mtime)~不过, ctime 并没有跟着改变喔! 范例四:将上个范例的 bashrc 日期改为 2014/06/15 2:02 [dmtsai@study tmp]# touch -t 201406150202 bashrc [dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc Tue Jun 16 00:54:07 CST 2015 -rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 2014 bashrc -rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 2014 bashrc -rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:54 bashrc \# 注意看看,日期在 atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间!

touch 这个指令最常被使用的情况是:

创建一个空的文件;

将某个文件日期修订为目前 (mtime 与 atime)

umask

基本上, umask 就是指定 “目前使用者在创建文件或目录时 候的权限默认值”

[root@study ~]# umask 0022 &lt;==与一般权限有关的是后面三个数字! [root@study ~]# umask -Su=rwx,g=rx,o=rx
  • 若使用者创建为“文件”则默认“没有可执行( x )权限”,亦即只有 rw 这两个项目,也就 是最大为 666 分,默认权限如下: -rw-rw-rw-

  • 若使用者创建为“目录”,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下: drwxrwxrwx

要注意的是,umask 的分数指的是“该默认值需要减掉的权限!”因为 r、w、x 分别是 4、2、1 分,所以啰!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,这样了解吗?请问你, 5 分是什么?呵呵! 就是读与执行的权限啦!

如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不

过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:

  • 创建文件时:(-rw-rw-rw-) - (-----w–w-) ==> -rw-r–r--

  • 创建目录时:(drwxrwxrwx) - (d----w–w-) ==> drwxr-xr-x

[root@study ~]# umask 0022 [root@study ~]# touch test1 [root@study ~]# mkdir test2 [root@study ~]# ll -d test* -rw-r--r--. 1 root root 0 6月 16 01:11 test1 drwxr-xr-x. 2 root root 6 6月 16 01:11 test2

设定umask

[root@study ~]# umask 002 [root@study ~]# touch test3 [root@study ~]# mkdir test4 [root@study ~]# ll -d test[34] # 中括号 [ ] 代表中间有个指定的字符,而不是任意字符的意思 -rw-rw-r--. 1 root root 0 6月 16 01:12 test3 drwxrwxr-x. 2 root root 6 6月 16 01:12 test4 

例题:假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?答:

umask 为 003 ,所以拿掉的权限为 --------wx,因此: 文件: (-rw-rw-rw-) - (--------wx)

= -rw-rw-r-- 目录: (drwxrwxrwx) - (d-------wx) = drwxrwxr–

chattr

设置文件隐藏属性

[root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称 

选项与参数: 

\+ :增加某一个特殊参数,其他原本存在参数则不动。 

\- :移除某一个特殊参数,其他原本存在参数则不动。 

= :设置一定,且仅有后面接的参数 

A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改, 

可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目) 

S :一般文件是非同步写入磁盘的(原理请参考[前一章sync](../Text/index.html#sync)的说明),如果加上 S 这个属性时, 

当你进行任何文件的修改,该更动会“同步”写入磁盘中。 

a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性 

c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩, 

但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!) 

d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份 

i :这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!” 

对于系统安全性有相当大的助益!只有 root 能设置此属性 

s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间, 

所以如果误删了,完全无法救回来了喔! 

u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中, 

可以使用来救援该文件喔! 

注意1:属性设置常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能设置 

注意2:xfs 文件系统仅支持 AadiS 而已 

范例:请尝试到/tmp下面创建文件,并加入 i 的参数,尝试删除看看。 

[root@study ~]# cd /tmp 

[root@study tmp]# touch attrtest <==创建一个空文件 

[root@study tmp]# chattr +i attrtest <==给予 i 的属性 

[root@study tmp]# rm attrtest <==尝试删除看看 

rm: remove regular empty file `attrtest'? y 

rm: cannot remove `attrtest': Operation not permitted 

\# 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设置! 

范例:请将该文件的 i 属性取消! 

[root@study tmp]# chattr -i attrtest 

这个指令是很重要的,尤其是在系统的数据安全上面!由于这些属性是隐藏的性质,所以需

要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 与 +a 这个属性了。+i 可以让

一个文件无法被更动,对于需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相

当多的属性是需要 root 才能设置的呢!

此外,如果是 log file 这种的登录文件,就更需要 +a 这个可以增加,但是不能修改旧有的数

据与删除的参数了!怎样?很棒吧! 未来提到登录文件 (十八章) 的认知时,我们再来聊一

聊如何设置他吧!

lsattr

显示文件隐藏属性

[root@study ~]# lsattr [-adR] 文件或目录 选项与参数: -a :将隐藏文件的属性也秀出来; -d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名; -R :连同子目录的数据也一并列出来! [root@study tmp]# chattr +aiS attrtest [root@study tmp]# lsattr attrtest --S-ia---------- attrtest 

使用 chattr 设置后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个指令在使用上必须要

特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密

码记录文件给他设置成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一

直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!

文件特殊权限

SUID, SGID, SBIT

[root@study ~]# ls -ld /tmp ; ls -l /usr/bin/passwd drwxrwxrwt. 14 root root 4096 Jun 16 01:27 /tmp -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd 

Set UID

当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的 权限状态:“-rwsr-xr-x”,此时就被称为 Set UID,简称为 SUID 的特殊权限。 那么SUID的权 限对于一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:

SUID 权限仅对二进制程序(binary program)有效;

执行者对于该程序需要具有 x 的可执行权限;

本权限仅在执行该程序的过程中有效 (run-time);

执行者将具有该程序拥有者 (owner) 的权限。

讲这么硬的东西你可能对于 SUID 还是没有概念,没关系,我们举个例子来说明好了。 我们 的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限 为:“---------- 1 root root”,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 dmtsai 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入“passwd”这个指令来看看,嘿嘿!一般使用者当然可以 修改自己的密码了! 唔!有没有冲突啊!明明 /etc/shadow 就不能让 dmtsai 这个一般帐户去存取的,为什么 dmtsai 还能够修改这个文件内的密码呢? 这就是 SUID 的功能啦!借由上述的功能说明,我

们可以知道 :

\1. dmtsai 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 dmtsai 能执行 passwd;

\2. passwd 的拥有者是 root 这个帐号;

\3. dmtsai 执行 passwd 的过程中,会“暂时”获得 root 的权限;

\4. /etc/shadow 就可以被 dmtsai 所执行的 passwd 所修改。

但如果 dmtsai 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权

限,所以 dmtsai 执行 “cat /etc/shadow” 时,是不能读取 /etc/shadow 的。我们用一张示意图

来说明如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knZVe05Q-1628257678164)(https://i.loli.net/2021/08/06/FsKSYvMIArnEBZf.png)]

另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell

script 只是将很多的 binary 可执行文件叫进来执行而已!所以 SUID 的权限部分,还是得要看

shell script 调用进来的程序的设置, 而不是 shell script 本身。当然,SUID 对于目录也是无

效的~这点要特别留意。

SGID

当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 啰!是

这样没错!_。 举例来说,你可以用下面的指令来观察到具有 SGID 权限的文件喔:

[root@study ~]# ls -l /usr/bin/locate -rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate 

与 SUID 不同的是,SGID 可以针对文件或目录来设置!如果是对文件来说, SGID 有如下的

功能:

SGID 对二进制程序有用;

程序执行者对于该程序来说,需具备 x 的权限;

执行者在执行的过程中将会获得该程序群组的支持!

举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件 的内容 (详细说明会在下节讲述), mlocate.db 的权限如下:

[root@study ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db -rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate -rw-r-----. 1 root slocate 2349055 Jun 15 03:44 /var/lib/mlocate/mlocate.db 

与 SUID 非常的类似,若我使用 dmtsai 这个帐号去执行 locate 时,那 dmtsai 将会取得

slocate 群组的支持, 因此就能够去读取 mlocate.db 啦!非常有趣吧!

除了 binary program 之外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途!

当一个目录设置了 SGID 的权限后,他将具有如下的功能:

使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;

使用者在此目录下的有效群组(effective group)将会变成该目录的群组;

用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文

件,该新文件的群组与此目录的群组相同。

SGID 对于专案开发来说是非常重要的!因为这涉及群组权限的问题,您可以参考一下本章后

续情境仿真的案例,应该就能够对于 SGID 有一些了解的!_

Sticky Bit

这个 Sticky Bit, SBIT 目前只针对目录有效,对于文件已经没有效果了。SBIT 对于目录的作用

是:

当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;

当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

换句话说:当甲这个使用者于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权

限, 这表示“甲使用者对该目录内任何人创建的目录或文件均可进行 “删除/更名/搬移” 等动

作。” 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目

录进行删除/更名/移动等动作,而无法删除他人的文件。

举例来说,我们的 /tmp 本身的权限是“drwxrwxrwt”, 在这样的权限内容下,任何人都可以在

/tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个

特性也是挺重要的啊!你可以这样做个简单的测试:

\1. 以 root 登陆系统,并且进入 /tmp 当中;

\2. touch test,并且更改 test 权限成为 777 ;

\3. 以一般使用者登陆,并进入 /tmp;

\4. 尝试删除 test 这个文件!

由于 SUID/SGID/SBIT 牵涉到程序的概念,因此再次强调,这部份的数据在您读完第十六章

关于程序方面的知识后,要再次的回来瞧瞧喔! 目前,你先有个简单的基础概念就好了!文

末的参考数据也建议阅读一番喔!

SUID/SGID/SBIT 权限设置

前面介绍过 SUID 与 SGID 的功能,那么如何设置文件使成为具有 SUID 与 SGID 的权限呢?

这就需要第五章的数字更改权限的方法了! 现在你应该已经知道数字体态更改权限的方式

为“三个数字”的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字

就代表这几个权限了!

4 为 SUID

2 为 SGID

1 为 SBIT

假设要将一个文件权限改为“-rwsr-xr-x”时,由于 s 在使用者权限中,所以是 SUID ,因此,

在原先的 755 之前还要加上 4 ,也就是:“ chmod 4755 filename ”来设置!此外,还有大 S

与大 T 的产生喔!参考下面的范例啦!

注意:下面的范例只是练习而已,所以鸟哥使用同一个文件来设置,你必须了解 SUID

不是用在目录上,而 SBIT 不是用在文件上的喔!

[root@study ~]# cd /tmp [root@study tmp]# touch test <==创建一个测试用空档 [root@study tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的权限 -rwsr-xr-x 1 root root 0 Jun 16 02:53 test [root@study tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限 -rwsr-sr-x 1 root root 0 Jun 16 02:53 test [root@study tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能! -rwxr-xr-t 1 root root 0 Jun 16 02:53 test [root@study tmp]# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 权限 -rwSrwSrwT 1 root root 0 Jun 16 02:53 test 

最后一个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t

都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user,

group 以及 others 都没有 x 这个可执行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就

是“空的”啦!怎么说? SUID 是表示“该文件在执行的时候,具有文件拥有者的权限”,但是文

件 拥有者都无法执行了,哪里来的权限给其他人使用?当然就是空的啦! _

而除了数字法之外,你也可以通过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,

SBIT 则是 o+t 啰!来看看如下的范例:

\# 设置权限成为 -rws--x--x 的模样: 

[root@study tmp]# chmod u=rwxs,go=x test; ls -l test 

-rws--x--x 1 root root 0 Jun 16 02:53 test 

\# 承上,加上 SGID 与 SBIT 在上述的文件权限中! 

[root@study tmp]# chmod g+s,o+t test; ls -l test 

-rws--s--t 1 root root 0 Jun 16 02:53 test 

file

观察文件类型

如果你想要知道某个文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary

, 且其中有没有使用到动态函数库 (share library) 等等的信息,就可以利用 file 这个指令

来检阅喔!举例来说:

[root@study ~]# file ~/.bashrc 

/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文本文件啊! 

[root@study ~]# file /usr/bin/passwd 

/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically 

linked (uses shared libs), for GNU/Linux 2.6.32, 

BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped 

\# 可执行文件的数据可就多的不得了!包括这个文件的 suid 权限、相容于 Intel x86-64 等级的硬件平台 

\# 使用的是 Linux 核心 2.6.32 的动态函数库链接等等。 

[root@study ~]# file /var/lib/mlocate/mlocate.db 

/var/lib/mlocate/mlocate.db: data <== 这是 data 文件! 

指令与文件搜索

which

寻找“可执行文件”

[root@study ~]# which [-a] command 

选项或参数: 

-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称 

范例一:搜寻 ifconfig 这个指令的完整文件名 

[root@study ~]# which ifconfig 

/sbin/ifconfig 

范例二:用 which 去找出 which 的文件名为何? 

[root@study ~]# which which 

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' 

/bin/alias 

/usr/bin/which 

\# 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥? 

\# 那就是所谓的“命令别名”,意思是输入 which 会等于后面接的那串指令啦! 

\# 更多的数据我们会在 bash 章节中再来谈的! 

范例三:请找出 history 这个指令的完整文件名 

[root@study ~]# which history 

/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin: 

/usr/sbin:/usr/bin:/root/bin) 

[root@study ~]# history --help 

-bash: history: --: invalid option 

history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg 

\# 瞎密?怎么可能没有 history ,我明明就能够用 root 执行 history 的啊!

这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名~ 所以,

重点是找出“可执行文件”而已!且 which 后面接的是“完整文件名”喔!若加上 -a 选项,则可以

列出所有的可以找到的同名可执行文件,而非仅显示第一个而已!

最后一个范例最有趣,怎么 history 这个常用的指令竟然找不到啊!为什么呢?这是因为

history 是“bash 内置的指令”啦! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定

找不到的啊(有 bash 就有 history!)!那怎办?没关系!我们可以通过 type 这个指令喔!

关于 type 的用法我们将在 第十章的 bash 再来谈!

whereis

由一些特定的目录中寻找文件文件名

[root@study ~]# whereis [-bmsu] 文件或目录名 

选项与参数: 

-l :可以列出 whereis 会去查询的几个主要目录而已 

-b :只找 binary 格式的文件 

-m :只找在说明文档 manual 路径下的文件 

-s :只找 source 来源文件 

-u :搜寻不在上述三个项目当中的其他特殊文件 

范例一:请找出 ifconfig 这个文件名 

[root@study ~]# whereis ifconfig 

ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz 

范例二:只找出跟 passwd 有关的“说明文档”文件名(man page) 

[root@study ~]# whereis passwd # 全部的文件名通通列出来! 

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz 

[root@study ~]# whereis -m passwd # 只有在 man 里面的文件名才抓出来! 

passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz 

linux文件位置

各文件路径功能

**Filesystem Hierarchy Standard 😗*根据FHS[2]的标准文件指出,他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的使用者,都能够遵循FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。

image-20210805114309218

/bin: 存放用于系统管理维护的常用的实用命令文件。
/boot:存放用于系统启动的内核文件和引导装载程序文件。
/dev:存放设备文件。
/etc:存放系统配置文件,如网络配置、设备配置、X Window系统配置等。
/home:各个用户的主目录,其中子目录名称即为各用户名。
/lib:存放动态链接共享库。(类似于win的*.dll文件)
/media:为光盘、软盘等设备提供默认挂载点。
/mnt:为某些设备提供默认挂载点。
/root:root用户主目录。(不要与根目录混淆)
/proc:系统自动产生的映射。查看该目录的文件可以获得系统硬件运行的信息。
/sbin:存放系统管理员或者root用户使用的命令文件。
/usr:存放应用程序和文件。
/var:保存经常变化的内容,如系统日志、打印。

目录描述
/第一层次结构 的根、 整个文件系统层次结构的根目录
/bin/需要在单用户模式可用的必要命令(可执行文件);面向所有用户,例如catlscp
/boot/引导程序文件,例如: kernelinitrd;时常是一个单独的分区[8]
/dev/必要设备, 例如:/dev/null.
/etc/特定主机,系统范围内的配置文件。关于这个名称目前有争议。在贝尔实验室关于UNIX实现文档的早期版本中,/etc 被称为*etcetera*, [9] 这是由于过去此目录中存放所有不属于别处的所有东西(然而,FHS限制/etc只能存放静态配置文件,不能包含二进制文件)。 [10] 自从早期文档出版以来,目录名称已被以各种方式重新称呼。最近的解释包括反向缩略语如:“可编辑的文本配置”(英文 “Editable Text Configuration”)或"扩展工具箱"(英文 “Extended Tool Chest”)。 [11]
/etc/opt//opt/的配置文件
/etc/X11/X窗口系统(版本11)的配置文件
/etc/sgml/SGML的配置文件
/etc/xml/XML的配置文件
/home/用户的家目录,包含保存的文件、个人设置等,一般为单独的分区。
/lib//bin//sbin/中二进制文件必要的文件。
/media/可移除媒体(如CD-ROM)的挂载点 (在FHS-2.3中出现)。
/mnt/临时挂载的文件系统。
/opt/可选应用软件 。[12]
/proc/虚拟文件系统,将内核进程状态归档为文本文件。*例如:*uptime、 network。在Linux中,对应Procfs格式挂载。
/root/超级用户家目录
/sbin/必要的系统二进制文件,例如: init、 ip、 mount。
/srv/站点的具体数据,由系统提供。
/tmp/临时文件(参见 /var/tmp),在系统重启时目录中文件不会被保留。
/usr/用于存储只读用户数据的第二层次; 包含绝大多数的()用户工具和应用程序[13],注意不是user的缩写,而是"Unix Software Resource"的缩写。
/usr/bin/非必要可执行文件 (在单用户模式中不需要);面向所有用户。
/usr/include/标准包含文件
/usr/lib//usr/bin//usr/sbin/中二进制文件的
/usr/sbin/非必要的系统二进制文件,*例如:*大量网络服务守护进程
/usr/share/体系结构无关(共享)数据。
/usr/src/源代码,*例如:*内核源代码及其头文件。
/usr/X11R6/X窗口系统 版本 11, Release 6.
/usr/local/本地数据的第三层次, 具体到本台主机。通常而言有进一步的子目录, 例如:bin/lib/share/.[14]
/var/变量文件——在正常运行的系统中其内容不断变化的文件,如日志,脱机文件和临时电子邮件文件。有时是一个单独的分区。
/var/cache/应用程序缓存数据。这些数据是在本地生成的一个耗时的I/O或计算结果。应用程序必须能够再生或恢复数据。缓存的文件可以被删除而不导致数据丢失。
/var/lib/状态信息。 由程序在运行时维护的持久性数据。 *例如:*数据库、包装的系统元数据等。
/var/lock/锁文件,一类跟踪当前使用中资源的文件。
/var/log/日志文件,包含大量日志文件,为了防止日志占满根分区,生产环境中一般是单独分区。
/var/mail/用户的电子邮箱
/var/run/自最后一次启动以来运行中的系统的信息,*例如:*当前登录的用户和运行中的守护进程、一些守护进程的pid文件、socket文件。现已经被/run代替[15]
/var/spool/等待处理的任务的脱机文件,*例如:*打印队列和未读的邮件。
/var/spool/mail/用户的邮箱(不鼓励的存储位置)
/var/tmp/在系统重启过程中可以保留的临时文件。
/run/代替/var/run目录。
/bin:存放指令文件
/dev:存放设备与设备文件

账号、密码、群组

/etc/passwd:存放系统用户及普通用户信息的文件
/etc/shadow:存放个人密码的文件
/etc/group:存放群组信息的文件
账号、密码、群组信息的集中第

语言

/etc/locale.conf:系统默认的语系变成英文

扩展名

*.sh : 脚本或批处理文件 (scripts),因为批处理文件为使用shell写成的,所以扩展名

就编成 .sh 啰;

Z, .tar, .tar.gz, .zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar

等等的,由于不同的压缩软件,而取其相关的扩展名啰!

.html, .php:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件啰! .html 的

文件可使用网页浏览器来直接打开,至于 .php 的文件, 则可以通过 client 端的浏览器来

server 端浏览,以得到运算后的网页结果呢!

例如你在网络上下载一个可可执行文件,但 是偏偏在你的 Linux系统中就是无法执行!呵呵!那么就是可能文件的属性被改变了!不要怀 疑,从网络上传送到你的 Linux系统中,文件的属性与权限确实是会被改变的喔!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值