【Linux系统】常用命令:群组用户以及文件权限管理、查找文件、Linux的软件仓库
现如今各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,对于一个开发人员来说,Linux的学习是必不可少的,对于简单操作Linux系统更是必备的技能,对于Linux系统的重要性在这里不多赘述。于是我在学习过程中,整理了一系列Linux常用命令,文章内容收集整理于网络,相关代码都是经过自己实现验证的,众所周知,Linux系统的相关命令是数不胜数的,学完以至于完全记住是很难的,在这里只是整理一部分常用、实用、后端开发人员必备的命令,当然,个人感觉这些命令不需要刻意去记忆,而是在反复的使用过程中达到孰能生巧的,所以本系列文章目的主要用于方便自己后期的查阅与复习,希望可以帮助到你!
前面主要学习了Linux系统学习的前置知识与基础操作命令、文件目录相关命令。详情查阅:【Linux系统】常用命令:基础操作、文件目录 - 编程那点事儿 (imyjs.cn)
大家都知道Linux
是一个多任务、多用户的操作系统。多个用户可以在同一时间去操作系统执行不同的任务,一个用户也能以多个人登陆操作。
下面学习Linux系统中群组、用户相关命令以及文件权限管理、查找文件、Linux的软件仓库的相关知识。
前置知识
1.Linux角色分类
超级用户:root (user id --UID) 0 最高的管理权限。
普通用户:
系统用户 UID:1-999(rhel7 centos7) 1-499(rhel6)
本地用户 UID:1000+(rhel7 centos7) 500+(rhel6)
UID:用户身份标示,唯一标示。
2.Linux组分类
组分类:
根据账号的功能分类:
超级用户组:root GID:0
普通用户组 :
系统用户组: GID 1---999
本地用户组: GID 1000+
3.Linux用户和组的关系
一个用户属于一个组,也可以属于多个组,多个用户可以在一个组,可以在多个组
。
4.Linux用户和组的相关配置文件
- 1.
/etc/passwd
:用户 and 属性信息。 - 2.
/etc/group
: 组 and 属性信息。 - 3.
/etc/shadow
: 用户密码 and 属性信息。 - 4.
/etc/gshadow
:组密码 and 属性信息。 - 5.
/etc/default/useradd
: 设置添加用户规则文件。 - 6.
/etc/login.defs
:设置用户账号限制。
5.Linux用户信息文件
用户管理中最重要的一个文件,这个文件是对所有用户开放的,每一行存一个用户的信息,每个属性之间用冒号分割。
[zhangsan@localhost ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
# ...... 省略更多
举例:root:x:0:0:root:/root:/bin/bash
1.登陆用户名:root
2.用户密码占位符:x
3.用户UID:0
4.用户组GID:0
5.对用户账户的描述:root
6.用户家目录位置:/root
7.用户默认的shell:/bin/zsh (默认是/bin/bash)
6.Linux密码信息文件
该文件只有root用户有读权限,每一行存一个用户的记录,每个属性用冒号分割。
[zhangsan@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[zhangsan@localhost ~]$ su root
密码:
[root@localhost zhangsan]# cat /etc/shadow
root:$6$vk03IDpnK2kwXu9A$dhrU/cSaMxO5n72nVdc8CrrjQ4jXJ5MgCGN7Csm/w3KT0xWjRUeG5LfwRhgHNn0y7iiE1zqwpbu6Bv2dp81dt0::0:99999:7:::
bin:*:18353:0:99999:7:::
# ...... 省略更多
举例:bin:*:18353:0:99999:7:::
1.登录用户名: bin
2.加密的密码: * 号代表密码被锁定
3.最近更改密码的日期: 18353代表到1970-1-1密码不可改的天数
4.密码修改期限:99999 代表永远不用改,如果是其他数字则表示从1970-1-1内的多少天必须修改密码。
5.更改密码最大有效天数: 代表密码保持有效的最大天数。
6.密码过期警告:密码到正式失效前有多少天(-1,永远不提示)
7.密码过期后多少天禁用用户:可登陆,单不能操作。
8.用户被禁用日期:多少天后账号过期,不能登陆。
9.保留参数
7.Linux组信息文件
用户组的组信息存放在这,一行存一个组记录,属性用冒号分割。
[root@localhost zhangsan]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
# ...... 省略更多
举例:root:x:0:
1.组名:root
2.组密码占位符: x
3.组GID: 0
用户相关命令
在
Linux
中,理论上来说,我们可以创建无数个用户,但是这些用户是被划分到不同的群组里面的,有一个用户,名叫root
,是一个很特殊的用户,它是超级用户,拥有最高权限。自己创建的用户是有限权限的用户,这样大大提高了 Linux系统的安全性,有效防止误操作或是病毒攻击,但是我们执行的某些命令需要更高权限时可以使用
sudo
命令。
sudo
以 root
身份运行命令
[zhangsan@localhost ~]$ sudo date
[sudo] zhangsan 的密码:
zhangsan 不在 sudoers 文件中。此事将被报告。
[zhangsan@localhost ~]$
提示:
zhangsan 不在 sudoers 文件中。此事将被报告。
原因:
当前用户不在sudo 用户组,需要先加入此用户组
解决:
su root
# 先切换到 root 用户- 添加内容后保存文件即可。
vi /etc/sudoers
账户名 ALL=(ALL:ALL) ALL
wq!
进行保存
useradd + passwd
useradd
添加新用户常用参数:
-m
:自动建立用户家目录(在CentOS下不指定默认也会自动创建)-g
:指定用户所在的组,否则会建立一个和同名的组passwd
修改用户密码如果是普通用户,直接用passwd可以修改自己的账户密码
这两个命令需要 root
用户权限
useradd lisi--> 添加一个lisi用户,添加完之后在 /home 路径下可以查看
passwd lisi--> 修改lisi用户的密码
[zhangsan@localhost etc]$ useradd lisi
useradd: Permission denied.
useradd:无法锁定 /etc/passwd,请稍后再试。
[zhangsan@localhost etc]$ sudo useradd lisi
[zhangsan@localhost etc]$ passwd lisi
passwd:只有根用户才能指定用户名。
[zhangsan@localhost etc]$ sudo passwd lisi
更改用户 lisi 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[zhangsan@localhost etc]$
- 创建用户时,默认会创建—个和用户名同名的组名。
- 用户信息保存在/etc/passwd文件中
注意:在修改密码时,如果密码组成规则不符合系统规定时,比如密码少于 8 个字符等,此时继续输入也可以使用!
cat /etc/passwd --> 确认用户信息
[root@localhost home]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...... # 省略其他用户信息
zhangsan:x:1000:1000::/home/zhangsan:/bin/bash # 创建的zhangsan用户
[root@localhost home]#
userdel
删除用户,需要 root
用户权限
-r
选项会自动删除用户家目录
userdel lisi
--> 只会删除用户名,不会从/home中删除对应文件夹userdel lisi -r
--> 会同时删除/home下的对应文件夹
[zhangsan@localhost home]$ pwd
/home
[zhangsan@localhost home]$ ls
lisi zhangsan
[zhangsan@localhost home]$ sudo userdel lisi -r
[sudo] zhangsan 的密码:
[zhangsan@localhost home]$ ls
zhangsan
[zhangsan@localhost home]$
usermod
用于修改用户的账户。
【常用参数】
-l
对用户重命名。需要注意的是/home
中的用户家目录的名字不会改变,需要手动修改。-g
修改用户所在的群组,例如usermod -g dev lisi
修改lisi
用户的群组为dev
。-G
一次性让用户添加多个群组,例如usermod -G friends,foo,bar lion
。-a
-G
会让你离开原先的群组,如果你不想这样做的话,就得再添加-a
参数,意味着append
追加的意思。
su
切换用户,需要 root
用户权限
su zhangsan
--> 切换为普通用户
su -
--> 切换为root用户
sudo su
--> 切换为root用户(exit 命令或 CTRL + D 快捷键都可以使普通用户切换为 root 用户)
[zhangsan@localhost ~]$ exit
[root@localhost zhangsan]# exit
[zhangsan@localhost ~]$ 登出 # 连续两次 CTRL + D 退出
su不接用户名,可以切换到root ,但是不推荐使用,因为不安全。
群组相关命令
Linux 中每个用户都属于一个特定的群组,如果你不设置用户的群组,默认会创建一个和它的用户名一样的群组,并且把用户划归到这个群组。
groupadd
创建群组,用法和 useradd
类似。
groupadd dev
[root@localhost ~]# groupadd dev
[root@localhost ~]# cat /etc/group # 查看系统所有用户组
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
..... # 省略其他用户组信息
dev:x:1000: # 新建的用户组dev
[root@localhost ~]#
groupdel
删除一个已存在的群组
groupdel dev
[root@localhost ~]# groupdel ddd 不可以删除不存在的用户组
groupdel:“ddd”组不存在
[root@localhost ~]# groupdel dev 删除dev用户组
[root@localhost ~]# cat /etc/group 查看系统所有用户组
.... # 省略其他用户组信息
[root@localhost ~]#
groups
查看用户所在群组
[zhangsan@localhost home]$ groups zhangsan --> 查看 zhangsan 用户所在的群组
zhangsan : zhangsan
[zhangsan@localhost home]$
chgrp
用于修改文件的群组。
chgrp bar file.txt --> file.txt文件的群组修改为bar
chown
改变文件的所有者,需要 root
身份才能运行。
chown lion file.txt --> 把其它用户创建的file.txt转让给lion用户
chown lion:bar file.txt --> 把file.txt的用户改为lion,群组改为bar
【常用参数】
-R
递归设置子目录和子文件,chown -R lion:lion /home/frank
把frank
文件夹的用户和群组都改为lion
。
文件权限管理
chmod
修改访问权限。
chmod 740 file.txt
【常用参数】
-R
可以递归地修改文件访问权限,例如chmod -R 777 /home/lion
修改权限的确简单,但是理解其深层次的意义才是更加重要的。下面我们来系统的学习 Linux
的文件权限。
[zhangsan@localhost ~]$ ls -l
总用量 0
-rw-rw-r--. 1 zhangsan zhangsan 0 5月 12 14:02 aa.txt
drwxrwxr-x. 2 zhangsan zhangsan 6 5月 12 14:02 bb
[zhangsan@localhost ~]$
其中 drwxrwxr-x
表示文件或目录的权限。让我们一起来解读它具体代表什么?
d
:表示目录,就是说这是一个目录,普通文件是-
,链接是l
。r
:read
表示文件可读。w
:write
表示文件可写,一般有写的权限,就有删除的权限。x
:execute
表示文件可执行。-
:表示没有相应权限。
权限的整体是按用户来划分的,如下所示:
d | rwx | rwx | r-x |
---|---|---|---|
文件属性 | 文件所有者 | 群组用户 | 其他用户 |
现在再来理解这句权限 drwxrwxr-x
的意思:
- 它是一个文件夹;
- 它的所有者具有:读、写、执行权限;
- 它的群组用户具有:读、写、执行权限;
- 它的其它用户具有:读、执行的权限,没有写的权限。
现在理解了权限,我们使用 chmod
来尝试修改权限。 chmod
它不需要是 root
用户就能运行的,只要你是此文件所有者,就可以用 chmod
来修改文件的访问权限。
数字分配权限
权限 | 数字 |
---|---|
r | 4 |
w | 2 |
x | 1 |
因此要改变权限,只要做一些简单的加法就行:
[zhangsan@localhost ~]$ chmod 744 aa.txt
[zhangsan@localhost ~]$ ls -l
总用量 0
-rwxr--r--. 1 zhangsan zhangsan 0 5月 12 14:02 aa.txt
drwxrwxr-x. 2 zhangsan zhangsan 6 5月 12 14:02 bb
7 = 4 + 2 + 1 :文件所有者拥有读、写、执行权限;
4 = 4 + 0 + 0 :群组用户只拥有读权限;
4 = 4 + 0 + 0 :其他用户只拥有读权限;
用字母来分配权限
u
:user
的缩写,用户的意思,表示所有者。g
:group
的缩写,群组的意思,表示群组用户。o
:other
的缩写,其它的意思,表示其它用户。a
:all
的缩写,所有的意思,表示所有用户。+
:加号,表示添加权限。-
:减号,表示去除权限。=
:等于号,表示分配权限。
chmod u+rx file --> 文件file的所有者增加读和运行的权限
chmod g+r file --> 文件file的群组用户增加读的权限
chmod o-r file --> 文件file的其它用户移除读的权限
chmod g+r o-r file --> 文件file的群组用户增加读的权限,其它用户移除读的权限
chmod go-r file --> 文件file的群组和其他用户移除读的权限
chmod +x file --> 文件file的所有用户增加运行的权限
chmod u=rwx,g=r,o=- file --> 文件file的所有者分配读写和执行的权限,群组其它用户分配读的权限,其他用户没有任何权限
查找文件
概览
which
: 查看执行文件的位置。whereis
: 查看可执行文件位置和相关文件。locate
: 配合数据库缓存,快速查看文件的位置。grep
: 过滤匹配,他是一个文件搜索工具。find
: 可以根据条件查看文件。
which
语法: which 参数 查询目标
常用命令:一般不加参数使用
--all, -a
显示所有的匹配路径
总的来说一个命令就是一个可执行程序。
[root@localhost ~]# pwd
/root
[root@localhost ~]# which python
/usr/bin/python
whereis
语法: whereis 参数 查询目标
常用参数:
一般不加参数使用
-b
只搜索二进制文件-B
<目录> 定义二进制文件查找路径-m
只搜索 man 手册-M
<目录> 定义 man 手册查找路径-s
只搜索源代码-S
<目录> 定义源代码查找路径
操作:
[zhangsan@localhost ~]$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
[zhangsan@localhost ~]$
locate
搜索包含关键字的所有文件和目录。后接需要查找的文件名,也可以用正则表达式。
locate和find命令功能差不多,但是搜索效率更高,因为locate查的是数据库而find查找的是目录文件。
[zhangsan@localhost ~]$ locate aa.txt
bash: locate: 未找到命令
[zhangsan@localhost ~]$ yum -y install mlocate
已加载插件:fastestmirror
您需要 root 权限执行此命令。
[zhangsan@localhost ~]$ sudo yum -y install mlocate
[sudo] zhangsan 的密码:
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
..... # 省略安装过程
安装 locate:yum -y install mlocate
[zhangsan@localhost ~]$ locate aa.txt
locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录
[zhangsan@localhost ~]$ updatedb
updatedb: 无法为 `/var/lib/mlocate/mlocate.db' 打开临时文件
[zhangsan@localhost ~]$ sudo updatedb
[zhangsan@localhost ~]$ locate aa.txt
/home/zhangsan/aa.txt
[zhangsan@localhost ~]$
[注意]
locate
命令会去文件数据库中查找命令,而不是全磁盘查找,因此刚创建的文件并不会更新到数据库中,所以无法被查找到,可以执行updatedb
命令去更新数据库。即安装mlocate
后需要使用updatedb
命令更新数据库!注意需要使用root身份!
grep
语法:grep 参数 目标值 文件
常用参数:
-v
取反-i
忽略大小写^*
以*开头*$
以*结尾^$
空行
操作:
查 /etc/passwd有root的行
[zhangsan@localhost ~]$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[zhangsan@localhost ~]$
查 /etc/passwd 没有root的行
[zhangsan@localhost ~]$ grep -v root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
....... # 内容较多,仅展示几行
查 /etc/passwd 有root的行并显示行号
[zhangsan@localhost ~]$ grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[zhangsan@localhost ~]$
find
用于查找文件,它会去遍历你的实际硬盘进行查找,而且它允许我们对每个找到的文件进行后续操作,功能非常强大。
find <何处> <何物> <做什么>
- 何处:指定在哪个目录查找,此目录的所有子目录也会被查找。
- 何物:查找什么,可以根据文件的名字来查找,也可以根据其大小来查找,还可以根据其最近访问时间来查找。
- 做什么:找到文件后,可以进行后续处理,如果不指定这个参数,
find
命令只会显示找到的文件。
语法:find 路径 参数 操作
常用参数:
路径
: 例如用 . 来表示当前目录,用 / 来表示系统根目录-print
:显示的时候”\n”做为定界符, 换行-print0
:与xargs配套使用,以“\0”做为定界符
常用命令选项:
-name
按照文件名查找文件。“名称”-perm
按照文件权限来查找文件。666 777 等-depth
在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找-user
按照文件属主来查找文件-atime
-ctime (单位是天)-mmin -cmin -amin
(单位是分钟)-size n [c]
查找文件长度为n块的文件,带有c时表示文件长度以字节计-follow
如果find命令遇到符号链接文件,就跟踪至链接所指向的文件
根据文件名查找
find -name "file.txt" --> 当前目录以及子目录下通过名称查找文件
find . -name "syslog" --> 当前目录以及子目录下通过名称查找文件
find / -name "syslog" --> 整个硬盘下查找syslog
find /var/log -name "syslog" --> 在指定的目录/var/log下查找syslog文件
find /var/log -name "syslog*" --> 查找syslog1、syslog2 ... 等文件,通配符表示所有
find /var/log -name "*syslog*" --> 查找包含syslog的文件
[zhangsan@localhost ~]$ tree
.
├── aa.txt
└── bb
├── aa.txt
└── cc
└── dd
├── aa.txt
├── ss.txt
└── zz
└── zz.txt
4 directories, 5 files
[zhangsan@localhost ~]$ find -name aa.txt
./aa.txt
./bb/aa.txt
./bb/cc/dd/aa.txt
[zhangsan@localhost ~]$
[注意]
find
命令只会查找完全符合 “何物” 字符串的文件,而locate
会查找所有包含关键字的文件。
根据文件大小查找
find /var -size +10M --> /var 目录下查找文件大小超过 10M 的文件
find /var -size -50k --> /var 目录下查找文件大小小于 50k 的文件
find /var -size +1G --> /var 目录下查找文件大小超过 1G 的文件
find /var -size 1M --> /var 目录下查找文件大小等于 1M 的文件
根据文件最近访问时间查找
find -name "*.txt" -atime -7 --> 近 7天内访问过的.txt结尾的文件
仅查找目录或文件
find . -name "file" -type f --> 只查找当前目录下的file文件
find . -name "file" -type d --> 只查找当前目录下的file目录
操作查找结果
find -name "*.txt" -printf "%p - %u\n" --> 找出所有后缀为txt的文件,并按照 %p - %u\n 格式打印,其中%p=文件名,%u=文件所有者
find -name "*.jpg" -delete --> 删除当前目录以及子目录下所有.jpg为后缀的文件,不会有删除提示,因此要慎用
find -name "*.c" -exec chmod 600 {} \; --> 对每个.c结尾的文件,都进行 -exec 参数指定的操作,{} 会被查找到的文件替代,\; 是必须的结尾
find -name "*.c" -ok chmod 600 {} \; --> 和上面的功能一直,会多一个确认提示
软件仓库
Linux下软件是以包的形式存在,一个软件包其实就是软件的所有文件的压缩包,是二进制的形式,包含了安装软件的所有指令。 Red Hat
家族的软件包后缀名一般为 .rpm
, Debian
家族的软件包后缀是 .deb
。
Linux的包都存在一个仓库,叫做软件仓库,它可以使用 yum
来管理软件包, yum
是 CentOS
中默认的包管理工具,适用于 Red Hat
一族。可以理解成 Node.js
的 npm
。
yum 常用命令
yum update | yum upgrade
更新软件包yum search xxx
搜索相应的软件包yum install xxx
安装软件包yum remove xxx
删除软件包
切换 CentOS 软件源
有时候 CentOS
默认的 yum
源不一定是国内镜像,导致 yum
在线安装及更新速度不是很理想。这时候需要将 yum
源设置为国内镜像站点。国内主要开源的镜像站点是网易和阿里云。
1、首先备份系统自带 yum
源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2、下载阿里云的 yum
源配置文件到 /etc/yum.repos.d/CentOS7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3、生成缓存
yum makecache