淡定从容,宁静致远
全部博文(329)
分类: LINUX
2012-12-12 21:23:26
理解Linux的权限机制
# ls –l /
§
UNIX文件类型分析
d 目录类型文件
l 符号连接型文件 /dev/cdrom
b 块设备文件 /dev/sda
c 字符型设备文件 /dev/tty1
p 管道文件 /dev/initctl
有名管道是一个能在互不相关进程之间传送数据的特殊文件
s socket文件
经常用在计算机网络间的通信
- 普通文件
基本文件及目录权限
文件权限
r 读权限 -读取文件内容 cat vi 强制
w 写权限 -修改文件内容 echo >> vi 强制改写
x 可执行权限 二进制文件,shell脚本
目录权限
r 读权限 -读取目录内容
w 写权限 -修改目录内容 单独使用没有意义,与x权限一起使用时可以在目录内删除文件或生成文件或给文件改名
x 访问权限 access -可以进到目录
文件和目录权限比较
权限 |
文件 |
目录 |
r |
cat |
ls |
w |
vi |
no |
x |
no |
cd |
rw |
cat vi |
ls |
rx |
. / |
ls cd |
wx |
vi |
cd touch mkdir |
rwx |
all |
all |
常用权限操作命令
chmod 改变权限
chmod [ugoa][+-=][rwx] filename
基本文件拥有者分类
u 所有者
g 所属组
o 其他人
a 所有人
chmod |
u |
+(加入) |
r s t |
文件或目录 |
规则 |
含义 |
u+w |
为文件的属主添加写入的权限 |
ug=rw,o=r |
赋予属主和属组读取/写入的权限,赋予其他人读取的权限 |
a-x |
删除全部3种类别用户(属主/属组/其他人)的执行权限 |
ug=srx,o= |
设置文件的setuid和setgid位,并且只给属主和属组赋予读取/执行的权限 |
g=u |
让属组的权限跟属主的权限完全一样 |
数字类型改变文件权限
chmod [-R] xyz 文件或目录
r = 4
w = 2
x = 1
八进制 |
二进制 |
权限 |
0 |
000 |
--- |
1 |
001 |
--x |
2 |
010 |
-w- |
3 |
011 |
-wx |
4 |
100 |
r-- |
5 |
101 |
r-x |
6 |
110 |
rw- |
7 |
111 |
rwx |
只有文件的拥有者和root 才能使用
chown 改变文件所有者和所属组
chown [ -R ]... [属主][:[属组]] 文件名或目录
chown [ -R ]... --reference=参考文件 文件名或目录
chgrp
chgrp [ -R ]... 属组 文件或目录
chgrp [ -R ]... --reference=参考文件 文件名或目录
Umask 对用户默认创建文件及目录的权限影响 ,umask 用一个三位数字的八进制值形式来指定,这个值代表要“剥夺”的权限。
· 若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666,默认权限如下:
-rw-rw-rw-
· 若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777,默认权限如下:
drwxrwxrwx
创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
练习:
* 在根目录下创建一个子目录叫shared
#mkdir /shared
* 该目录的权限为777
#chmod 777 /shared
* candan用户在该目录下创建一个只有自己能读取的文件,叫candanfile
#useradd candan
#su - candan
$cd /shared
$touch candanfile
$chmod 400 candanfile
$ls -l
* uplooking用户进入到该目录以后通过什么方式获取了candanfile文件的所有权
#useradd uplooking
#su - uplooking
$cd /shared
$vi candanfile ---> wq!
---------------------------------------------------------------------------------------------------------------
特殊权限
suid;
SUID 权限仅对二进制程序(binary program)有效;
运行者对该程序需要具有 x 的可运行权限;
本权限仅在运行该程序的过程中有效 (run-time);
运行者将具有该程序拥有者 (owner) 的权限。
所有者 4 4777
普通用户能给自己修改密码
#ls -l /usr/bin/passwd
? 尝试让普通用户可以使用init命令关机
# chmod 4755 /sbin/init
注意:如果你系统上的vi 被赋予了suid 权限,可以肯定你的系统已经被入侵
sgid;
所属组 2 2777
针对目录
用户若对目录具有 r 与 x 的权限时,该用户能够进入此目录;
该目录内所有用户在创建文件时,文件属组与目录属组相同
# mkdir /aaa
# chmod 2777 aaa
# chown :mike aaa
# su – tom
$ cd /aaa
$ touch a
$ ls -l a
针对文件
SGID 对二进制程序有用;
程序运行者对程序来说,需具备 x 的权限;
运行者在运行的过程中将会获得该用户组的支持!
Locate
-rwx--s--x 1 root slocate 23856 Mar 17 2009 /usr/bin/locate
/var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1738963 May 18 10:39 /var/lib/mlocate/mlocate.db
sticky 其他人 1 1777
针对目录
当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
防止普通用户在公共目录里互相残害对方的文件。
#chmod 1777 /shared
#chmod o+t /shared
#chmod o-t /shared
练习
* 在/tmp目录内,创建一个子目录为redhat
#mkdir /tmp/redhat
or
#cd /tmp
#mkdir redhat
* 在redhat目录内有三个子目录,分别是 c1, s1, u1.
#cd /tmp/redhat
#mkdir c1 u1 s1
* c1目录的只允许candan及candan组成员有完全控制权限,其他人无任何权限。
#cd /tmp/redhat
#chown candan.candan c1
#chmod 770 c1
* u1目录的只允许uplooking及uplooking组成员有完全控制权限,其他人无任何权限。
#cd /tmp/redhat
#chown uplooking:uplooking u1
#chmod 770 u1
* s1目录的只允许singh及singh组成员有完全控制权限,其他人无任何权限。
#cd /tmp/redhat
#chown singh.singh s1
#chmod 770 s1
* manager用户可以对以上三个目录有完全控制权限。
#useradd manager
#usermod -G candan,uplooking,singh manager
* 所有进入到u1目录的用户,在创建文件时,文件属组与u1相同
#chmod 2770 /tmp/redhat/u1
* redhat目录不允许除root以外的用户进行修改类动作
--------------------------------------------
* /tmp/test4目录内有一个文件,叫test
* candan只能读取
*uplooking只能写
*singh不能读取、不能写,但是能删除该文件
#mkdir /tmp/test4
#touch /tmp/test4/test
#chown singh:singh /tmp/test4
#ls -ld test4
#drwxr-xr-x 2 singh singh 4096 May 18 12:38 test4
#chown uplooking:candan test
#chmod 240 test
#ls -l test
#--w-r----- 1 uplooking candan 9 May 18 12:46 test
--------------------------------------------
隐藏权限
chattr 添加隐藏权限
lsattr 查看隐藏权限
chattr [+-][ai] filename
a: 只允许文件内容被追加, 日志
i: 不可变,重要的系统文件
ACL acess control list 访问控制列表
需求:针对一部分普通用户开放权限
命令:
查看:getfacl
设置:setfacl
需求:需要文件系统支持acl
选项:
-m :添加一个 ACL 规范;
-x :删除一个 ACL 规范;
-b :全部的 ACL 规范都移除;
对象:
1、针对用户
设定值的规范为: user:[用户账号列表]:[rwx]
[root@linux ~]# setfacl -m u:username:rx filename
2、针对组来设定
设定值的规范为: group:[组名]:[rwx]
[root@linux ~]# setfacl -m g:groupname:rw filename
3、设置的方式
(1)拒绝所有,允许局部
# touch abc
# chmod 770 abc
# setfacl -m u:u1:rwx abc
(2)拒绝局部,允许所有
# chmod 777 abc
# setfacl -m u:u1:--- abc
举例:
# mkdir /acl_test
# cd /acl_test
# touch c1
# mkdir abc
# setfacl -m u:u1:rw c1 针对c1文件给u1用户加权限
# setfacl -m u:u1:rwx abc/ 针对abc目录给u1用户加权限
# setfacl -x u:u1 c1 删除u1用户在c1上的权限
# setfacl -b c1 删除所有用户的权限
针对目录
# touch /c1
# setfacl -m g:mike:rwx /c1
# usermod -G mike tom
# su – tom
$ tom vi /c1
----------------------------------------------------------------------------------------------------------------------------
查找
什么是查找?
为什么使用查找?
因为我们常常需要知道那个文件放在哪里,才能够对该文件进行一些修改或维护等动作
-----------------------------------------------------------------------------------------------------------------------
which 查找对象为 PATH 指定路径下的可执行的 shell 命令或可执行脚本。
# echo $PATH
# which ifconfig
# su – tom
$ echo $PATH
$ which ifconfig
whereis 查找一个命令的二进制文件位置,源代码位置,man 页的位置
#whereis passwd
locate 基于数据库查找,速度快。 依赖于数据库,更新数据库命令为 updatedb
#touch /root/rootfile
#locate rootfile
#updatedb
#locate rootfile
find 全盘扫描
find 要查找的位置 选项 参数 要查找的内容
参数:
-name 按照文件名查找
-iname 名字不区分大小写
#cd /tmp
#touch redhat
#REDHAT
#find . -name redhat
#find . -iname redhat
-user 用户名 按照用户查找文件
-group 组名 按照组查找文件
-nouser 没有所有者 孤儿文件
-nogroup 没有所属组
#cd /tmp
#su - candan
$cd /tmp
$touch candanfile
$exit
#su - uplooking
$cd /tmp
$touch uplookingfile
$exit
#cd /tmp
#find . -user candan
#find -group uplooking
#userdel uplooking
#find . -nouser
#find . -nogroup
-size 文件大小
c byte
k +….k (大于) -….k(小于) …k(等于)
M +…M -…M ….M
#cd /tmp
#dd if=/dev/zero of=1Mfile bs=1M count=1
#dd if=/dev/zero of=3Mfile bs=1M count=3
# dd if=/dev/zero of=8Mfile bs=1M count=8
#find . -size +1M
#find .-size -8M
#find . -size +1M -and -size -8M
#find . -size 3M
-type 文件类型
f:普通文件
d:目录文件
b:块设备文件
l:链接文件
p:管道文件
s:socket 文件
c:字符设备文件:打印机
-perm 权限 0000 7777
+: 只要满足条件就输出
-: 只有满足条件才输出
: 绝对匹配
[root@x1 test1]# ll
总计 12308
-rw-r--r-- 1 root root 1048576 07-29 14:01 1Mfile
-rw-r--r-- 1 root root 3145728 07-29 14:03 3Mfile
-rw-r--r-- 1 root root 8388608 07-29 14:05 8Mfile
-rwxr--r-- 1 root root 0 07-29 14:06 a
-rwxrwxrwx 1 root root 0 07-29 14:06 b
[root@x1 test1]# find -perm +111
.
./b
./a
[root@x1 test1]# find -perm -111
.
./b
[root@x1 test1]# find -perm 744
./a
[root@www ~]# ls –l `find /sbin -perm +7000`
[root@x1 test1]#
-atime n 天(24 小时, 从当前时间开始)
-ctime n
-mtime n
-anewer filename
-cnewer filename
-mnewer (-newer)filename
查找以后直接处理找到的文件
-exec 非交互
-ok 交互
# find . -perm 744 -exec rm -f {} \;
# find . -perm 744 -ok rm -f {} \;
查找/etc/目录下所有.conf 的文件,将这些文件拷贝到/backup 目录内
# find /etc -name *.conf -exec cp {} /backup \;
逻辑关系运算
-o:或者
#find /etc -name passwd -o -name shadow
-and: 与 (-a)
# find . -type f -and -size 3M
-not: 非(!)
# find . -type f -not -name 3Mfile
练习:
尝试用 find 找出目前 linux 系统中,所有具有 SUID 的文件有哪些?
# find / -perm +4000 -print
找出 /etc 底下,文件大小介於 50K 到 60K 之间的文件,并且将权限完整的列出。
# find /etc -size +50k -a -size -60k -exec ls -l {} \;
找出 /etc 底下,文件容量大於 50K 且文件所有者不是 root 的文件,且将权限完整的列出。
# find /etc -size +50k -a ! -user root -exec ls -ld {} \;
# find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
找出 /etc 底下,容量大於 1500K 以及容量等於 0 的文件:
# find /etc -size +1500k -o -size 0
---------------------------------------------------------------------------------------------
grep 搜索某些关键字,输出结果包含该关键字的行。以行为单位。
global regular expression print
正则表达式是一种表示方式,让你可以查找匹配特定准则的文本,例如,“以字母a开头”。此表示法让你可以写一个表达式,选定或匹配多个数据字符串。
正则表达式:
字符模式:
一般字符
元字符
基本格式:
grep [选项] ‘搜索关键字’要搜索的文件名列表
#grep root /etc/passwd
-i 忽略大小写
#ifconfig | grep -i bcast
-n 列出行号
#grep -n root /etc/passwd
-v 反向显示
#cat /etc/vsftpd/vsftpd.conf | grep -v ^# | grep -v ^$
-r directory:对某个路径下面的所有文件进行搜索
#grep -r root /etc
-l 只显示包含该关键字文件的文件名
#grep -rl root /etc
-c 统计,显示一共有多少行包含该关键字
# grep -c root /etc/passwd
如果一个文件中,包含$这样的字符,如何查找?
#grep ‘\$’ b
善于使用管道符号进行多次筛选
使用命令列出/etc下所有的目录
#ls -l /etc | grep ^d
grep支持的正则元字符:
^ 行首定位符 匹配以tom开头的行 /^tom/
$ 行尾定位符 匹配以tom结尾的行 /tom$/
. 匹配单个字符 匹配to+任意一个字符 /to./
* 匹配0个或多个前面的一个字符 /go*.gle/
[] 匹配一组字符中的一个 /[Tt]om/
[a-z] 表示一个匹配范围
[^] 表示不匹配里面的字符 /[^abc]om/
\ 表示转义 /3\.1/
\< 词首定位符
\> 词尾定位符
x\{m\} x字符重复m次 /\<[A-Za-z]\{5\}\>/
x\{m,\} x字符至少重复m次 /\<[A-Za-z]\{5,}\>/
x\{m,n\} x字符重复的范围 /\<[A-Za-z]\{5,7\}\>
.* 任意0个或多个字符
\(....\) 标签 lovely \(love\)ly \1ly
------------------------------------
wc (word count)
-l: line 计算一共有多少行
-w:word 计算一共有多少单词
-c:character 计算有多少个字符
-------------------------------------
cut 文本列抽取命令
-d:指定分隔符
-f:指定你要抽取的列
-----------------------------------
sort 排序
-n 数字方式
-r 逆序
-t 分隔符
-k 以哪个区间来
--------------------------------------
uniq
-c 进行计数