文件,目录管理
系统目录结构及文件类型
一, 系统目录结构
-
1、/- 根
每一个文件和目录从根目录开始。
只有 root 用户具有该目录下的写权限。请注意,/root 是 root 用户的主目录,这与 /. 不一样 -
2、/bin 中 - 用户二进制文件
包含二进制可执行文件。
在单用户模式下,你需要使用的常见 Linux 命令都位于此目录下。系统的所有用户使用的命令都设在这里。
例如:ps、ls、ping、grep、cp -
3、/sbin 目录 - 系统二进制文件
就像 /bin,/sbin 同样也包含二进制可执行文件。
但是,在这个目录下的 linux 命令通常由系统管理员使用,对系统进行维护。例如:iptables、reboot、fdisk、ifconfig、swapon 命令 -
4、/etc - 配置文件
包含所有程序所需的配置文件。
也包含了用于启动 / 停止单个程序的启动和关闭 shell 脚本。例如:/etc/resolv.conf、/etc/logrotate.conf -
5、/dev - 设备文件
包含设备文件。
这些包括终端设备、USB 或连接到系统的任何设备。例如:/dev/tty1、/dev/usbmon0 -
6、/proc - 进程信息
包含系统进程的相关信息。
这是一个虚拟的文件系统,包含有关正在运行的进程的信息。例如:/proc/{pid} 目录中包含的与特定 pid 相关的信息。
这是一个虚拟的文件系统,系统资源以文本信息形式存在。例如:/proc/uptime -
7、/var - 变量文件
var 代表变量文件。
这个目录下可以找到内容可能增长的文件。
这包括 - 系统日志文件(/var/log); 包和数据库文件(/var/lib); 电子邮件(/var/mail); 打印队列(/var/spool); 锁文件(/var/lock); 多次重新启动需要的临时文件(/var/tmp); -
8、/tmp - 临时文件
包含系统和用户创建的临时文件。
当系统重新启动时,这个目录下的文件都将被删除。 -
9、/usr - 用户程序
包含二进制文件、库文件、文档和二级程序的源代码。
/usr/bin 中包含用户程序的二进制文件。如果你在 /bin 中找不到用户二进制文件,到 /usr/bin 目录看看。例如:at、awk、cc、less、scp。
/usr/sbin 中包含系统管理员的二进制文件。如果你在 /sbin 中找不到系统二进制文件,到 /usr/sbin 目录看看。例如:atd、cron、sshd、useradd、userdel。
/usr/lib 中包含了 /usr/bin 和 /usr/sbin 用到的库。
/usr/local 中包含了从源安装的用户程序。例如,当你从源安装 Apache,它会在 /usr/local/apache2 中。 -
10、/home - HOME 目录
所有用户用 home 目录来存储他们的个人档案。
例如:/home/john、/home/nikita -
11、/boot - 引导加载程序文件
包含引导加载程序相关的文件。
内核的 initrd、vmlinux、grub 文件位于 /boot 下。
例如:initrd.img-2.6.32-24-generic、vmlinuz-2.6.32-24-generic -
12、/lib - 系统库
包含支持位于 /bin 和 /sbin 下的二进制文件的库文件.
库文件名为 ld或 lib.so.*
例如:ld-2.11.1.so,libncurses.so.5.7 -
13、/opt - 可选的附加应用程序
opt 代表可选的。
包含从个别厂商的附加应用程序。
附加应用程序应该安装在 /opt/ 或者 /opt/ 的子目录下。 -
14、/mnt - 挂载目录
临时安装目录,系统管理员可以挂载文件系统。 -
15、/media - 可移动媒体设备
用于挂载可移动设备的临时目录。
举例来说,挂载 CD-ROM 的 /media/cdrom,挂载软盘驱动器的 /media/floppy; -
16、/srv - 服务数据
srv 代表服务。
包含服务器特定服务相关的数据。
例如,/srv/cvs 包含 cvs 相关的数据。
二, 文件类型
我们使用 ls -l 这个命令时,可以观察到第一栏那十个字符中,第一个字符为文件的类型 [d 表示目录,- 表示是一个普通的文件,c 表示字符串设备,l 表示软链接文件,b 块设备]。
-
普通文件 (regular file): 一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [-],例如 [-rwxrwxrwx]。另外,依照文件的内容,又大略可以分为:
-
纯文本档 (ASCII):这是 Linux 系统中最多的一种文件类型, 称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设定的文件都属于这一种文件类型。 举例来说,你可以下达『 cat ~/.bashrc 』就可以看到该文件的内容。 (cat 是将一个文件内容读出来的指令)
-
二进制文件 (binary):,我们的系统其实仅认识且可以执行二进制文件(binary file) 在 Linux 当中的可执行文件(scripts, 文字型批处理文件不算) 就是这种格式的 举例来说,我们经常使用的 cat 命令就是一个 binary file。
-
数据格式文件 (data): 有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的 Linux 在使用者登入时,都会将登录的数据记录在 /var/log/wtmp 那个文件内,该文件是一个 data file,他能够透过 last 这个指令读出来! 但是使用 cat 时,会读出乱码 因为它是属于一种特殊格式的文件。
-
-
目录 (directory): 就是目录 第一个属性为 [d],例如 [drwxrwxrwx]。
连接文件 (link): 就是类似 Windows 系统底下的快捷方式! 第一个属性为 l ,例如 [lrwxrwxrwx] ; -
设备与装置文件 (device): 与系统周边及储存等相关的一些文件, 通常都集中在 /dev 这个目录之下!通常又分为两种:
-
区块 (block) 设备档 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备!你可以自行查一下 /dev/sda 看看, 会发现第一个属性为[b]!
-
字符 (character) 设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是『一次性读取』的,不能够截断输出。 举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑动』到另一个地方啊!第一个属性为 [c]。
-
-
数据接口文件 (sockets): 既然被称为数据接口文件, 想当然,这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个 socket 来进行数据的沟通了。第一个属性为 [s], 最常在 /var/run 这个目录中看到这种文件类型了。
-
数据输送文件 (FIFO, pipe): FIFO 也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO 是 first-in-first-out 的缩写。第一个属性为 [p] 。
注: 除了设备文件是我们系统中很重要的文件,最好不要随意修改之外,通常只有 root 用户才可以修改!
ls 命令,alias 命令及 which 命令
一,ls 命令
- ls (list) 查看文档或目录的详细信息,常用选项如下, ls 命令的输出信息可以进行彩色加亮显 示,以分区不同类型的文件。
# ls -l //显示详细信息;
# ls -i //显示文件索引节点号(inode)。一个索引节点代表一个文件;
# ls -a //显示所有档案及目录包括隐藏的文件;
# ls -t //按文件的时间排序;
# ls -h //在-l的时候(可以显示文件大小的时候),可以自动的变化单位
# ls -d //只列目录本身
# ls -ld //查看指定目录的属性
# ls -tr //按时间倒叙排序,最近文件在最下面
ls 带 -l 参数时, 如果 ls 显示目录的内容,在最前面会显示该目录下所有文件所占的文件块的总数。
英文 total 中文有时译为“总用量”,也有译为“总计”。单位默认是 KB,也可以用 -k 参数指定单位。
- 注:
# ls -lhtr filename/directory //该命令会列出目录下的所有文件,并且按照合适的大小显示(-h的作用),而且会按照时间的倒叙排序,一旦文件比较多,在有可能刷屏的情况下,较新的文件会出现在底部,方便查阅。
二,alias 命令
- alias 中文意思为 “别名”
- 功能说明:设置指令的别名。
- 语 法:alias[别名]=[指令名称]
- 参 数 : 若不加任何参数,则列出目前所有的别名设置。
三,which 命令
- which 命令的作用是,在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
-
命令格式:
which 可执行文件名称 -
命令功能:
which 指令会在 PATH 变量指定的路径中(使用命令:# echo $PATH 可以查看),搜索某个系统命令的位置,并且返回第一个搜索结果。 -
命令参数:
-n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
-p 与 -n 参数相同,但此处的包括了文件的路径。
-w 指定输出时栏位的宽度。
-V 显示版本信息 。
-
环境变量 PATH,cp 命令,mv 命令
一, 环境变量 PATH
- 在介绍环境变量之前,先介绍一个命令 which,它用于查找某个命令的绝对命令。
#echo $PATH //这里的echo用来输出$PATH的值。PATH前面的$是变量的前缀符号。
-
当我们输入一个命令时 (相对路径), 它会在以上这些目录里寻找这个命令。
命令实战
-
在命令行可以使用 ls2 来代表 ls
-
首先需要把 ls 的绝对路径 cp 到 /tmp/ls2,然后把 /tmp 这个路径加入到 PATH 下。ls2 就相当于 ls 可以用了。
注意: 当你在打开一个终端的时候,ls2 又不能用了,这是因为 /tmp 自动退出了 PATH 的路径。
如果想永久的把 /tmp 加入到 /PATH 的路径下,
输入命令 #vi /etc/profile
然后在最后一行加入 PATH=$PATH:/tmp/
然后保存退出。 -
删除 PATH 环境变量下 /tmp 路径
给 PATH 重新赋值一下 执行命令:
#PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
- 然后把 vi /etc/profile 的最后一行添加 PATH 路径删除即可。
二, 命令 cp
-
命令语法:
cp [选项][来源文件][目的文件] -
命令描述:
cp 是 copy(即复制) 的简写 -
命令选项:
-r: 如果要复制一个目录,必须加 -r 选项,否则不能复制
-i:这是安全选项,如果遇到一个已存在的文件,会询问是否覆盖。
** 注:** 在用 cp 命令时,所有的目录全部末尾加上 "/"。cp 目录时,不会询问你是否覆盖,说明当目标目录已经存在的时候,它会把原目录直接放到目标目录下面去。如果目标目录不存在,它会把原目录 cp 过来,并改变一个名字。
三, 命令 mv
-
命令语法:
mv[选项][源文件或目录][目标文件或目录] -
命令描述:
mv 是 move 的简写, 可以移动文件或者 重命名文件(语法为: mv [源文件名][修改后的文件名])
命令的几种情况:
- 目标文件是目录,但该目录不存在。
- 目标文件是目录,且该目标存在。
- 目标文件是文件,且文件不存在。
- 目标文件是文件,但该文件存在。
当目标文件是目录时,其存在与否,执行后的结果不一样。如果该目录存在,则会把源文件或目录移动到该目录中。如果该目录不存在,则会把源文件重命名为给定的目标文件名。
当目标文件是文件时,其存在与否,执行后的结果也是不一样的。如果该文件存在,则会询问是否覆盖。如果该文件不存在,则会把源文件重命名为给定的目标文件名。
文件或目录权限 chmod, 更改所有者所属组 chown
一, 文件或目录权限 chmod
Linux 文件属性
当我们用 ls -l 命令查看当前目录下的文件时,共显示了 9 列内容 (用空格划分列)。如图
第一列 包含文件的类型,所有者,所属组以及其他用户对该文件的权限。
其中第 1 位用来描述该文件的类型。我们看到这里的文件类型是 l,其实除了这个还有,b,c,s,d,- 等等。
d 代表该文件是目录
- 代表该文件是普通文件
l 代表该文件是链接文件
b 代表该文件是快设备,比如 /dev/sda 就是这样的文件,磁盘分区文件就是这种类型。
c 代表该文件是串行端口设备文件 (又称字符设备文件),比如键盘,鼠标,打印机,tty 终端等都是这样的文件。
s 代表该文件为套接字文件 (socket),用于进程之间的通信。
文件类型后面的 9 位,每 3 位为一组,其中 r 代表可读,w 代表可写,x 代表可执行。其中r 等于 4,w 等于 2,x 等于 1。前 3 位为 ** 所有者 (user)的权限,中间 3 位为所属组 (group)的权限,最后 3 位为其他用户 (others)** 的权限。
第二列 表示该文件占用的字节 (inode),如果是目录,那这个数值与该目录下是子目录数量有关。
第三列 表示该文件的所有者
第四列 表示该文件的所属组
第五列 表示该文件的大小。
第六列,第七列,第八列 表示该文件最后一次被修改的时间,依次为月份,日期以及时间。
第九列 表示文件名。
命令 chmod
-
命令语法
chmod [-R] xyz 文件名 (这里的 xyz 表示数字)。 -
命令描述
命令 chmod(change mode) 用于改变用户对文件 / 目录的读写执行权限。 -
命令参数
-R 选项的作用等同于 chown 命令的 -R 选项,也表示级联更改。
注意: 在 Linux 系统中,一个目录的默认权限为 755,而一个文件的默认权限为 644。
命令示例:
-
- 修改 DL 的权限,该为 777。
在这里我们看到,虽然修改了 DL 的权限,但是 DL 下的 1.txt 的权限并没有改变。
- 修改 DL 的权限,该为 777。
- 2. 如果想把目录下的子文件子目录全部批量的修改权限,可以加一个 -R 选项
例如 使用 -R 选项,把 DL 权限修改为 770。
可以看出,在使用 -R 的选项的情况下,把 DL 的权限修改为 770,其子目录及子文件都跟随 DL 的权限修改为了 770。
- 3. 使用字母的形式改变 DL 的权限为 747。
这里的 u 代表 user,g 代表 group,o 代表 other。
- 4. 使用一条命令,DL 的把所有者,所属组,以及其他用户,都减去 X 权限。
其中,a 代表 all(全部),a-x, 代表把所有者,所属组,其他用户,的 x 权限去除。
当然 a+x 的意思是把所有者,所属组,其他用户,加上 x 权限。当然也可以 u-x,u+x,(只针对所有者)。
二, 更改所有者所属组 chown
命令 chown
-
命令语法
chown [-R] 账户名 文件名 或者 chown [-R] 账户名: 组名 文件名 -
命令描述
命令 chown 可以更改文件的所有者 -
命令选项
-R 选项只适用目录,作用是级联更改,即不仅更改当前目录,连目录里的目录或者文件也全部更改。
图片用到一个 useradd 命令,其作用是增加一个用户组。
在这里我们看到,在不用 -R 选项的情况下,更改 dir 的所有者,它的目录下的 test1 的所有者并没有改变。
然后使用 -R 选项更改 dir 的所有者后,其目录下的 test1 也跟随 dir 的所用者一同改变。
命令 chgrp
-
命令语法
chgrp [组名][文件名] -
命令描述
命令 chgrp 可以更改文件的所属组 -
图片中用到了一个 groupadd 命令,其作用是增加一个所属组。
-
命令选项
-R 选项只适用目录,作用是级联更改,即不仅更改当前目录,连目录里的目录或者文件也全部更改。作用同 chown 的 -R
小知识: 在我们使用 chown 的时候,可以连同,所属组,一起更改。中间用: 分割。如下图
umask 命令, 隐藏权限 chattr—lsattr
一, 命令 umask
默认情况下, 目录的权限值为 755,普通文件的权限值为 644。
-
命令语法
umask xxx(这里的 xxx 代表 3 个数字)。 -
命令描述
命令 umask 用于改变文件的默认权限。
如果要查看 umask 的值,只要在命令行输入 umask,然后回车即可。
这里 umask 的预设值为 0022,规则:
若用户建立普通文件,则预设没有可执行权限,只有 r,w 两个权限,最大值为 666(-rw-rw-rw-)。
若用户建立目录,则预设所有权限均开放,即 777(-rwxrwxrwx)。
umask 计算法:
例如我们把 umask 的值改为 003,那么它创建的普通文件 (最大值 666) 的权限是什么呢?
普通文件的最大值 -umask 的值 = 将要创建的普通文件权限
(rw-rw-rw-)-(——-wx)=rw-rw-r–
可以看出是 666-003=664。
例如我们把 umask 的值改为 003,那么它创建的目录 (最大值 777) 的权限是什么呢?
目录文件的最大值 -umask 的值 = 将要创建的目录权限
(rwxrwxrwx)-(——-wx)=rwxrwxr–
可以看出 777-003=774
注意在计算 umask 的时候不能用数字表示,只能用字母。
二, 隐藏权限 chattr—lsattr
修改文件的特殊属性
命令 chattr
-
命令语法
chattr [+-=][Asaci][文件或目录名] ,其中 +,-,= 分别表示增加,减少和设定。 -
命令描述
命令 chattr(chage attribute)改变属性的意思 -
命令选项
A 增加该属性后,表示文件或目录的 atime 将不可修改。
s 增加该属性后,会将数据同步写入磁盘中。
a 增加该属性后,表示只能追加不能删除,非 root 用户不能设定该属性。
c 增加该属性后,表示自动压缩该文件,读取时会自动解压。
i 增加该属性后,表示文件不能删除,重命名,设定链接,写入以及新增数据。
以上选项中,常用的为 a,i 这两个选项,举例说明用法如下:
选项 i
- 从图中可以看出。给 dir 目录增加 i 权限后,即使是 root 账户,也不能再 dir 目录中创建或删除 test2 文件。
选项 a
- 从图中可以看出。dir 目录增加 a 权限后,只可以在里面创建文件,而不能删除文件。
- 从图中可以看出。dir/test1 增加 a 权限后,只能追加内容,不能替换内容。增加 i 选项后,既不能追加, 也不能替换。
命令 lsattr
-
命令语法
lsattr [-aR] [文件 / 目录名] -
命令描述
命令 lsattr 用于读取文件或者目录的特殊权限。 -
命令选项
-a 类似于 ls 的 -a 选项,即连同隐藏文件一同列出。
-R 连同子目录的数据一同列出。
特殊权限之 set uid, 特殊权限之 set gid, 特殊权限之 sticky bit
一, 特殊权限之 set uid
权限说明:set uid 权限针对二进制可执行文件,使文件在执行阶段具有文件所有者的权限。比如 passwd 这个命令就具有该权限。当普通用户执行 passwd 命令时,可以临时获得 root 权限,从而可以更改密码。
作用 :set uid 的作用是保证普通用户临时拥有该命令所有者的身份。给一个文件设置成 set uid,前提这个文件是一个二进制,可执行的文件。
** 用法:** 把一个二进制可执行文件的,所有者的权限上 +s 就添加上了 set uid 权限。
例如把 ls 命令设置成 set uid 。#chmod u+s /usr/bin/ls
- 在更改 root 密码的时候用到 passwd 命令,检查可执行命令 passwd 的路径。
如图可看出,权限所有者的权限是 rws, 而不是 rwx。
说明: 这里的 s 表示:当其他用户执行该命令的时候,赋予该用户临时 root 权限, 也就是 set uid
- 在 Linux 下,更改密码也就意味着要更改一个密码的文件,路径为:/etc/shadow
如图可以看出,这个文件的权限为 000。普通用户是访问不了的。
- 如何让普通用户能够更改自己的密码同时又没有写的权限呢。
答: 使用普通用户 su 连接到 root 用户, 在 root 用户下把 ls 设置成 set uid 权限。
具体步骤如下
- 首先切换到一个普通用户下。
#su 用户名 //切换到user1用户下。
# whoami //查看当前用户
- 当我们在普通用户的状态下,查看 root 的时候权限是不够的,需要在 root 用户下把 ls 权限设置成 set uid。
#chmod u+s /usr/bin/ls //在ls上添加set uid权限
注:
#chmod u-s /usr/bin/ls //去除set uid权限
- 把 ls 添加 set uid 权限后,在普通用户下就能查看 root 了。自然普通用户也就能修改密码而同时又没有写的权限了。
二, 特殊权限之 set gid
set gid 不仅能作用在文件上,还能作用在目录上。
权限说明: set gid 权限可以作用在文件上 (二进制可执行文件),也可以作用在目录上。当作用在文件上时,其功能和 set,uid 一样,它会使文件在执行阶段具有文件所属组的权限。目录被设置这个权限后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。
作用:
当作用在 文件 上的时候 ,其作用和 set uid 是类似的,它可以让执行这个文件的普通用户临时拥有所属组的身份。
当作用在 目录 上的时候,创建子目录或子文件的所属组和该目录的所属组是保持一致的。
用法: 把一个二进制可执行文件的,所属组的权限上 +s 就添加上了 set gid 权限。
- 当作用在 文件 * 上的时候 ,其作用和 set uid 是类似的,它可以让执行这个文件的普通用户临时拥有所属组的身份。
- 例如把 ls 命令设置成 set gid 。
#chmod g+s /usr/bin/ls
如图可见 ,所属组中的 x 变成了 s
- 切换到普通用户下,一样可以进入到 /root 的子目录下
![输入图片说明]
- 当作用在目录上的时候,创建子目录或子文件的所属组和该目录的所属组是保持一致的。
例如: 我们把 123 目录添加 set gid 权限,然后更改所属组为 user1,然后在 123 目录下创建一个文件 dl,其 dl 的所属组为 user1。 如果没有添加 set gid 权限的话,dl 的所属组应该是 root。
三, 特殊权限之 sticky bit
权限说明: 可以理解为防删除位。文件是否可以被某用户删除,主要取决于该文件所在的目录是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能删除,同时也不能添加新的文件。如果希望用户能够添加文件但不能删除该目录下其他用户的文件,则可以对父目录增加该权限。设置该权限后,就算用户对目录具有写权限,也不能删除其他用户的文件。
作用: 防止别人删除自己的文件,root 用户除外。
- 在这里我看到,/tmp 的其他用户的权限是 rwt,而不是传统的 rwx。这个叫做防删除位。
例如: 在 user1 用户下的 /tmp 目录下 创建一个 dl 文件(dl 的权限是默认的 644)时,在 dl 里面编辑一些内容。然后切换到 user2 用户下,在 user2 用户下只能查看 dl 文件,而不能更改(除 user1 用户和 root 用户拥有修改的权限,其他用户都不能修改)。
特殊权限总结
一个目录下的文件能不能删除,不取决于这个目录下的文件的权限,而是取决于这个文件所在目录的权限,是否可写。 所以当一个目录的 others 权限是可读可写时 (目录默认权限有可执行,因为打开目录,就相当于执行了该目录),其他人就可以删除这个目录下的任何文件,包括 root 文件。