一、实验环境(rhel7.0版本)

主机环境:rhel7.0

各主机信息

主机名 IP
server 172.25.254.1

二、Linux的系统结构

1、Linux系统是一个根文件系统,是一个倒树型结构(即所有的文件都来自一个根目录),最大的目录名称叫“/”(根目录)

2、根目录(/)的意义与内容

Linux目录配置的依据——FHS(Filesystem  Hierarchy  Stabdard)建议:根目录(/)所在那分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较佳,根目录所在的文件系统也叫不容易出现问题。

鉴于上述的说明,因此,FHS定义出根目录(/)下面应该要有下面这些子目录的存在才好,即是没有物理目录,FHS也希望至少有链接(link)目录存在才好。

(1)第一部分:FHS要求必须要存在的目录

/bin

系统有很多存放执行文件的目录,但/bin比较特殊。因为/bin放置的是单人维护模式下还能被使用的命令。/bin下面的命令可以被root与一般帐号所使用,主要有:cat、chmod、chown、date、mv、mkdir、cp、bash等常用的命令。

/boot   这个目录主要放置启动会使用到的文件,包括Linux内核文件以及启动选项与启动所需配置文件等。Linux内常用的文件名为:vmlinuz,如果使用的是grub2这个启动引导程序,则还会存在/boot/grub2这个目录
/dev  在Linux系统上,任何设备与接口设备都是以文件的形式存在于这个目录当中。你只要通过读写这个目录下的某个文件,就等于读写某个设备,比较重要的文件有/dev/null,/dev/zero,/dev/tty、/dev/loop*、/dev/sd*等
/etc 

系统主要的配置文件几乎都放置在这个目录内,例如人员的帐号密码文件、各种服务的启动文件等。一般来说,这个目录下的各文件属性是可以让一般用户查看的,但是只有root有权力修改。FHS建议不要放置可以执行文件在该目录中。比较重要的文件有:/etc/modprobe.d/、/etc/passwd、/etc/fstab、/etc/issue等。另外FHS还规范几个重要的目录最好要放在/etc/目录下:

  • /etc/opt(必要):这个目录在放置第三方辅助软件/opt相关配置文件;
  • /etc/X11(建议):与X Window有关的各种配置文件都在这里,尤其是xorg.conf这个XServer的配置文件;
  • /etc/sgml(建议):与SGML格式有关的各项配置文件;
  • /etc/xml(建议):与XML格式有关的各项配置文件。
/lib 

系统的函数库非常多,而lib放置则是在启动时会用到的函数库,以及在/bin或/sbin下面的命令会调用的函数库而已。什么是函数库?你可以把它想成是外挂,某些命令必须要有这些外挂才能够顺利完成程序的执行之意,另外FSH还要求下面的目录必须存在:

  • /lib/modules:这个目录主要放置可抽换式的内核相关模块(驱动程序)
/media

media是媒体的英文,顾名思义,这个media下面放置的就是可删除的设备,包括软盘、光盘、DVD等设备都暂时挂载于此。

/mnt 如归你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。在早些时候,这个目录的用途与/media相同。只是有了/media之后,这个目录就暂时用来挂载
/opt 这个是给第三方辅助软件放置的目录。什么是第三方辅助软件?举例来说,KDE这个桌面管理系统是一个独立的软件,不过它可以安装到Linux系统中,因此KDE的软件就建议放置到此目录下。另外,如果你想要自行安装额外的软件(非原本的发行版提供),那么也能够将你的软件安装到这里来,不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下。
/run 早期的FHS规定系统启动后所产生的各项信息应该要放置在/var/run目录下,新版的FHS则规范到/run下面,由于/run可以使用内存来模拟,因此性能上要好很多
/sbin

Linux下非常多命令是用来设置系统环境的,这些命令只有root才能够用来设置系统,其他用户最多用来查询而已。放在/sbin下面为启动过程中所需要的,里面包括了启动、修复、还原系统所需要的命令。至于某些服务器软件程序,一般则放置到/usr/sbin当中。常见的命令包括:fdisk、fsck、ifconfig、mkfs等。至于本机自行安装的软件所产生的系统执行文件,则放置到/usr/local/sbin当中了。

/srv srv可以视为service的缩写,是一些网络服务启动之后,这些服务所需要使用的数据目录,常见的服务例如www、FTP等。举例来说,www服务器需要的网页数据就可以放置在/srv/www里面。不过,系统的服务数据如果尚未要提供给因特网任何人浏览的话,默认还是建议放置到/var/lib下面即可
/tmp 这是让一般用户或是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够存取的,所以你需要定期地清理一下。当然,重要数据不可放置在此目录。因为FHS甚至建议在启动时,应该要将/tmp下的数据都删除。
/usr 第二层FHS设置,后续介绍
/var 第二层FHS设置,主要为放置变动性的数据,后续介绍

(2)第二部分:FHS建议可以存在的目录

/home

这是系统默认的用户家目录(home  directory)。在你新增一个一般用户帐号时,默认的用户家目录都会规范到这里来,比较重要的是家目录有两种代号:

  • ~:当前这个用户的家目录
  • student:则代表student这个用户的家目录
/lib<qual> 用来存放与/lib不同格式的二进制函数库,例如支持64位的/lib64函数库等
/root 系统管理员(root)的家目录,之所以放在这里,是因为,如果进入单人维护模式而仅挂载根目录时,该目录就没能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中

(3)Linux中也非常重要的目录

/lost+found 这个目录是使用标准的ext2、ext3、ext4文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下,不过如果使用的是xfs文件系统的话,就不会存在这个目录
/proc

