1.如果我们想要查找某个目录下以特定字符开头的文件或者目录应该怎么办呢?
答案就是 :通配符
那什么是通配符呢?请看下面
通配符 含义
*号 0个或者多个**任意**字符
?号 任意**一个**字符
[abc] 匹配方括号中的任意**一个**字符
[a-z] 匹配方括号中的a-z之间的任意**一个**字符
[^a-z] 匹配方括号中除了a-z之间的任意**一个**字符
{str1,str2} 匹配花括号中的str1字符串或者str2字符串
案例1.显示/etc目录下,以非字母开头,后面跟了一个字母以及其他任意长度的字符或目录
分析:显示目录-->ls命令 -d选项显示目录
非字母开头-->[^a-z]
一个字母以及其他任意长度的字符-->*
创建空白文件(touch命令) 1abc 1Abc abc1
创建空白目录(mkdir命令)mkdir 2abc 2Abc abc2
[root@iz2zed4h7bg5dihzfqhmn9z ~]$touch 1abc 1Abc abc1
[root@iz2zed4h7bg5dihzfqhmn9z ~]$mkdir /etc/2abc
[root@iz2zed4h7bg5dihzfqhmn9z ~]$mkdir /etc/2Abc
[root@iz2zed4h7bg5dihzfqhmn9z ~]$mkdir /etc/abc2
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ls /etc/[^a-z][a-z]* -ld
-rw-r--r-- 1 root root 0 Dec 12 11:38 /etc/1abc
-rw-r--r-- 1 root root 0 Dec 12 11:29 /etc/1Ads
drwxr-xr-x 2 root root 4096 Dec 12 11:41 /etc/2abc
drwxr-xr-x 2 root root 4096 Dec 12 11:41 /etc/2Abc
#这时可以看见以非字母开头的文件和目录被匹配,其他的则未出现
随之而来的是一个问题,为什么我的方括号中写的是小写的[a-z]怎么第二个字母是大写依然出现了?
那我们试试将第二个字母写成大写看看会发生什么?
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ls /etc/[^a-z][A-Z]* -ld
-rw-r--r-- 1 root root 0 Dec 12 11:29 /etc/1Ads
drwxr-xr-x 2 root root 4096 Dec 12 11:41 /etc/2Abc
可以看到将第二个字符改为大写区间后,便只匹配了大写的文件和目录,这是什么原因呢?
做个试验来看看:
[root@iz2zed4h7bg5dihzfqhmn9z test]$touch A B C D a b c d
[root@iz2zed4h7bg5dihzfqhmn9z test]$ls [a-z]
a A b B c C d D
[root@iz2zed4h7bg5dihzfqhmn9z test]$ls [A-Z]
A b B c C d D
结果发现都会匹配到小写字母。那我只想要匹配小写字母怎么办呢?
答案就是特殊符号
特殊符号 代表意义
[:alnum:] 字母与数字字符
[:alpha:] 字母
[:digit:] 数字
[:lower:] 小写字母
[:upper:] 大写字母
[:space:] 空白字符,包括垂直制表符
[:blank:] 空格或制表符
---------------------------------------------------------------------------- #以上特殊符号为重点
[:punct:] 标点符号字符
[:xdigit:] 十六进制数字
[:ascii:] ASCII字符
[:cntrl:] ASCII控制字符
[:graph:] 非控制、非空格字符
[:print:] 可打印字符
#注意: 上述的特殊符号应该视为一个整体,使用时[ ]方括号中就应该放入上面的整体来进行匹配
那现在就可以试试使用特殊符号来匹配
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ls /etc/[^[:alpha:]][[:lower:]]* -ld #匹配第二个字母小写
-rw-r--r-- 1 root root 0 Dec 12 11:38 /etc/1abc
drwxr-xr-x 2 root root 4096 Dec 12 11:41 /etc/2abc
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ls /etc/[^[:alpha:]][[:upper:]]* -ld #匹配第二个字母大写
-rw-r--r-- 1 root root 0 Dec 12 11:29 /etc/1Ads
drwxr-xr-x 2 root root 4096 Dec 12 11:41 /etc/2Abc
案例2.复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中
分析:以p开头-------->[p]
以非数字结尾-------->[^0-9]$
中间的文件字符为0个或者多个------------>*
[root@locoldomin ~]$ mkdir /tmp/mytest1
[root@locoldomin ~]$ cp -r /etc/[p]*[^0-9] /tmp/mytest1/
案例3.将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out
[root@iz2zed4h7bg5dihzfqhmn9z ~]$cat /etc/issue
\S
Kernel \r on an \m
[root@iz2zed4h7bg5dihzfqhmn9z ~]$cat /etc/issue | tr 'a-z' 'A-Z' >>/tmp/issue.out
[root@iz2zed4h7bg5dihzfqhmn9z ~]$cat /tmp/issue.out
\S
KERNEL \R ON AN \M
2.查找简单的文件我们学会了,接下来想一下Linux的多用户多组应该怎么来进行管理呢?比如说创建删除修改用户和用户组的信息。
关于用户
创建用户命令:useradd [参数] [用户名]
参数 -d 新用户每次登陆时所使用的家目录
-e 用户终止日期,日期的格式为YYYY-MM-DD
-g 指定用户对应的基本组,若为其他组需要时先存在
-G 为用户指明附加组,需要事先存在
-m 用户目录不存在时则自动创建
-r 建立系统帐号
-u 指定用户id
-s 用户登录时使用的shell
-c 用户的注释信息
修改用户属性 usermod命令 [参数]
参数 -u UID: 新UID
-g GID: 新主组
-G<群组> 修改用户所属的附加群组
-d<登入目录> 修改用户登入时的目录
-e<有效期限> 修改账号的有效期限
-l<账号名称> 修改用户账号名称
-L 锁定用户密码,使密码无效
-s<shell> 修改用户登入后所使用的shell
-u<uid> 修改用户ID
-U 解除密码锁定
删除用户 userdel命令 [参数] [用户名]
-f 强制删除用户账号
-r 删除用户主目录及其中的任何文件
关于用户组
创建用户组 groupadd命令 [参数] [组名]
-g 指定新建工作组的id
-r 创建系统工作组,系统工作组的组ID小于500
修改用户组属性 groupmod命令 [参数] [组名]
-g 设置新使用的群组gid
-n 设置新使用的群组名称
删除用户组 groupdel命令 [参数] [组名]
-f, --force 强制删除,即使是用户的主组也强制删除组
更改和查看组成员 groupmems [options] [action]
-g, --group groupname #更改为指定组 (只有root)
-a, --add username #指定用户加入组
-d, --delete username #从组中删除用户
-p, --purge #从组中清除所有成员
-l, --list #显示组成员列表
案例1 创建组distro,其GID为2019
[root@iz2zed4h7bg5dihzfqhmn9z ~]$groupadd -g 2019 distro
案例2 创建用户mandriva,其ID号为1105;基本组为distro
[root@iz2zed4h7bg5dihzfqhmn9z ~]$useradd -u 1105 -g distro mandriva
案例3创建用户mageia,其ID号为1100,家目录为/home/linux
[root@iz2zed4h7bg5dihzfqhmn9z ~]$useradd -u 1100 -g distro mageia -d /home/linux
添加密码命令password [参数] [用户名]
-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提前多少天开始警告
-i inactivedays:非活动期限
--stdin:从标准输入接收用户密码,Ubuntu无此选项
案例4给用户mageia添加密码,密码为mageedu,并设置用户密码7天后过期
[root@iz2zed4h7bg5dihzfqhmn9z ~]$echo "mageedu" | passwd --stdin -x 7 mageia
Adjusting aging data for user mageia.
passwd: Success
案例5.删除mandriva,但保留其家目录
[root@iz2zed4h7bg5dihzfqhmn9z ~]$userdel mandriva
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ls -ld /home/mandriva/
drwx------ 2 1105 distro 4096 Dec 12 13:25 /home/mandriva/
案例5创建用户slackware的默认shell为/bin/tcsh
[root@iz2zed4h7bg5dihzfqhmn9z ~]$useradd -s /bin/tcsh slackware
案例6为用户slackware新增附加组admins,并设置不可登陆
[root@iz2zed4h7bg5dihzfqhmn9z ~]$groupadd admins
[root@iz2zed4h7bg5dihzfqhmn9z ~]$usermod -G admins -s /sbin/nologin slackware
[root@iz2zed4h7bg5dihzfqhmn9z ~]$id slackware
uid=1101(slackware) gid=1101(slackware) groups=1101(slackware),2020(admins)
3.上面已经练习了用户和用户组的概念,那么问题来了,那用户和用户组体现在哪里?有什么用呢?
随便找上一个文件查看详情信息
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ls -l /etc/passwd
-rw-r--r-- 1 root root 2041 Dec 12 13:39 /etc/passwd
可以发现在文件属性当中存在一两个 root root 的字段,那这代表什么?
第一个root 代表文件的属主
第二个root 代表文件的属组
前面也可以看见几个字段: --rw-r--r-- , 1 ,2014
-rw-r--r-- 一共9个字符,第一个代表文件的类型,-是普通文件 后面三个字符为一组分解为rw-,r--,r--
释义:完整的权限是rwx ---->r=可读,w=可写,x=可执行
1:文件的链接数
2014:文件的大小(字节)
所以就可以解释为这个文件的主人是root,主人对它可读可写,这个文件属组是root组,root组的用户对它可读,其他人对这个文件可读。
注意: r:对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录信息的权限。
w:对文件而言,具有新增,修改 文件内容的权限(但不含删除该文件);对目录来说,具有新建,删除,修改,移动目录内文件的权限
x:对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。
案例6.创建用户user1user2user3,在/data/下创建目录test
[root@iz2zed4h7bg5dihzfqhmn9z ~]$useradd user1
[root@iz2zed4h7bg5dihzfqhmn9z ~]$useradd user2
[root@iz2zed4h7bg5dihzfqhmn9z ~]$useradd user3
[root@iz2zed4h7bg5dihzfqhmn9z ~]$mkdir -p /data/test
要求1:目录/data/test属主,属组为user1
修改文件的属性信息 chown命令
OWNER 只修改所有者
OWNER:GROUP 同时修改所有者和属组
:GROUP 只修改属组,冒号也可用 . 替换
--reference=RFILE 参考指定的的属性,来修改
-R 递归,此选项慎用
[root@iz2zed4h7bg5dihzfqhmn9z ~]$chown user1:user1 /data/test/
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ls -ld /data/test/
drwxr-xr-x 2 user1 user1 4096 Dec 12 14:21 /data/test/
要求2:在目录属主,属组不变的情况下,user2对文件有读写权限
分析:属主和属组的情况不变,user2想对/test目录有读写权限两种方法。
方法一:将user2添加进user1组中,并且修改/test的属组权限为rw-,或者直接修改目录的其他人权限为rw-即可(但是将其他人的权限设置为rw-后,不光是user2用户可以读写,其他的用户也可以读写,安全性不好)。
[root@iz2zed4h7bg5dihzfqhmn9z ~]$id user1
uid=1102(user1) gid=1102(user1) groups=1102(user1)
[root@iz2zed4h7bg5dihzfqhmn9z ~]$usermod -G user1 user2
[root@iz2zed4h7bg5dihzfqhmn9z ~]$id user2
uid=1103(user2) gid=1103(user2) groups=1103(user2),1102(user1)
[root@iz2zed4h7bg5dihzfqhmn9z ~]$chmod 775 /data/test/
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ll -d /data/test/
drwxrwxr-x 2 user1 user1 4096 Dec 12 14:21 /data/test/
[root@iz2zed4h7bg5dihzfqhmn9z ~]$su - user2
Last login: Sat Dec 12 15:21:53 CST 2020 on pts/0
[user2@iz2zed4h7bg5dihzfqhmn9z ~]$ cd /data/test/
[user2@iz2zed4h7bg5dihzfqhmn9z test]$ touch a
[user2@iz2zed4h7bg5dihzfqhmn9z test]$ ls
a
方法二:若是不允许修改/test目录的执行权限,一个更加灵活的权限分配方案可供使用——ACL权限
setfacl 可以设置ACL权限
getfacl 可查看设置的ACL权限
setfacl [参数] [文件]
-m --modify-acl 更改文件的访问控制列表
-x --remove=acl 根据文件中访问控制列表移除条目
-X --remove-file=file 从文件读取访问控制列表条目并删除
-b --remove-all 删除所有扩展访问控制列表条目
-R --recursive 递归操作子目录
-k --remove-default 移除默认访问控制列表
[root@iz2zed4h7bg5dihzfqhmn9z ~]$setfacl -m u:user2:rwx /data/test/ #争对与目录来说执行权限很重要,没有执行权限无法进入目录。
[user2@iz2zed4h7bg5dihzfqhmn9z ~]$ getfacl /data/test/
getfacl: Removing leading '/' from absolute path names
# file: data/test/
# owner: user1
# group: user1
user::rwx
user:user2:rwx
group::r-x
mask::rwx
other::r-x
[user2@iz2zed4h7bg5dihzfqhmn9z ~]$ touch /data/test/aa
[user2@iz2zed4h7bg5dihzfqhmn9z ~]$ ls /data/test/
a aa
要求3:user1在/data/test目录下创建文件a1.sh-a4.sh,设置所有用户都不可删除1-2sh,除了user1和root之外,所有用户都不可删除3-4sh
[root@iz2zed4h7bg5dihzfqhmn9z test]$su - user1
[user1@iz2zed4h7bg5dihzfqhmn9z ~]$ cd /data/test/
[user1@iz2zed4h7bg5dihzfqhmn9z test]$ touch a{1..4}.sh
[user1@iz2zed4h7bg5dihzfqhmn9z test]$ ls
a1.sh a2.sh a3.sh a4.sh
[user1@iz2zed4h7bg5dihzfqhmn9z test]$ ll
total 0
-rw-rw-r-- 1 user1 user1 0 Dec 12 15:55 a1.sh
-rw-rw-r-- 1 user1 user1 0 Dec 12 15:55 a2.sh
-rw-rw-r-- 1 user1 user1 0 Dec 12 15:55 a3.sh
-rw-rw-r-- 1 user1 user1 0 Dec 12 15:55 a4.sh
分析:所有用户都不可以删除,将权限设置为---------可以吗?
[user1@iz2zed4h7bg5dihzfqhmn9z ~]$ chmod 000 a1.sh
[user1@iz2zed4h7bg5dihzfqhmn9z ~]$ ll /data/test/a1.sh
---------- 1 user1 user1 0 Dec 12 15:55 /data/test/a1.sh
[user1@iz2zed4h7bg5dihzfqhmn9z ~]$ rm /data/test/a1.sh
rm: remove write-protected regular empty file ‘/data/test/a1.sh’? y
[user1@iz2zed4h7bg5dihzfqhmn9z ~]$ ls /data/test/
a2.sh a3.sh a4.sh
a1.sh 依然被删除了。看来只有另寻他法。
此时,特殊属性出现了
设置文件的特殊属性,可以防止 root 用户误操作删除或修改文件
不能删除,改名,更改 chattr +i
只能追加内容,不能删除,改名 chattr +a
显示特定属性 lsattr
#重新建立文件a1.sh
[user1@iz2zed4h7bg5dihzfqhmn9z ~]$ touch /data/test/a1.sh
[user1@iz2zed4h7bg5dihzfqhmn9z ~]$ ll /data/test/
total 0
-rw-rw-r-- 1 user1 user1 0 Dec 12 16:06 a1.sh
-rw-rw-r-- 1 user1 user1 0 Dec 12 15:55 a2.sh
-rw-rw-r-- 1 user1 user1 0 Dec 12 15:55 a3.sh
-rw-rw-r-- 1 user1 user1 0 Dec 12 15:55 a4.sh
[root@iz2zed4h7bg5dihzfqhmn9z test]$chattr +i /data/test/a1.sh
[root@iz2zed4h7bg5dihzfqhmn9z test]$chattr +i /data/test/a2.sh
[root@iz2zed4h7bg5dihzfqhmn9z test]$rm -rf /data/test/a1.sh
rm: cannot remove ‘/data/test/a1.sh’: Operation not permitted
只有user1和root用户可以删除3和4文件,这事可以使用特殊权限位
特殊权限SUID
前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
用法: chmod u+s FILE...
chmod u-s FILE...
特殊权限SGID
二进制的可执行文件上SGID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属组为原程序文件的属组
用法 chmod g+s FILE...
chmod g-s FILE...
特殊权限 Sticky 位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
用法: chmod o+t DIR...
chmod o-t DIR...
争对目录设置
[root@iz2zed4h7bg5dihzfqhmn9z test]$chmod o+t /data/test/
[root@iz2zed4h7bg5dihzfqhmn9z test]$su - user2
[user2@iz2zed4h7bg5dihzfqhmn9z test]$ rm a3.sh
rm: remove write-protected regular empty file ‘a3.sh’? y
rm: cannot remove ‘a3.sh’: Operation not permitted
要求4:user3增加附加组user1,同时要求user1不能访问/data/test/目录及其下所有文件
[root@iz2zed4h7bg5dihzfqhmn9z ~]$groupmems -a user3 -g user1
[root@iz2zed4h7bg5dihzfqhmn9z ~]$id user3
uid=1104(user3) gid=1104(user3) groups=1104(user3),1102(user1)
上面已经进行了属主和属组的权限修改。这里就不再继续更改权限使user1不能访问/data/test/目录及其下所有文件
[root@iz2zed4h7bg5dihzfqhmn9z ~]$ll /data/test -d
drwxr-xr-t 2 user1 user1 4096 Dec 12 16:33 /data/test
要求5:清理/data/test目录及其下所有文件的acl权限
[user1@iz2zed4h7bg5dihzfqhmn9z test]$ setfacl -bR /data/test
思考:案例1中为什么[A-Z]中没有匹配出小写字母a呢?
原因是因为我们看到的字符文字和数字都是通过编码表转换过来的,不同语系的编码不尽相同,所以就会造成数据的选举结果不同。举例来说
LANG=C时: 0 1 2 3 4 ....A B C D....Z a b c d ...z
LANG=zh_CN 时 0 1 2 3 4 ....a A b B c C .... z Z
这样就解释了为什么前面ls [ A - Z ] 为什没有小a了,因为匹配是从A开始的,小a在A的前面,所以就没有匹配出。