目录
一、文件隐藏属性:lsattr,chattr
二、文件特殊权限:SetUID,SetGID,Stick_BIT
三、链接文件:ln
四、find 命令
五、Linux 下文件名后缀
六、Linux 与 Windows 互传文件
一、文件隐藏属性:lsattr,chattr
除了那9个权限外,还有一部分的隐藏属性。这些隐藏属性虽然不常用,但能对系统的安全性有很大的帮助
1. 属性介绍
对文件以及目录的作用不同,只要记住:文件名是目录的内容
-
a
:使文件只能追加内容,而不能删除或修改内容,也不能删除、重命名、硬链接、修改权限,但可以软链接;使目录只能增加子文件或子目录,而不能删除子文件或子目录,但限制只针对该目录下的第一级。
只有 root 用户才能设置该属性。
ps.该权限可用于日志文件,防止恶意删除日志文件或日志内容,同时又不影响日志的正常记录
对文件本身进行操作:
[root@localhost ~]# chattr +a test-a # 为 test-a 文件加入 a 权限
[root@localhost ~]# lsattr
-----a---------- ./test-a
[root@localhost ~]# rm test-a -f # 删不掉
rm: 无法删除"test-a": 不允许的操作
[root@localhost ~]# mv test-a test #移不动
mv: 无法将"test-a" 移动至"test": 不允许的操作
对文件内容进行操作:
[root@localhost ~]# cat test-a # 文件内容是 1 行数字
11
[root@localhost ~]# vim test-a # 使用 vim 添加一行新的数字。
11
22
~
~
"test-a"
"test-a" E212: Can't open file for writing #失败!
Press ENTER or type command to continue
## 说好的能追加呢?请使用下面的方法!
[root@localhost ~]# lsattr ; cat test-a
-----a---------- ./test-a
11
[root@localhost ~]# echo 22 >> test-a ; cat test-a # 成功了!!!
11
22
-
i
:比a
更严苛,连追加都不让了,其他限制与a
相同。同样也只有 root 用户能设置该属性
[root@localhost ~]# cat test-i
11
[root@localhost ~]# echo 22 >> test-i # 追加都不让了!
-bash: test-i: 权限不够
2. 设置、查看的方法
设置:
chattr [+-=] [ia]
查看:
lsattr [-adR]
# 选项的功能同 ls 命令的选项相同
二、文件特殊权限:SetUID,SetGID,Stick_BIT
看一下 /tmp/ 和 /bin/passwd 的权限:
drwxrwxrwt. 7 root root 4096 5月 15 20:22 /tmp/ -rwsr-xr-x. 1 root root 27832 6月 10 2014 /bin/passwd
会发现
/tmp/
的 other 权限中,x
变成了t
;/bin/passwd
owner 权限中,x
变成了s
1. SUID 原理
/etc/passwd
文件的权限为-rw-r--r--
,表示只有 root 能够更改该文件- 用户使用
/bin/passwd
命令进行改密,自动修改了/etc/passwd
文件- 是不是冲突了?明明 /etc/passwd 文件只有 root 能更改,但普通用户自己进行改密时也能修改
—— SUID 的原因
SUID 权限仅针对 二进制可执行程序 有效,不能够用在 shell script 文件上
问:什么是二进制可执行程序?所有命令都是二进制可执行程序吗?
答:自己先用file
命令看看/bin/ls
、/bin/cd
、/bin/passwd
这些命令,那些说明是64-bit
、32-bit
的就是二进制可执行程序。或者可以cat
一下这些命令,能正常看到内容的就不是!执行者在执行该程序的时候将具有 owner 的权限
这就解答了我们的疑惑,属于 other 的用户在执行/bin/passwd
时,自动获取到了 owner 的权限,也就是root
的权限,所以才能够修改/etc/passwd
文件本权限仅在执行该程序的过程中有效
注意,仅是在执行具有该属性的程序时才有其 owner 的权限
执行者的角色(other)必须对该程序具有
x
权限
都说了只有在执行过程中才能取得相应权限,所以起码要先能执行吧!仅能针对文件,对目录是无效的
2. SGID 原理
SGID 对二进制可执行文件、目录都有效。
对于二进制可执行文件,其效果与 SUID 类似;
对于目录,其效果有些不同
对于二进制可执行文件
a. 执行者的角色必须对该程序具有x
权限
b. 执行者在执行该程序时将具有 group 的权限
c. 该权限仅在执行该程序的过程中有效对于目录
a. 用户的角色起码要对该目录具有r
、x
权限
b. 用户在此目录下的有效用户组将变成该目录的所属组
c. 如果用户的角色对该目录拥有w
权限,则其新建的文件的所属组都是该目录的所属组
简单解释一下SGID的作用:
- 用户 A、B 都属于 G 组
- 有一个目录 DIR,所属组也为 G
- A 到 DIR 中新建了一个文件 FILE,那么该 FILE 的权限为664(普通用户 umask=002),且 owner 与 group 都为 A
- 由于 FILE 的 owner、group 都为 A,就导致 B 对于该文件属于 other 的角色,只具有
r
的权限- 但 A、B 都属于 G 组,他们共同在进行一个项目,对于 DIR 中的文件都需要进行
rw
- 此时将 DIR 加上 SGID 权限,那么无论 A 或是 B 再新建文件,该文件的 group 就都是 G 了,这样 A、B 对所有新建的文件都由
rw
权限了
更直观的见代码:
## 新建项目组: project
## 添加两名项目组成员:alice、bob,且他两属于 project 组
[root@localhost /]# groupadd project
[root@localhost /]# useradd -G project alice ; useradd -G project bob
[root@localhost /]# id alice
uid=1001(alice) gid=1002(alice) 组=1002(alice),1001(project)
[root@localhost /]# id bob
uid=1002(bob) gid=1003(bob) 组=1003(bob),1001(project)
## 他两需要共同维护一些文件,那么给他们建一个共用的目录,这样他两不就能一起维护文件了吗?
[root@localhost /]# mkdir /srv/ahome && ll -d /srv/ahome
drwxr-xr-x. 2 root root 6 5月 15 23:13 /srv/ahome
## 目录的 group 改为 project,并给目录770的权限
[root@localhost /]# chown :project /srv/ahome/ && chmod 770 /srv/ahome/ && ll -d /srv/ahome/
drwxrwx---. 2 root project 6 5月 15 23:13 /srv/ahome/
## 目录建好了,Alice 在该目录下建了个文件
[root@localhost /]# su alice
[alice@localhost /]$ cd /srv/ahome/
[alice@localhost ahome]$ touch jobs
[alice@localhost ahome]$ exit
## Bob 来试试能不能一起维护文件
[root@localhost /]# su bob
[bob@localhost ahome]$ ll -d /srv/ahome/
drwxrwx---. 2 root project 32 5月 15 23:17 /srv/ahome/ # Bob:嗯,我的 group 和这个目录相同,能 rwx
[bob@localhost /]$ cd /srv/ahome/
[bob@localhost ahome]$ ll jobs
-rw-rw-r--. 1 alice alice 0 5月 15 23:15 jobs # Bob:逗我?这个文件的 owner 和 group 都是 alice,劳资属于 other,只能看!!
## 怎么办呢?试试 SGID 吧!!
[root@localhost /]# chmod 2770 /srv/ahome/ && ll -d /srv/ahome/
drwxrws---. 2 root project 17 5月 15 23:15 /srv/ahome/ # group 的 x 权限变成 s 了
## Alice 再来建个新文件
[root@localhost /]# su alice
[alice@localhost /]$ cd /srv/ahome/
[alice@localhost ahome]$ touch new_jobs
[alice@localhost ahome]$ ll new_jobs
-rw-rw-r--. 1 alice project 0 5月 15 23:17 new_jobs
## 嗯,这回只要能在这个目录里建文件的人,该文件的 group 都会自动变成 project,配合上默认664的权限,那只要是能进来这个目录的人都能以 project 这个组的身份进行 rw 了。
注意:如果带有 SGID 的目录对于 other 角色的权限为 r-x,即便目录下的文件对于 other 用户权限仅为 r--,other 也能够进入该目录后,使用
vim
强制 修改该文件。因此对于带有 SGID 的目录(通常作共享用),要谨慎控制 other 的权限,尽量设置成0
3. SBIT 原理
仅对目录有效
效果就是,在这个目录下,我建立的文件,别人不能删除,但是否能修改要看别人是否有w
权限
总结成一句话:“我的文件,我做主”,当然 root 也能删。
4. 设置方法
- 分值分配
- SUID:4
- SGID:2
- SBIT:1
- 数字化的更改
仅需在普通的3位权限前再加一位,该位的值为 SUID、SGID、SBIT 的和,与rwx
的计算方法一样
如:
chmod 4644 /bin/passwd # 拥有 SUID
chmod 3755 /srv/work/ # 同时具有 SGID、SBIT
- 字符化的更改
- SUID:
chmod u+s
- SGID:
chmod g+s
- SBIT:
chmod o+t
这里就不穷举了,跟正常设置权限的方式其实是一样的,无非是用[+-=]三种符号
- SUID:
5. 其他
有时会发现权限中出现大写的 S
、T
。
如果设置了 SUID,但 owner 自己都没有 x
权限时,则文件权限上会显示 S
如果设置了 SGID,但 group 自己都没有 x
权限时,则文件权限上会显示 S
如果设置了 SBIT,但 owner 自己对这个目录都没有 w
权限时,则目录权限上会显示 T
三、链接文件:ln
链接分为硬链接以及符号链接(也可叫做软链接)。
两种链接实现机理不同,因此要求与效果也都不同
1. 硬链接(Hard Link)
原理简介
a. 每个文件都会占用一个 inode,文件内容由 indoe 的记录来指向
b. 想要读取文件的实际内容,必须要经过目录所记录的文件名来指向到正确的 inode 号码,再通过 inode 记录的 block 信息,找到文件存储的实际内容
c. 文件名只与目录有关,但是文件的内容却与 indoe 相关
=>那么硬链接就是多个文件名关联到同一个 inode 号码
=>简单地讲,硬链接就是在某个目录下新建了一个文件名,并将该文件名与某个 inode 号码关联,仅此而已
=>由于两个文件名指向的其实是同一个文件,那么这两个文件名除了名字不同,其他所有属性、内容都一模一样
查看方式
[root@localhost ~]# ll aaa # 注意观察列表的第二列,此列展示的是多少个文件指向与其相同的 inode,此时该列为‘1’
-rw-r--r--. 1 root root 0 5月 15 06:43 aaa
[root@localhost ~]# ln aaa aaa-hard # 建立 aaa-hard,使其指向 aaa 文件的 inode
[root@localhost ~]# ll -i
总用量 0
67914933 -rw-r--r--. 2 root root 0 5月 15 06:43 aaa
67914933 -rw-r--r--. 2 root root 0 5月 15 06:43 aaa-hard # 看!两者使用了相同的 indoe,而且第二列的值变为了‘2’
作用
可能是“安全”吧。如果两个文件名指向同一个 inode,删掉任意一个文件名,都不影响 inode 及另一个文件名-
限制
a. 硬链接不能跨越文件系统
原理简介部分已经说明,硬链接的核心是两个文件 inode 相同。但是不同的文件系统的 inode 几乎是完全不同的,那么也就不可能跨越文件系统建立硬链接。b. 硬链接仅能作用于文件,不能作用于目录
目录的硬链接不仅仅是目录之间进行硬链接,目录下的子目录、子文件都需要进行硬链接,工程浩大、复杂。
所以 Linux 不让用户进行目录的硬链接,但她自己其实已经为所有目录做了硬链接。不信?我们来看看!
[root@localhost ~]# ll -id /root/
67165921 dr-xr-x---. 3 root root 4096 5月 15 06:43 /root/ # 咦?/root/所用的 67165921 竟然链接有3个文件名
[root@localhost ~]# ll -id /root/. /root/.ssh/..
67165921 dr-xr-x---. 3 root root 4096 5月 15 06:43 /root/. # 一个是该目录下的 .
67165921 dr-xr-x---. 3 root root 4096 5月 15 06:43 /root/.ssh/.. # 另一个是该目录的子目录下的 ..
## 可以得出规律:一个目录下的链接数减去1,就等于其下1级子目录的个数
-
用法
ln
如:ln /etc/passwd /root/mima.txt
ps.
不一定必须存在。如果不存在, ln
命令会自动新建
2. 符号链接(Symbolic Link)
原理简介
也可称之为软链接。相比硬链接,符号链接就简单了许多。软链接将一个文件名链接至另一个文件名。那么当对这个文件名进行操作时,实际上是操作其所软链接的文件名。其实就像是 Windows 下的“快捷方式”特点
a. 源文件被删除后,软链接文件会失效
b. 不仅能对文件进行软链接,也能对目录进行软链接
c. 可以跨文件系统使用
d. 软链接文件与源文件是两个完全不同的文件,而该文件的大小其实取决于指定链接时输入的源文件名字的长度,看一下下面的例子
[root@localhost ~]# touch a
[root@localhost ~]# ln -s a a-link-short;ln -s /root/a a-link-long;ll # 用两种文件写法来做链接
总用量 0
-rw-r--r--. 1 root root 0 5月 15 07:30 a
lrwxrwxrwx. 1 root root 7 5月 15 07:31 a-link-long -> /root/a # 明明是链接到同一个文件,为何文件大小不同?
lrwxrwxrwx. 1 root root 1 5月 15 07:31 a-link-short -> a
## 软链接的文件大小,主要看指定链接时使用的源文件名字或路径的长度
-
用法
ln -s
如:ln -s /etc/passwd /root/mima.txt
ps.
不一定必须存在。如果不存在, ln
命令会自动新建
- 注意点
a. 如果文件做了软链接,那么当你在对软链接文件的内容进行操作时,其实是在对源文件进行操作
b. 如果目录做了软链接,那么当你在对软链接目录的内容(也就是目录中的文件)进行操作时,其实是在对源目中的文件进行操作,所以要切记小心。
c. 做软链接尽量使用绝对路径,不然会加大链接失效的概率
- 实际案例
问题
如果某个分区快满了,该分区中有一些大文件,且经常被访问。这时硬盘上还有一个较为空闲的分区。
请问如何处理才能够在缓解容量的同时不影响用户的正常使用?
解法
a. 在空闲分区建立新的目录;
b. 将大文件 file-1 转移至新建的目录(推荐使用 rsync,因为其支持增量备份);
c. 在旧目录中新建与原文件同名的文件(file-1),并软链接至真实的 file-1文件;
四、find 命令
find
命令功能强大,能根据各种关键字段进行文件的搜索。
但find
是直接查找硬盘,所以相较查找数据库的where
和locate
而言,速度较慢
命令格式:find [PATH] [option-1] [option-2] ... [action]
可以根据多种条件一起来进行筛选,取交集
1. 按时间进行查找
- 选项
-
-atime n
:查找 n 【天】之前【被读取】的文档 -
-mtime n
:查找 n 【天】之前【内容变更】的文档 -
-ctime n
:查找 n 【天】之前【inode 内容变更】的文档 -
-mmin n
:查找 n 【分钟】之前【内容变更】的文档 -
-newer
: mtime 比某个文件新的文档
-
- 例子
- 找出一天内被改动过的文件:
find / -mtime 0
- 找出四天内被改动过的文件:
find / -mtime -4
- 找出四天前的那一天被改动过的文件:
find / -mtime 4
- 找出比 /etc/passwd 新的文件:
find / -newer /etc/passwd
- 找出一天内被改动过的文件:
2. 按名称、大小、类型进行查找
-
选项
-
-name < FILENAME>
:查找名为的文件(支持通配符,但要加单引号) -
-size [+-]
:查找 [大于/小于]的文件,可加单位 -
c
:byte -
k
:KB -
M
:MB -
G
:GB
-
-
-type
:查找属于类型的文件 -
f
:普通文件 -
b
:存储设备 -
c
:字符型设备 -
d
:目录 -
l
:链接文件 -
s
:Socket 文件 -
p
:FIFO 文件
-
-
-
例子
- 查找叫做 passwd 的文件:
find / -name passwd
- 查找文件名包含 bash 的文件:`find /root/ -name 'bash'
- 查找大于50MB的文件:
find /root/ -size +50M
- 查找链接文件:
find /root/ -type l
- 查找叫做 passwd 的文件:
3. 按所有者、所属组进行查找
-
选项
-
-user
:查找属于用户的文件 -
-group
:查找属于群组的文件 -
-uid
:查找 owner 的 UID 为的文件 -
-gid
:查找 group 的 GID 为的文件 -
-nouser
:查找 owner 不在/etc/passwd
中的文件 -
-nogroup
:查找 group 不在/etc/group
中的文件
-
-
例子
- 查找 /home 下属于 choco 的文件:
find /home -user choco
- 查找 /home 下,且 owner 的 UID 为 1002 的文件:
find /home -uid 1002
- 查找 owner 不在
/etc/passwd
中的文件:find / -nouser
- 查找 /home 下属于 choco 的文件:
4. 按权限进行查找
- 选项
-
-perm
:查找权限正好
等于的文件 -
-perm -
:查找权限包含的文件 -
-perm +
:查找权限被包含的文件
ps. 这里的加减号不太好理解,跟直面的含义相反。可以记忆:加号代表 Any,减号代表 All
-
- 例子
- 查找包含 SUID 或 SGID 或 SBIT 权限的文件:
find / -perm +7000
- 查找包含 SUID 或 SGID 权限的文件:
find / -perm +6000
- 查找权限大于 4755 的文件:
find / -perm -4755
- 查找包含 SUID 或 SGID 或 SBIT 权限的文件:
5. 查找完的动作
- 选项
-
-exec
:使用命令来处理查找到的结果(不支持 alias)
-
- 例子
- 查找 /root/ 下文件名包含 bash 的文件,并 ls 以列表模式显示出来:
find /root/ -name '*bash*' -exec ls -l {} \;
## {}代表找到的结果
## 以分号结尾,但在 bash 环境下分好有特殊含义,所以用反斜杠转义
五、Linux 下文件名后缀
Windows 的文件后缀直接决定了该文件默认使用哪种程序打开,但 Linux 没有这种限制,后缀名可以乱起
氮素,乱起后缀名造成的后果就是“光看文件名,你自己都不知道这是个什么文件”
所以,即使是Linux,也应该按照一些约定俗成的规则设置文件名(一般文件的后缀与 Windows 保持一致即可)
举例个别种类的后缀:
归档、源码:
.tar
、.tar.gz
、.tgz
、.zip
、.tar.bz
shell 脚本:
.sh
Python:
.py
Perl:
.pl
网页文件:
.html
、.htm
、.php
、.jsp
、.do
rpm 安装包:
.rpm
配置文档:
.conf
、.cfg
日志文件:
.log
六、Linux 与 Windows 互传文件
方法非常多,其实只要找准能应付特定情况的几种就行了
那么有哪些特定情况呢?
- 打死也不在服务器上装 lrzsz ——> 那你就用 xftp 或者 FileZilla
- 打死也不在本地装 Xftp 或 FileZilla ——> 那你就在服务器上装 lrzsz
- 啥都不想装! ——> 那你用 scp、SMB、挂U盘.... 慢慢搞吧,累死你!
1. rzsz
只有使用Xshell或者SecureCRT时,才能支持该功能
a. 安装lrzsz
yum -y install lrzsz
如果你不知道确切的软件名,可以先查一下 yum search lrzsz
b. sz
(Send)
sz
c. rz
(Receive)
直接rz
,然后在弹出框里自己选
2. xftp
与Xshell一样,都是 NetSarang 公司出品,也是非常精品的一款软件
操作方式与Xshell基本相同
a. 新建连接
b. 配置链接参数(与Xshell一样)
c. 传文件吧(看中哪个双击它个就行)
d. Xshell 中可以轻松调用 xftp
(The End)