这个目录本身是一个虚拟文件系统,它放置的数据都是在内存当中,例如系统的内核、进程等信息、外饥饿设备的状态及网路状态等。因为这个目录下的数据都是在内存当中,所以本身不占硬盘空间。比较重要的文件例如:/proc/couinfo、/proc/dma、/proc/interruopts、/proc/ioports、/proc/net/*等

/sys 这个目录其实跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录内核与系统硬件信息相关的内容。包括目前已加载的内核模块与内核检测到的硬件设备信息等,这个目录同样不占硬盘空间

3、/usr的意义与内容

依据FHS的基本定义,/usr里面的数据属于可分享与不可变动,如果你知道如何通过网络进行分区的挂载,那么/usr确实是可以分享给局域网络内的其他主机来使用。

FHS建议所由软件开发者,应该将他们的数据合理地分别放置到这个目录下地子目录,而不要自形建立该软件自己独立地目录。

因为是所有系统默认地软件(发行版发布者所提供地软件)都会放置到/usr下面,因此系统刚安装完毕时,这个目录会占用最多地硬盘容量。

(1)第一部分:FHS要求必须要存在的目录

/usr/bin 所有一般用户能够使用地命令都放在这里。目前新地Centos7已经将全部地用户命令放置于此,而使用链接文件地方式将/bin链接至此。也就是说,/usr/bin与/bin是一模一样的。另外,FHS要求在此目录下不应该有子目录
/usr/lib 基本上,与lib功能相同,所以/lib就是就是链接到次目录中的
/usr/local 系统管理员在本机安装自己下载地软件(非发行版默认提供者),建议安装到此目录,这样会比较便于管理。举例来说,你地发行版提供地软件较旧,你想安装较新地润件但又不想删除旧版,此时你可以将新版软件安装于/usr/local目录下,可与原先地旧版软件有分别。你可以自行到/usr/local去看看,该目录下也有具有bin、etc、include、lib...的目录
/usr/sbin 非系统正常运行所需要地系统命令,最常见地就是某些网络服务器软件地服务命令(daemon)。不过功能与/sbin也差不多,因此/sbin就是链接到此目录中的
/usr/share

主要放置只读的数据文件,当然也包括共享文件,在这个目录下放置地数据几乎是不分硬件架构均可读取地数据,因为几乎都是文本文件。在此目录下常见地还有这些子目录:

  • /usr/share/man:在线帮助文件;
  • /usr/share/doc:软件地说明文档;
  • /usr/share/zoneinfo:与时区有关地时区文件

(2)第二部分:FHS建议可以存在的目录

/usr/games 与游戏比较相关地数据放置处
/usr/include c/c++等程序语言地头文件(header)与包含文件(include)放置处,当我们以Tarball方式(*.tar.gz地方式)安装某些程序时,会使用到里面地许多文件
/usr/libexec 某些不被一般用户常用地执行文件或脚本等,都会放置到此目录中。例如大部分地X窗口下面地操作命令,很多都是放在此目录下
/usr/lib<qual> 与/lib/<qual>功能相同,因此目前/lib<qual>就是链接到此目录中
/usr/src 一般源代码建议放置在这里,src有source的意思。至于内核源代码则建议放置到/usr/src/Linux目录下

4、/var的意义与内容

如果说/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录。因为/var目录主要针对经常性变动的文件,包括缓存(cache)、日志文件(log  file)以及某些软件运行所产生的文件,包括程序文件(lock  file、run  file),或例如MySQL数据库文件等

FHS要求必须要存在的目录

/var/cache 应用程序本身运行过程中会产生的一些缓存
/var/lib 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。举例来说,MySQL的数据库放置到/var/lib/mysql而rpm的数据库则放到/var/lib/rpm中
/var/lock 某些设备或是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时,就可能产生一些错误的状况,因此就得要将该设备上锁,以确保该设备只会给单一软件所使用。举例来说,刻录机正在刻录一张光盘,你想一下会不会有两个人同时在使用一个刻录机刻盘?如果两个人同时刻录,那光盘写入的是谁的数据?所以当第一个人在刻录时刻录机就会被上锁,第二个人就得要该设备被解除锁定(就是第一个人用完了)才能够继续使用,目前此目录也已经挪到/run/lock中
/var/log 重要到不行。这是日志文件放置的目录,里面比较重要的文件有/var/log/messages、/var/lof/wtmp(记录登录信息)等
/var/mail 放置个人电子邮箱的目录,不过这个目录也被放置到/var/spool/mail目录中,通常这两个目录是互为链接文件
/var/run 某些程序或是服务启动后,会将它么的PID放置到这个目录下。与run相同,这个目录链接到run目录
/var/spool 这个目录通常放置一些队列数据,所谓的队列数据就是等待其他程序使用的数据,这些数据被使用后通常都会被删除。举例来说,系统收到新邮件会放置到/var/spool/mail中,但用户收下该邮件后原则上就会被删除。如果是计划任务数据(crontab),就会被放置到/var/spool/cron目录中。

5、总结系统中存在的链接文件

  1. /bin -----> /usr/bin
  2. /sbin -----> /usr/sbin

  3. /lib -----> /usr/lib

  4. /lib64 -----> /usr/lib64

  5. /var/lock -----> /run/lock

  6. /var/run -----> /run

三、目录与路径

1、绝对路径与相对路径

文件的地址分为两种:绝对路径和相对路径

1、相对路径:相对于当前系统所在的目录的一个文件名称的简写,此名称忽略了系统当前所在目录的名称,此名称不能以“/”开头,在操作时会在操作对象前加入“pwd”所显示的值;
2、绝对路径:绝对路径显示的是文件在系统中的真实位置,此命令以“/”开头,在命令执行时,系统不会考虑现在所在位置信息。

2、目录的相关操作

.           代表此层目录
..          代表上层目录
-           代表前一个工作目录
~           代表目前使用者身份所在的加目录
~student    代表student这个使用者的家目录(student是个帐号名称)

(1)cd:切换路径

【1】、cd   目录名称          进入到指定的目录中

【2】、cd                           进入当前用户家目录

【3】、cd  ~                       进入当前用户家目录(同cd命令)

【4】、cd  -                         当前目录和当前目录之前所在的目录之间的切换

【5】、cd  ..                        进入当前目录的上级目录

【6】、cd  ~student              进入student用户的家目录

(2)pwd :显示当前工作目录

pwd [-P]选项与参数:
-P:显示出真正的路径,而非使用链接(link)路径
1、单纯显示处目前的工作目录
[root@server mail]# pwd
/var/mail2、显示出实际的工作目录,而非链接文件本身的目录名而已
[root@server mail]# pwd -P
/var/spool/mail从下面我们可以/var/mail文件是/var/spool/mail文件的链接文件
[root@server mail]# ll -d /var/mail
lrwxrwxrwx. 1 root root 10 May 12 15:26 /var/mail -> spool/mail

(3)mkdir命令:建立目录

mkdir [-mp] 目录名称选项与参数:
-m:设置文件的权限。直接设置,不使用默认权限(umask)
-p:帮助你直接将所需要的目录(包含上层目录)递归创建

【1】、可以创建一个目录:mkdir    directory

【2】、同时创建多个目录:mkdir    directory1  directory2  directory3...

【3】、在一个目录下再建目录,即建立递归目录:mkdir  -p  dir1/dir2/dir3...

【4】、在目录创建时,指定目录的权限,而不使用默认权限:mkdir  -m  权限  directory

(4)rmdir命令:删除“空”的目录

rmdir [-p] 目录名称选项与参数:
-p:连同上层"空的"目录也一起删除

【1】、删除空目录:rmdir  directory

【2】、递归删除空目录:rmdir  -p  dir1/dir2/dir3

3、关于执行文件路径的变量:$PATH

我们知道查看文件属性的命令ls完整文件名为:/bin/ls(这是绝对路径),那你会不会觉得很奇怪:“为什么我可以在任何地方执行/bin/ls这个命令?”为什么我在任何目录下输入ls就一定可以显示出一些信息而不会说找不到该/bin/ls命令?这是因为环境变量PATH的帮助所致。

        当我们执行一个命令的时候,举例来说ls好了,系统会依照PATH的设置去i每个PATH定义的目录下查找文件名为ls的可执行文件,如果在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先查找到的同名命令先被执行。

1、使用root的身份列出查找的路径是什么?
[root@server opt]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin2、使用stuednt的身份列出查找的路径是什么?
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/student/.local/bin:/home/student/bin

四、文件与目录管理

1、文件与目录的查看:ls

ls [-aAdfFhilnrRSt] 文件名或目录名称
ls [--color={nerver,auto,always}] 文件名或目录名称
ls [--full-time] 文件名或目录名称选项与参数:
-a:全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
-A:全部的文件,连同隐藏文件,但不包括.和..这两个目录
-d:仅列出目录本身,而不是列出目录内的文件数据(常用)
-f:直接列出结果(包括隐藏文件),而不进行排序(ls默认会以文件名排序)
-F:列出结果(不包括隐藏文件)根据文件、目录等信息,給予附加数据结构,例如:*:代表可执行文件;/:代表目录;=:代表socket文件;|:表示FIFO文件
-h:与-l一起连用,将文件容量以人类易读的方式(例如GB、KB等)列出来
-i:列出innode号码
-l:详细信息显示,包括文件的属性和权限等数据(常用)
-n:列出UID和GID而非使用者与用户组的名称
-r:把排序结果反向输出,例如,原本文件名由小到大,反向则为由大到小
-R:连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来
-s:显示文件或目录的大小
-S:以文件容量大小排序,而不是文件名排序
-t:依时间进行倒序排序,而不是文件名
-Z:显示文件或目录的SElinux安全上下文
--color=nerver:不要依据文件特性给予颜色显示
--color=always:显示颜色
--color=auto:让系统自行根据设置来判断是否给予颜色
--full-time:以完整时间模式(包括年、月、日、时、分)输出
--time={atime,ctime}:输出access时间或改变权限属性时间(ctime),而非内容修改时间

(1)ls 

(2)ls   dir/file                      查看目录或文件中所包含的内容

(3)ls   -a    dir/file               查看目录或文件中所包含的所有文件包括隐藏文件

(4)ls   -A    dir/file               查看目录或文件中所包含的所有文件包括隐藏文件,但不显示.和..这两个目录

(5)ls  -d   dir/file               查看当前文件或目录本身

(6)ls  -f  dir/file                    直接列出结果,而不进行排序

(7)ls  -F  dir/file            查看目录下的内容,并显示数据结构

(8)ll  -h  dir/file             以易读的方式显示文件与目录的大小

(9)ls   -i  dir/file                  显示目录或文件索引节点号(inode)。一个索引节点代表一个文件

(10)ls  -l   dir/file                查看目录或文件的属性(即列出文件的详细信息)

(11)ls  -n  dir/file                   列出文件或目录中内容的详细信息,并且以UID和GID的方式进行显示,而非用户名和组名的方式进行显示

(12)ls  -r  dir/file                倒序的方式显示结果

(13)ls  -R  dir/file              连同子目录的内容一起显示,即递归显示

(14)ll   -S    dir/file               将目录中的内容或文件按照文件的大小倒序排列

(15)ll  -t  dir/file                   按照时间进行倒序排序

(16)ls  --color=never  dir/file            显示文件或目录中的内容,但是不要根据文件特性给予颜色显示

(17)ls  --color=always  dir/file            显示文件或目录中的内容,显示颜色

(18)ls  --color=auto  dir/file            显示文件或目录中的内容,让系统自行依据设置来判断是否给予颜色

(19)ls  --full-time  file/dir                     显示文件或目录中内容的详细时间


注意:ll相当于ls  -l


2、复制、删除与移动:cp、rm、mv

(1)cp命令:复制文件或目录

cp [-adfilprsu] 源文件(source) 目标文件(destination)
cp [options] source1 source2 source3... directory选项与参数:
-a:相当于-dr/-dR --preserve=all的意思,至于dr请参考下列说明(常用)
-d:若源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身
-f:为强制(force)的意思,若目标文件已经存在且无法开启,则删除后再尝试一次
-i:若目标文件(destination)已经存在时,在覆盖时会先询问操作的进行(常用)
-l:进行硬链接(hard link)的链接文件建立,而非复制文件本身
-p:连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用)
-r/-R:递归复制,用于目录的复制操作(常用)
-s:复制成为符号链接文件(symbolic link),亦即"快捷方式"文件
-u:destination比source旧才更新destination,或destination不存在的情况下才复制
--preserve=all:除了-p的权限相关参数外,还加入SELinux的属性,links、xattr等也复制
最后需要注意的是,如果源文件两个以上,则最后一个目标文件一定要是"目录"才行

实验环境准备:

【1】、文件的复制

(1)cp   源文件    目标地文件

注意:如果目的地文件不存在,会新建相应的文件;如果目的地文件存在,则会覆盖源文件

(2)cp   源文件   目的地目录(目的地目录必须存在)

(3)cp   源文件1   源文件2   目的地目录(目的地目录必须存在)

【2】、目录的复制(必须加-r参数)

(1)cp   -r    源目录    目的地目录 

注意:如果目的地目录不存在,会默认新建相应的目录;如果目的地目录存在,相当于把源目录放到目的地目录中去

(2)cp   -r    源目录1   源目录2   目的地目录(目的地目录必须存在)

【3】、cp命令的其他参数示例

1、范例一:用root身份,将家目录下的.bashrc复制到/tmp下,并更名为bashrc
[root@server opt]# cp ~/.bashrc /tmp/bashrc
[root@server opt]# cp ~/.bashrc /tmp/bashrc
cp: overwrite ‘/tmp/bashrc’? y   <==n不覆盖,y为覆盖
[root@server opt]# alias | grep cp    #上面没有加-i参数,为什么会出现提示信息呢?这是因为在别名的设置中cp=cp -i。所以这里即使不加-i参数,也会出现提示信息
alias cp='cp -i'
#重复做两次操作,由于/tmp下面已经存在bashrc了,加上-i选项后,
#则在覆盖前会询问使用者是否确定,可以按下n或y来二次确认
2、范例二:切换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性
[root@server opt]# cd /tmp
[root@server tmp]# cp /var/log/wtmp .   <==想要复制到目前的目录,最后的.不要忘
[root@server tmp]# ll /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 178560 May 31 12:04 /var/log/wtmp
-rw-r--r--. 1 root root 178560 May 31 15:06 wtmp
#注意上面这两个文件的属性权限信息,在不加任何选项的情况下,文件的某些属性/权限会改变。
#这个是很重要的特性,要注意,还有,连文件建立的时间也不一样了。
#那如果你想要将文件的所有同诶嗯都一起复制过来该怎么办?可以加上-a,如下所示:
[root@server tmp]# cp -a /var/log/wtmp wtmp_2
[root@server tmp]# ll /var/log/wtmp wtmp_2
-rw-rw-r--. 1 root utmp 178560 May 31 12:04 /var/log/wtmp
-rw-rw-r--. 1 root utmp 178560 May 31 12:04 wtmp_2

一般来说,如果我们去复制别人的数据(当然,该文件你必须要有read的权限才行)时,总是希望复制到的数据最后是我们自己的,所以,在默认的条件中,xp的源文件与目标文件的权限是不同的,目标文件的拥有者通畅=常会时命令操作者本身。

3、范例三:复制/etc这个目录下的所有内容到/tmp下面
[root@server tmp]# cp /etc/ /tmp/
cp: omitting directory ‘/etc/’   <==如果是目录则不能直接复制,要加上-r的选项
[root@server tmp]# cp -r /etc/ /tmp/
#还是再次的强调,-r是可以复制目录,但是,文件与目录的权限可能会被改变。
#所以,也可以利用【cp -a /etc /tmp】来执行命令,尤其是在备份的情况下
4、范例四:将范例一复制的bashrc建立一个符号链接文件(symbolic link)
[root@server tmp]# ll bashrc
-rw-r--r--. 1 root root 176 May 31 15:01 bashrc   <==先观察与ixia文件情况
[root@server tmp]# cp -s bashrc bashrc_slink
[root@server tmp]# cp -l bashrc bashrc_hlink
[root@server tmp]# ll  bashrc*
-rw-r--r--. 2 root root 176 May 31 15:01 bashrc   <==与原始文件不太一样了
-rw-r--r--. 2 root root 176 May 31 15:01 bashrc_hlink
lrwxrwxrwx. 1 root root   6 May 31 16:01 bashrc_slink -> bashrc

使用-l及-s都会建立所谓的链接文件(link  file),但是这两种链接文件却有不一样的情况。这是怎么回事?那个-l就是所谓的硬链接(hard link),至于-s则是符号链接(symbolic link),简单来说,bash_slink是一个快捷方式,这个快捷方式会链接到bashrc。所以你会看到文件名右侧有个指向(->)的符号。

至于bsdh_hlink文件与bashrc的属性与权限一模一样,与尚未进行链接前的差异则是第二栏的link数由1变成了2。

5、范例五:若~/.bashrc比/tmp/bashrc新,才复制过来
[root@server tmp]# cp -u ~/.bashrc /tmp/bashrc
#这个-u的特性,是在目标文件与源文件有差异时,才会复制过来。所以,常用于备份的工作当中
6、范例六:将范例造成的bshrc_slink复制成为bashrc_slink_1与bashrc_slink_2
[root@server tmp]# cp bashrc_slink bashrc_slink_1
[root@server tmp]# cp -d bashrc_slink bashrc_slink_2
[root@server tmp]# ll bashrc bashrc_slink*
-rw-r--r--. 2 root root 176 May 31 16:16 bashrc
lrwxrwxrwx. 1 root root   6 May 31 16:18 bashrc_slink -> bashrc
-rw-r--r--. 1 root root 176 May 31 16:21 bashrc_slink_1   <==与原始文件相同
lrwxrwxrwx. 1 root root   6 May 31 16:21 bashrc_slink_2 -> bashrc   <==是链接文件
#这个例子也是很有趣。原本复制的是链接文件,但是却将链接文件的实际文件复制过来了。
#也就是说,如果没有加上任何选项,cp复制的是原始文件,而非链接文件的属性
#若是复制链接文件的属性,就得要使用-d的选项了,如bash_slink_2所示
7、范例七:将家目录的.bsdhrc及.bashrc_history复制到/tmp下面
[root@server tmp]# cp ~/.bashrc ~/.bash_history /tmp/
#可以将多个文件一次复制到同一个目录,最后面一定是目录
8、使用student的身份,完整地复制/var/log/wtmp文件到/tmp下面,并更名为student_wtmp
[student@server ~]$ cp -a /var/log/wtmp /tmp/student_wtmp
[student@server ~]$ ll /var/log/wtmp /tmp/student_wtmp
-rw-rw-r--. 1 student student 178560 May 31 12:04 /tmp/student_wtmp
-rw-rw-r--. 1 root    utmp    178560 May 31 12:04 /var/log/wtmp

由于student地身份并不能随意修改文件地拥有者与用户组,因此虽然能够复制wtmp地相关权限与时间等属性但是与拥有者、用户组相关,原本student身份无法进行地操作,即使加上-a选项,也是无法完成完整权限地复制。

(2)rm命令:删除文件或目录(永久删除)

rm [-fir] 文件或目录选项与参数:
-f:就是force的意思,忽略不存在的文件,不会出现警告信息
-i:交互模式,在删除前会询问使用者是否操作
-r:递归删除,最常用于目录的删除,这是非常危险的选项
-d:删除空目录。同rmdir 

【1】、文件的删除

(1)可以删除一个文件

rm  filename        删除时会有提示(注意:当是root用户时,会有提示;当时普通用户时,不会有提示,这是因为普通用户并没有设置别名)

rm  -f  filename       强制删除,没有提示

(2)也可以同时删除多个文件

rm  filename1  filename2     (注意:删除文件也可以加“-r”参数)

rm -f filename1 filename2

【2】、目录的删除(必须加参数r)

(1)可以删除一个目录

rm  -r   directory         删除时会有提示(注意:当是root用户时,会有提示;当时普通用户时,不会有提示,这是因为普通用户没有设置别名)

rm  -rf  directory          删除时不会有提示

  1. rm  -r  -f   directory               递归删除目录,并且删除时没有提示
  2. rm   -f  -r  directory               递归删除目录,并且删除时没有提示
  3. rm   -rf   directory                  递归删除目录,并且删除时没有提示
  4. rm   -fr   directory                  递归删除目录,并且删除时没有提示

即:多个短参数(以-开头)可以分开写,也可以连在一起写,并且没有顺序要求

(2)也可以同时删除多个目录

rm  -r    directory1  directory2

rm  -rf    directory1  directory2

【3】、rm命令地其他示例

1、范例一:将cp范例中所建立地/tmp/etc这个目录删除掉
[root@server 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   <==按下[ctrl]+c中断
...(中间省略)...
#因为身份是root,默认已经加入了-i地选项,所以你要一直按y才会删除。
#如果不相继续按y,可以按下[ctrl]+c来终止rm的工作
#这是一种保护地操作,如果确定要删除掉此目录而不要询问,可以这样操作
[root@server tmp]# \rm -r /tmp/etc/
#在命令前加上反斜线,可以忽略掉alias指定地选项
#拜托,这个范例很可怕,你不要删错了,删除/etc系统会挂掉
2、范例二:删除一个带有-开头地文件
[root@server tmp]# touch /tmp/-aaa-
[root@server tmp]# rm -aaa-
rm: invalid option -- 'a'        <==因为"-"是选项嘛,所以系统误判了。
Try 'rm ./-aaa-' to remove the file ‘-aaa-’.   <==新的bash有给建议地
Try 'rm --help' for more information.[root@server tmp]# rm /tmp/-aaa-    #或者使用命令"rm -- -aaa-"
rm: remove regular empty file ‘/tmp/-aaa-’? y

(3)mv命令:移动文件与目录,或重命名

mv:文件的移动或者目录的移动(与cp不同的是,移动之后,原文件就会消失;目录的移动不需要加-r参数)

mv [-fiu] source destination
mv [optinons] source1 source2 source3... directory选项与参数:
-f:force强制的意思,如果目标文件已经存在,不会询问而值接覆盖
-i:若目标文件(destination)已经存在时,就会询问是否覆盖
-u:若目标文件已经存在,且source比较新,才会更新(update)

实验环境准备:

【1】、文件的移动

(1)mv   源文件    目的地文件

注意:如果目的地文件不存在,会新建相应的文件,相当于改名字;如果目的地文件存在,则会覆盖源文件

(2)mv   源文件   目的地目录(目的地目录必须存在)

(3)mv   源文件1   源文件2   目的地目录(目的地目录必须存在)

【2】、目录的移动

(1)mv   源目录    目的地目录
注意:不同目录下:相当于剪切(复制并删除);相同目录下:相当于重命名
如果目的地目录不存在,会默认新建相应的目录;如果目的地目录存在,相当于把源目录放到目的地目录中去,源目录消失

(2)mv   源目录1   源目录2   目的地目录(目的地目录必须存在)

3、获取路径的文件名与目录名称

每个文件的完整文件名包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达255个字符。那么你怎么知道哪个是文件名?哪个是目录名?嘿嘿,就是利用反斜线(/)来辨别。其实,获取文件名或是目录名层,一般的用途应该是在写程序的时候用来判断之用。下面我们以几个范例来谈一谈basename与idirname的用途

[root@server ~]# basename /etc/sysconfig/network
network      <==很简单,就取得最后的文件名
[root@server ~]# dirname /etc/sysconfig/network
/etc/sysconfig    <==取得的变成了目录名

五、文件内容查看

  • cat由第一行显示文件内容
  • tac从最后一行开始显示,可以看出tac是cat的倒着写
  • nl显示的时候,同时输出行号
  • more一页一页地显示文件内容
  • less与more类似,但是比more更好地是,它可以往前翻页
  • head只看前面几行
  • tail只看后面几行
  • od以二进制地方式读取文件内容

1、直接查看文件内容

(1)cat命令

cat [-AbEnTv]选项与参数:
-A:相当于-vET的整合选项,可列出一些特殊字符而不是空白而已
-b:列出行号,仅针对非空白行做行号显示,空白行不标行号
-E:将结尾的换行符$显示出来
-n:打印出行号,连同空白行也会有行号,与-b的选项不同
-T:将[tab]按键以^I显示出来
-v:列出一些看不出来的特殊字符
范例一:查看/etc/issue这个文件的内容
[root@server ~]# cat /etc/issue
\S
Kernel \r on an \m
范例二:承上题,如果还要打印行号?
[root@server ~]# cat -n /etc/issue1    \S2 Kernel \r on an \m3
#所以这个文件有三行,看到了吧!可以列出行号。这对于大文件要找出特定的行时,有点用处。
#如果不想显示空白行的行号,可以使用【cat -b /etc/issue】
[root@server ~]# cat -b /etc/issue1    \S2 Kernel \r on an \m
范例三:将/etcman_db.conf的内容完整的显示出来(包含特殊字符)
[root@server ~]# cat -A /etc/man_db.conf
# $
...(中间省略)...
# MANDATORY_MANPATH^I^I^Imanpath_element$
# MANPATH_MAP^I^Ipath_element^Imanpath_element$
# MANDB_MAP^I^Iglobal_manpath^I[relative_catpath]$
...(下面省略)...
#使用[tab]与空格键的效果差不多,都是一堆空白。我们无法知道两者的差别。
#此时使用cat -A就能够发现那些空白的地方是什么东西了,[tab]会以^I表示,换行符则是以$表示
#所以你可以发现每一行后面都是$。不过换行符在Windows/Linux则不太相同,Windows的换行符时^M$

(2)tac命令(反向列示)

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

(3)nl命令

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

2、可翻页查看

前面提到的nl与cat、tac等,都是一次性地将数据一口气显示到屏幕上面,那有没有可以进行一页一页翻动的命令?让我们可以一页一页的观察,才不会前面的数据看不到。有,那就是more与less。

(1)more(一页一页翻动)

[root@server ~]# more /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
...(中间省略)...
--More--(18%)   <==重点在这一行,你的光标也会在这里等待你的命令

在more这个程序的运行过程中,你有几个按键可以使用:

1、翻屏:

  1. 向下翻一屏: b
  2. 向上翻一屏:b/Ctrl+b
  3. 向下翻一行:enter

2、查找:

  1. /Keyword:向下查找字符串的功能
  2. n:向下匹配(与/有关)

3、显示出文件名以及目前显示的行数:

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

4、退出:

  • q:退出

(2)less(一页一页翻动):less里面的操作同man里面的操作,没错man这个命令就是调用less来显示说明文件的内容

在less这个程序的运行过程中,你有几个按键可以使用:

1、翻屏:

  1. 向下翻一屏:space/PgUp
  2. 向上翻一屏:b/PgDn
  3. 向下翻一行:enter/j/下
  4. 向上翻一行:k/上

2、查找:

  1. /Keyword:向下查找字符串的功能
  2. ?字符串:向上查找字符串的功能
  3. n:向下匹配(与/或?有关)
  4. N:向上匹配(与/或?有关)

4、回到数据的第一行和最后一行

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

5、退出:
        q:退出

3、数据截取

(1)head(取出前面几行)

head [-n number] 文件选项与参数:
-n:后面接数字,代表显示几行的意思
[root@server ~]# head /etc/man_db.conf
#默认的情况中,显示前面十行,若要显示前3行,就得要这样
[root@server ~]# head -n 3 /etc/man_db.conf    #或head -3 /etc/man_db.conf 范例:如果后面的100行数据都不打印,只打印/etc/man_db.conf的前面几行,该如何是好?
[root@server ~]# head -n -100 /etc/man_db.conf   #列出1~31行的内容(/etc/man_db.conf共有131行)

(2)tail(取出后面几行)

tail [-n number] 文件选项与参数:
-n:后面接数字,代表显示几行的意思
-f:表示持续刷新显示后面所接文件中的内容,要等到按下ctrl+c才会结束
[root@server ~]# tail /etc/man_db.conf
#默认的情况下,显示最后的十行。若要显示最后的3行,就得要这样:
[root@server ~]# tail -n 3 /etc/man_db.conf    #或tail -3 /etc/man_db.conf 范例一:如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据呢?
[root@server ~]# tail -n +100 /etc/man_db.conf   #列出100~131行的内容(/etc/man_db.conf共有131行)范例二:持续检测/var/log/messages的内容
[root@server ~]# tail -f /var/log/messages
<==要等到输入Ctrl+c之后才会结束执行tail这个命令

4、非纯文本文件(二进制文件/可执行文件):od

od [-t TYPE] 文件选项与参数:
-t:后面可以接各种【类型(TYPE)】的输出,例如:a        :利用默认的字符来输出c        :利用ASCII字符来输出d[size]  :利用十进制(decimal)来输出数据,每个整数占用size Bytesf[size]  :利用浮点数值(floating)来输出数据,每个整数占用size Byteso[size]  :利用八进制(octal)来输出数据,每个整数占用size Bytesx[size]  :利用十六进制(hexadecimal)来输出数据,每个整数占用size Bytes
范例一:请将/usr/bin/passwd的内容使用ASCII方式来显示
[root@server ~]# 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
...(后面省略)...
#最左边第一列是以八进制来表示Bytes数
#以上面的范例来说,第二栏0000020代表开头是16个byte(2*8)的内容之意
范例二:请将/etc/issue这个文件的内容以把金只列出存储值与ASCII的对照表
[root@server ~]# 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 012a   n       \   m  \n  \n
#如上所示,可以发现每个字符可以对应到的数值是什么。要注意的是,该书之是八进制。
#例如S对应的记录数之为123,转成是禁止:1x8^2+2x8+3=83
范例三:若不想查Google,想要立刻找到passwd这几个字的ASCII对照,该如何通过od来判断
[root@server ~]# echo passwd | od -t oCc
0000000 160 141 163 163 167 144 012p   a   s   s   w   d  \n
0000007

5、修改文件时间或创建新文件:touch命令

有三个主要的变动时间:

  1. 修改时间(mtime):当文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限。
  2. 状态时间(ctime):单的文件的【状态(status)】改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,就会更新这个时间。
  3. 读取时间(atime):当【文件的内容被读取】时,就会更新这个读取时间(access),举例来说,我们使用cat去读取/etc/man_db.conf,就会更新文件的atime。

即一个文件有三种时间:最后一次访问时间——atime;最后一次修改时间(内容的改动)——mtime;最后一次改变时间(元数据/内容数据其中之一发生改变)——ctime
 一个文件有两种数据:内容数据(文件内容本身);元数据(除了内容数据之外的数据,eg:文件名,属性等)

[root@server ~]# date; ll /etc/man_db.conf; ll --time=atime /etc/man_db.conf; ll --time=ctime /etc/man_db.conf
Fri May 31 21:48:53 CST 2019     <==目前的时间
-rw-r--r--. 1 root root 5171 May 21 16:37 /etc/man_db.conf   <==在5/21建立的内容(mtime)
-rw-r--r--. 1 root root 5171 May 31 12:11 /etc/man_db.conf   <==在5/31读取过的内容atime)
-rw-r--r--. 1 root root 5171 May 21 16:37 /etc/man_db.conf   <==在5/21更新过状态(ctime)

看到了吗?在默认的情况下,ls显示出来的是该文件的mtime,也就是这个文件的内容上次被修改过的时间。

touch [-acdmt] 文件选项与参数:
-a:仅自定义atime
-c:仅修改文件的时间,若该文件不存在则不建立新文件
-d:后面接欲自定义的日期而不用目前的日期,也可以使用--date="日期或时间"
-m:仅修改mtime
-t:后面接欲自定义的时间而不用目前的时间,格式为[YYYYMMDDhhmm]
范例一:新建一个空文件并观察时间
[root@server ~]# touch /tmp/testtouch
[root@server ~]# ll /tmp/testtouch
-rw-r--r--. 1 root root 0 May 31 22:08 /tmp/testtouch
#注意到,这个文件的大小是0。在默认的状态下,如果touch后面有接文件,
#则该文件的三个时间(atime/ctime/mtime)都会更新为目前的时间。若该文件不存在,
#则会主动建立一个新的空文件,例如上面的例子
范例二:将~/.bashrc复制成为bashrc,假设复制完全的属性,检查其日期
[root@server ~]# date; ll /tmp/bashrc; ll --time=atime /tmp/bashrc; ll --time=ctime /tmp/bashrc
Fri May 31 22:14:30 CST 2019      <==这是目前的时间
-rw-r--r--. 1 root root 176 May 30 15:57 /tmp/bashrc   <==这是mtime
-rw-r--r--. 1 root root 176 May 31 09:58 /tmp/bashrc   <==这是atime
-rw-r--r--. 1 root root 176 May 31 22:13 /tmp/bashrc   <==这是ctime
范例三:修改案例三的bashrc文件,将日期调整为两天前
[root@server ~]# touch -d "2 days ago" /tmp/bashrc
[root@server ~]# date; ll /tmp/bashrc; ll --time=atime /tmp/bashrc; ll --time=ctime /tmp/bashrc
Fri May 31 22:17:03 CST 2019
-rw-r--r--. 1 root root 176 May 29 22:16 /tmp/bashrc
-rw-r--r--. 1 root root 176 May 29 22:16 /tmp/bashrc
-rw-r--r--. 1 root root 176 May 31 22:16 /tmp/bashrc
#我们发现由mtime和atime由5/31变为了5/29,而ctime并没有跟着改变
范例四:将上个范例的bashrc日期改为2014/06/15 2:02
[root@server ~]# touch -t 201406150202 /tmp/bashrc
[root@server ~]# date; ll /tmp/bashrc; ll --time=atime /tmp/bashrc; ll --time=ctime /tmp/bashrc
Fri May 31 22:19:19 CST 2019
-rw-r--r--. 1 root root 176 Jun 15  2014 /tmp/bashrc
-rw-r--r--. 1 root root 176 Jun 15  2014 /tmp/bashrc
-rw-r--r--. 1 root root 176 May 31 22:19 /tmp/bashrc
#注意看看,日期在atime与mtime都改变了,但是ctime则是记录目前的时间

六、文件与目录的默认权限与隐藏权限

1、系统默认权限umask的设定

(1)文件默认权限umask的查看

[root@server1 tmp]# umask
0022           <==与一般权限有关的是后面三个数字,其中第一个数字是特殊权限用的
[root@server1 tmp]# umask -S   加入-S(Symbolic)表示以符号类型的方式来显示出权限
u=rwx,g=rx,o=rx

umask          查看系统的默认保留权限(对于root用户是022;对于普通用户是002),该默认值022与002可通过查看/etc

/bashrc文件来获取。


(2)文件与目录的满权限

在默认的权限的属性上,目录与文件是不一样的,我们知道x权限对于目录是非常重要的。但是一般文件的建立则不应该有执行的权限,因为一般文件通常是用于数据的记录,当然不需要执行的权限了。因此默认情况如下:

  • 若用户建立为文件则默认没有可执行(x)权限,即只有rw这两个项目,也就是最大为666,默认权限如下:
-rw-rw-rw-
  • 若用户建立为目录,则由于x与是否可以进入此目录有关,因此默认为所有权限均开放,即777,默认权限如下:
drwxrwxrwx

要注意的是,umask的数字指的是该默认值需要减到的权限。

那么,当用户:

  • 建立文件时:(-rw-rw-rw-)- (-----w--w-) ==>  -rw-r--r--
  • 建立目录时:(drwxrwxrwx)- (d----w--w-) ==>  drwxr-xr-x

下面,我们来测试看看吧!

(3)系统默认权限umask的设定方法

【1】、临时设定方式

umask 要设定的数字        修改系统的默认保留权限示例:umask 055          将系统的默认保留的权限设为055,这个设定为临时设定,只在当前的shell中生效,并且重启系统之后,就会失效

【2】、永久设定方式

修改/etc/bashrc文件(在第70行)及/etc/profile文件(在第59行)

第一步:vim  /etc/bashrc

70     if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ];  then
71        umask 022    普通用户的默认保留权限
72     else
73        umask 033    超级管理用户root的默认保留权限
74     fi

第二步:vim /etc/profile

59 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
60     umask 022    普通用户的默认保留权限
61 else
62     umask 033    超级管理用户root的默认保留权限
63 fi

注意:/etc/bashrc和/etc/profile这两个文件必须都进行修改,并且修改必须一致。

第三步:修改之后

source /etc/bashrc
source /etc/profile

(4)需要注意的点:

注意:

  1. 在777-umask值的时候是先写成rwx的形式,然后在一位一位的相减,如果是负数代表没有权限。示例:666-055即为rw-|rw-|rw-  -  ---|r-x|r-x =  rw-|-w-|-w-   换算为二进制为622而并非611。因此要特别注意,是换算为rwx再进行相减的操作。
  2. 在默认的情况下,root的umask会拿掉比较多的属性,root的umask默认是022,这是基于安全的考虑,至于一般身份用户,通常它们的umask为002,即保留同用户组的写入权力。

2、文件隐藏属性

隐藏属性确实对于系统有很大的帮助,尤其是在系统安全(Security)上面,非常重要。不过要先强调的是,下面的chattr命令只能在ext2、ext3、ext4的Linux创痛文件上面完整生效,其他的文件系统可能就无法完整的支持这个命令了。例如xfs仅支持部分参数而已。

(1)chattr(配置文件隐藏属性)

chattr [+-=] [ASacdistu] 文件或目录名称选项与参数:
+:增加一个特殊参数,其他原本存在参数不动
-:删除某一个特殊参时,其他原本存在参数不动
=:直接设置参数,且仅有后面接的参数
A:当设置了A这个属性时,若你在存取文件(或目录)时,它的存取时间atime将不会被修改
S:一般文件是非同步写入磁盘的,如果加上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@server ~]# touch /tmp/attrtest      <==建立一个空文件
[root@server ~]# chattr +i /tmp/attrtest    <==给予i的属性
[root@server ~]# rm /tmp/attrtest     <==尝试删除看看
rm: remove regular empty file ‘/tmp/attrtest’? y
rm: cannot remove ‘/tmp/attrtest’: Operation not permitted
#看到了吗?连root也没有办法将这个文件删除,赶紧取消参数设置
[root@server ~]# chattr -i /tmp/attrtest 

(2)lsattr(显示文件隐藏属性)

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

3、文件特殊权限位

(1)SUID冒险位(Set  UID)

当s这个标志出现在文件拥有者的x权限上时,此时就被称为Set  UID,简称为SUID的特殊权限。基本上SUID有这样的限制与功能:

  1. SUID权限仅对二进制可执行有效,可执行文件的查看使用which 命令。示例:which touch;
  2. 执行者对该程序具有x的可执行权限;
  3. 本权限仅在执行的过程中有效;
  4. 执行者将具有该程序拥有者(owner)的权限。

例子:

[root@server1 ~]# which touch
/usr/bin/touch
[root@server1 ~]# ll -d /usr/bin/touch
-rwxr-xr-x. 1 root root 62432 Jan 25  2014 /usr/bin/touch[root@server1 ~]# which passwd
/usr/bin/passwd
[root@server1 ~]# ll -d /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 30  2014 /usr/bin/passwd
[root@server1 ~]# ll -d /etc/shadow
----------. 1 root root 1864 May 17 20:23 /etc/shadow
  1. 例如:touch这个命令的拥有者是root用户,如果不加冒险位,那么,在普通用户student用户下touch的文件的拥有者是普通用户student用户,而不是touch命令的拥有者root用户;但是一旦加了冒险位,那么在普通用户student用户下touch的文件的拥有者不再是普通用户student用户,而是touch命令的拥有者root用户。
  2. 例如:passwd这个命令修改的是/etc/shadow这个文件,明明/etc/shadow就不能让普通用户取读写,那为什么普通用户还能修改这个文件内的密码呢?这就是SUID的功能,说明如下:
  • 普通用户对于/usr/bin/passwd这个程序来说是具有x的权限,说明普通用户能执行passwd;
  • passwd的拥有者是root这个帐号;
  • 普通用户在执行passwd的过程中,会【暂时】获得root的权限;
  • /etc/shadow就可以被普通用户所执行的passwd所修改。

SUID设定方式

设定方式1:chmod  u+s  filename(二进制可执行文件);
设定方式2:chmod 4xxx filename(利用suid的值来设定(suid的值为4))

(2)SGID强制位(Set  GID)

当s标志在用户组的x时则称为Set GID(SGID)。

(1)对文件来说,基本上SUID有这样的限制与功能:

  1. SGID只针对二进制可执行文件。同SUID;
  2. 程序执行者对该程序来说,需具备x的权限;
  3. 执行者在执行的过程中将会获得该程序用户组的支持。

(2)对目录来说,基本上SUID有这样的限制与功能:

  1. 当目录拥有sgid权限后,目录中新建的所有文件的所属组都自动归到该目录的所属组中,和文件的建立者所在的组无关。

例子:

  1. 对文件来讲:例如,touch这个命令的所属组是root用户,如果不加冒险位,那么,在普通用户student用户下touch的文件的所属组是普通用户student用户,而不是touch命令的所属组root用户;但是一旦加了冒险位,那么在普通用户student用户下touch的文件的所属组不再是普通用户student用户,而是touch命令的所属组root用户。
  2. 对目录来讲:例如,在root用户下mkdir的目录的所属组是root用户,如果不加冒险位,那么,在普通用户student用户下进入该目录touch的文件或者mkdir的目录的所属组是普通用户student用户,而不是mkdir的目录的的所属组root用户;但是一旦加了冒险位,那么在普通用户student用户下进入该目录touch的文件或者mkdir的目录的所属组不再是普通用户student用户,而是touch命令该目录的所属组root用户。

SGID设定方式

设定方式1:chmod  g+s  filename(二进制可执行文件)|dirname
设定方式2:chmod 2xxx filename|dir(利用sgid的值来设定(sgid的值为2))

(1)针对文件

(2)针对目录

(3)sticky粘贴位(Sticky  Bit)

当t标志在其他用户的x时则称为Sticky  Bit(SBIT)。这个Sticky  Bit(SBIT)目前只针对目录有效,对于文件已经没有效果了,SBIT对于目录的作用是:

  • 当用户对于此目录具有w、x权限时,即具有写入的权限;
  • 当用户在该目录下建立文件或目录时,仅有自己与root才有权力删除该文件。

例子:

例如:在root用户下mkdir的目录的所属组是root用户,如果不加粘贴位,那么,在普通用户student用户下进入该目录touch的文件或者mkdir的目录可以被其他能够进入该目录的普通用户删除;但是一旦加了粘贴位,那么在普通用户student用户下进入该目录touch的文件或者mkdir的目录不可以被其他能够进入该目录的普通用户删除,只能由touch文件或者mkdir目录的用户或root用户删除。即当一个目录有t的权限,那么目录中的文件只能被文件的拥有者或root用户删除。

SBIT设定方式:

设定方式1:chmod o+t dirname
设定方式2:chmod 1xxx dirname(利用t的值来设定(t的值为1))

(4)权限位出现S、T的情况

注意,下面的范例只是练习而已,所以我使用同意文件来设置,你必须了解SUID不是用在,目录上,而SBIT不是用在文件上。

[root@server1 ~]# touch test
[root@server1 ~]# chmod 4755 test;ls -l test
-rwsr-xr-x. 1 root root 0 May 21 22:52 test
[root@server1 ~]# chmod 6755 test;ls -l test
-rwsr-sr-x. 1 root root 0 May 21 22:52 test
[root@server1 ~]# chmod 1755 test;ls -l test
-rwxr-xr-t. 1 root root 0 May 21 22:52 test
[root@server1 ~]# chmod 7666 test;ls -l test
-rwSrwSrwT. 1 root root 0 May 21 22:52 test

最后一个例子就要特别小心,怎么会出现大写的S与T?不都是小写吗?因为s与t都是取代x这个权限,但是你有没有发现,我们是执行7666。也就是说,user、group以及others都没有x这个可执行的标志(因为666嘛),所以,这个S与T代表的都是空的。

4、观察文件类型:file命令

如果你想要知道某个文件的基本信息,例如是ASCII或是数据文件或是二进制文件,且其中有没有使用到动态链接库(share libary)等信息,就可以利用file这个,命令来查看。举例来说:

(1)通过gedit命令,可以编辑file1文件(记得写文件的名字)

(2)输入命令行:file file1——查看file1文件的文件类型

[root@server ~]# file ~/.bashrc
/root/.bashrc: ASCII text   <==告诉我们是ASCII的纯文本文件
[root@server ~]# 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]=0x91a7160a019b7f5f754264d920e257522c5bce67, stripped
#执行文件的数据可就多得不得了,包括这个文件的SUID权限,兼容Intel x86_64等级的硬件平台
#使用的是Linux内核2.6.32的动态链接库等。
[root@server ~]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data   <==这时data文件

七、命令与文件的查找

1、脚本文件的查找

(1)查找【执行文件】:which命令

which [-a] command选项与参数:
-a:将所有由PATH目录中可以找到的命令均列出,而步之第一个被找到的命令名称
范例一:查找ifconfig这个命令的完整文件名
[root@server ~]# which ifconfig
/usr/sbin/ifconfig
范例二:用which去找出which的文件名是什么?
[root@server ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'/usr/bin/alias/usr/bin/which
#竟然会有两个which,其中一个是alias,那是啥?那就是所谓的【命令别名】
#意思是输入which会等于后面接的那串命令。
范例三:请找出history这个命令的完整文件名
[root@server ~]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
#什么?怎么可能没有history,我明明就能够用root执行history啊?

最后一个范例最有趣,怎么history这个常用的命令竟然找不到。为什么?这是因为history是bash内置的命令。但是which默认是找PATH内所设置的目录。所以当然找不到的(有bash就有history)。那怎么办?没关系,我们可以通过type这个命令。

(2)查询命令是否为Bash shell的内置命令:type命令

type [-ta] name选项与参数:不加任何选项与参数时,type会显示出name是外部命令还是bash内置命令
-t:当加入-t参数时,type将name以下面这些自言显示出它的意义file:表示为外部命令alias:表示该命令别名所设置的名称builtin:表示该命令为bash内置的命令功能
-a:会由PATH变量定义的路径中,将所有name的命令都列出来,包括alias
范例一:查询一下ls这个命令是否为bash内置?
[root@server ~]# type ls
ls is aliased to `ls --color=auto'   <==未加任何参数,列出ls的最主要使用情况
[root@server ~]# type -t ls
alias   <==仅列出ls执行时的依据
[root@server ~]# type -a ls
ls is aliased to `ls --color=auto'   <==最先使用alias
ls is /usr/bin/ls    <==还有找到外部命令在/bin/ls

通过type这个命令我们可以知道每个命令是否为bash的内置命令。此外,由于利用type来查找后面的名称时,如果后面接的名称并不能以执行文件的状态被找到,那么该名称就不会被显示出来的,也就是说,type主要在找出执行文件而不是一般文件名。呵呵,所以,这个type也可以用来作为类似which命令的用途。找命令用的。

2、文件的查找

在Linux下面也有相当优异的查找命令,通常find不很常用。除速度慢之外,也影响系统性能。一般我们都是先使用whereis或是locate来检查,如果真的找不到了,才以find来查找,为什么?因为whereis只找系统中某些特定目录下面的文件已,locate则是利用数据库来查找文件名,当然两者就相当的快速,而且没有实际查找硬盘内的文件系统状态,比较省时间。

(1)whereis命令(由一些特定的目录中查找文件)

whereis [-lbmsu] 文件或目录名选项与参数:
-l:可以列出whereis会查询的几个主要目录
-b:只找binary(二进制)格式的文件
-m:只找在说明文件maunal路径下的文件
-s:只找source源文件
-u:查找不在上述三个项目当中的特殊文件
范例一:找出与passwd有关的文件名
[root@server ~]# whereis passwd   <==全部的文件名通通都列出
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz[root@server ~]# whereis -b passwd    <==查找与passwd有关的二进制文件
passwd: /usr/bin/passwd /etc/passwd  [root@server ~]# whereis -m passwd   <==只有在man里面的文件名通通列出来
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz   [root@server ~]# whereis -s passwd   <==全部的文件名通通都列出来
passwd:[root@server ~]# whereis -u passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

那么whereis到底使用什么东西?为何查找的速度会比find快这么多?其实也没有什么。只是因为whereis只找几个特定的目录而已,并没有全系统去查询之故。所以说,whereis主要是针对/bin、/sbin下面的执行文件,以及/usr/share/man下面的man page文件,跟几个比较特定的目录来处理而已,所iyi速度当然快得多。不过,有某些文件是你找不到的。想要知道whereis到底查了多少目录?可以使用whereis -l来确认一下

(2)locate/updatedb命令

locate [-iclSr] keyword选项与参数:
-i:忽略大小写的差异
-c:不输出文件名,仅计算找到的文件数量
-l:仅输出几行的意思,例如输出五行则是-l 5
-S:输出locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等
-r:后面可接正则表达式的显示方式
范例一:找出系统中所有与passwd有关的文件名,且只列出5个
[root@server ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/root/etc.newer.than.passwd范例二:列出locate查询所使用的数据库文件之文件名与各数据量
[root@server ~]# locate -S
Database /var/lib/mlocate/mlocate.db:8,150 directories          <==总记录目录数111,502 files         <==总记录文件数5,163,186 bytes in file names2,342,916 bytes used to store database

但是,这个东西还是有使用上的限制。为什么?你会发现使用locate来寻找数据特别快,这是因为locate寻找的数据是由已建立的数据库/var/lib/mlocate/里面的数据所查找到的,所以不用直接再去硬盘当中读取数据,呵呵,当然是很快速的。

那么有什么限制?就是因为它是经由数据库来查找的,而数据库的建立默认是在每天执行一次(每个Linux发行版都不同,CentOS7.x是每天更新数据库一次,)所以当你新建起来的文件,却还在数据库更新之前查找该文件,那么locate会告诉你【找不到】,呵呵,因为必须要更新数据库呀!

那能否手动更新数据库?当然可以,更新locate数据库的方法非常简单,直接输入【updatedb】就可以。updatedb命令回去读取/etc/updatedb.conf这个配置文件的设置,然后再去硬盘里面进行查找文件名的操作,最后更新整个数据库文件。因为uodatadb会去查找硬盘,所以当你执行updatedb时,可能会等待数分钟的时间。

  • updatedb:根据/etc/updatedb.conf的设置去查找系统硬盘内的文件,并更新/var/lib/mlocate内的数据库文件;
  • locate:依据/var/lib/mlocate内的数据库记录,找出用户所输入关键词的文件名。

(3)find命令

find [PATH] [option] [action]选项与参数:
1、与时间有关的选项:共有-atime、-ctime与-mtime,以-mtime说明-mtime n:n为数字,意义为在n天之前的【一天之内】被修改过内容的文件;-mtime +n:列出n天之前的【不含n天本身】被修改过内容的文件;-mtime -n:n列出n天之内的【含n天本身】被修改过内容的文件;-newer file:file为一个存在的文件,列出比file还要新的文件;范例一:将系统上面24小时内修改过内容(mtime)的文件列出
[root@server ~]# find / -mtime 0
#那个0是重点。0表示目前的时间,那如果是三天前那一天的24小时内?
#find / -mtime 3 有变动过的文件都要被显示的意思范例二:寻找/etc下面的文件,如果文件日期比/etc/passwd新就列出
[root@server ~]# find /etc/ -newer /etc/passwd
#-newer用在辨别两个文件之间的新旧关系是很有用的。
  • +4代表大于等于5天前的文件
  • -4代表小于等于4天内的文件
  • 4则代表4-5那一天的文件
选项与参数:
2、与使用者或用户组名称有关的参数:-uid n:n为数字,这个数字是使用者的帐号ID,亦即UID,这个UID是记录在/etc/passwd里面-gid n:n为数字,这个数字是用户组名称的ID,亦即GID,这个GID是记录在/etc/Ggroup里面-user name:name为使用者的帐号名称,例如student-group name:name为用户组的名称,例如users-nouser:查找文件的拥有者不在/etc/passwd中-nogroup:查找文件的拥有用户组不存在于/etc/group的文件。当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,这是可能的。在这个时候,就可以使用-nouser与-nogroup查找范例三:查找/home下面属于student的文件
[root@server ~]# find /home -user student
#这个东西是很有用的,当我们要找出任何一个用户在系统当中的所有文件时,
#就可以利用这个命令将属于某个用户的所由文件都找出来范例四:查找系统中不属于任何人的文件
[root@server ~]# find / -nouser
#通过这个命令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何用户的文件时,不要太紧张,那有时候是正常的,尤其是你曾经以源代码自行编译软件时
选项与参数:
3、与文件权限及名称有关的参数:-name filename:查找文件名称为filename的文件-size [+-] SIZE:查找比SIZE还要大(+)或小(-)的文件。这个SIZE的规格有:c:代表1Bytes,k:代表1KB,M:代表1MB,G:代表1GB。所以,要找出比50KB还要大的文件,就是【-size +50k】-type TYPE:查找文件的类型为TYPE的,类型主要有:一般正规文件(f),设备文件(b,c),目录(d),链接文件(l),sockets(s),及FIFO(p)等属性-perm mode:查找文件权限【刚好等于】mode的文件,这个mode为类似chmod的属性值,举例来说-rws r-x r-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@server ~]# find / -name passwd 范例五-1:找出文件名包含了passwd这个关键字的文件
[root@server ~]# find / -name "*passwd*"   #或者find / -name '*passwd*',就是不要用find / -name *passwd*
#利用这个-name可以查找文件名。默认是完整文件名,如果想要找关键字,
#可以使用类似*的任意字符来处理范例六:找出/run目录下,文件类型为socket的文件名有哪些?
[root@server ~]# find /run -type s范例七:找出系统中,大于1MB的文件
[root@server ~]# find / -size +1024k   #或find / -size +1M范例八:找出文件当中含有SGID,SUID,SBIT的属性
[root@server ~]# find / -perm /7000
#所谓的700就是---s--s--t,那么只要含有s或t就列出,所以当然要使用/7000,
#使用-7000表示要同时含有---s--s--t的所有三个权限,如果需要任意一个,就是/7000。范例九:找出/usr/bin、/usr/sbin这两个目录下,只要具有SUID或SGID就找到该文件
[root@server ~]# find /usr/bin /usr/sbin/ -perm 6000

因为SUID是4,SGID是2,总共为6,因此可用/6000来处理这个权限,至于find后面可以接多个目录来进行查找。另外,find本来就会查找子目录,这个特色也要特别注意。

选项与参数;
4、额外可进行的操作:
-exec commond:command为其他命令,-exec后面可接额外的命令来处理查找到的结果
-print:将结果打印到屏幕上,这个操作是默认操作范例十:将上个范例找到的文件使用ls -l列出来
[root@server ~]# find /usr/bin /usr/sbin/ -perm 7000 -exec ls -l {} \;

该范例中特殊的地方有{}以及\;,还有-exec这个关键词,这些东西的意义为:

  • {}代表的是由find找到的内容,find的结果会被放置到{}位置中;
  • -exec一直到\;是关键词,代表find额外操作的开始(-exec)到结束(\;),在这中间的就是find命令内的额外操作,在本例中就是【ls  -l  {}】;
  • 因为【;】在bash环境下是有特殊意义的,因此利用反斜杠来转义。

find命令的相关练习

练习一:找出/etc下面,文件大小介于50KB到60KB之间的文件,并且将权限完整的列出(ls -l)
[root@server ~]# find /etc/ -size +50k -a -size -60k -exec ls -l {} \;练习二:找出/etc下面,文件容量大于50KB且文件所属人不是root的文件名,且将权限完整的列出(ls -l)
[root@server ~]# find /etc/ -size +50k -a ! -user root -exec ls -l {} \;练习三:找出/etc下面,容量大于1500KB以及容量等与0的文件
[root@server ~]# find /etc -size +1500k -o -size 0 

八、文件统计大小

1、wc -l file                            显示file文件中的行数

2、wc -w file                       显示file文件中的字数

3、wc -c file                        显示file文件中的字节数

4、wc -m file                       显示file文件中的字符数

注意:

  • 一串字后面有空格才算一个字数
  • 对于英文字母而言:字符数表示的是英文字母的个数(不要忘记换行隐藏的换行符(\n)也算一个字符);字符数=字节数(不要忘记换行隐藏的换行符(\n)也算一个字节)
  • 对于汉语而言:字符数表示的是中文汉字的个数;1个字符=3个字节 (不要忘记换行隐藏的换行符(\n)也算一个字节,中文的标点符号算做一个字符,英文标点符号算做一个字节)

Linux运维之linux下文件与目录管理相关推荐

  1. Linux运维实战|大文件切割

    介绍 日常工作中需要对日志文件进行分析,当日志文件过大时,Linux中使用vim.cat.vim.grep.awk等这些工具对大文件日志进行分析将会成为梦魇,具体表现在: 执行速度缓慢,文件内容需要加 ...

  2. Linux云计算好学吗?Linux运维学习资料 Centos8文件权限管理

    linux运维云计算/Linux全套百集大系列/Centos7-Centos8/全网最新Linux架构师教程_哔哩哔哩_bilibili 第七章 Centos8-文件权限管理 本节所讲内容: 7.1 ...

  3. linux下伪终端的使用,Linux运维培训 Linux伪终端详解

    原标题:Linux运维培训 Linux伪终端详解 Linux运维培训 Linux伪终端详解Linux学习绕不开一个名词"终端",对于新手来说可能不了解,对于老鸟来说,可能弄不大清楚 ...

  4. linux运维视频教程 linux培训视频

    马哥2016全套视频 linux运维视频教程 linux培训视频 http://edu.51cto.com/course/course_id-5524.html http://edu.51cto.co ...

  5. linux apache设置web访问重定向_从零开始学Linux运维|30.Linux的目录结构

    1.tree命令 linux下目录结构跟一个倒过来的树一样的,最顶层就是根目录 / tree这个命令就很形象 它够很方便的查看目录结构 使用"yum install tree -y" ...

  6. 怎样学习Linux运维云计算,linux运维云计算课程学习,Linux云计算面试时遇到的问题...

    原标题:linux运维云计算课程学习,Linux云计算面试时遇到的问题 Linux命令行,以及用户使用Linux命令进行Linux shell交互,是Linux最吸引人的地方,也是面试中最普遍的话题之 ...

  7. linux常用运维shell,常用的shell命令,持续更新 | linux运维小站–linux系统架构_服务器运维_Linux运维工程师工作手札...

    查看可疑文件,查看访问可疑文件IP grep /api/_notes/index.php * . -r>ip.log 查看指定IP的nginx访问日志 cat access.log|grep 1 ...

  8. linux运维制度,Linux运维工作分类

    2.1-应用运维(SRE):应用运维负责线上服务的变更.服务状态监控.服务容灾和数据备份等工作,对服务进行例行排查.故障应急处理等工作,工作职责如下:设计评审.服务管理.资源管理.例行检查.预案管理. ...

  9. Linux操作系统使用基础04:文件与目录管理

    目录 1. 几个特殊目录 2. PATH环境变量 3. 目录与文件相关命令 3.1 cd命令 3.2 pwd命令 3.3 mkdir命令 3.4 rmdir命令 3.5 ls命令 3.6 cp命令 3 ...

最新文章

  1. DocumentsContract cannot be resolved
  2. PHP——explode的应用(获取字符串,拆为下拉列表)
  3. mPaaS 月度小报|为采购而生,全新资源包上架;前端 2D 游戏化互动入门指南
  4. LINUX服务器搭建和常用配置介绍
  5. php 40163,微信支付授权获取 openId {errcode:40163,errmsg:code been used, hints: [ req_id: scqL1a02482017...
  6. easyui datalist 不显示数据_爬虫练习——豆瓣电影信息爬取及数据可视化
  7. BZOJ1486: [HNOI2009]最小圈
  8. [机缘参悟-61]:《兵者,诡道也》-2-三十六计解读-胜战计
  9. Java游戏开发中应始终坚持的10项基本原则
  10. 阿里云域名如何拍卖?
  11. php 带参页面跳转页面,跳转页面带参数_如何带参数跳转php界面
  12. JAVA爬取淘宝、京东、天猫以及苏宁商品历史价格(二)
  13. AsyncTask介绍
  14. java里break的使用方法_Java中break的第三种用法说明
  15. 忘记开机密码怎么开机
  16. matlab验潮站,[转载]matlab批量从NOAA网站下载验潮站数据
  17. chrome 图片助手下载
  18. 使用 WinRAR 制作自解压文件
  19. uni-app框架看这五款组件库就够了
  20. 现实世界的Windows Azure:与HubOne主管经理Nick Beaugeard的访谈

热门文章

  1. List中的sort排序方法
  2. iPhone手机使用:如何在iPhone手机上安装未授信的App
  3. Ubuntu 14.04 解决 QQ 问题:pidgin-lwqq
  4. Python的安装和使用及开发Spark
  5. 微信小程序获取用户信息接口
  6. 观史图馆之《古埃及历代疆域变化》
  7. PHP酰胺_PHPA是什么意思
  8. HDoj-2524 - 矩形A+B
  9. html的disabled属性
  10. maven profile配置