Linux 是一个多用户分时系统,想要使用系统资源,就必须在系统中有合法的账号,每个账号都有一个唯一的用户名,同时必须设置密码。
Linux 用户和用户组
UID 和 GID
事实上,Linux 系统采用一个 32 位的整数记录和区分不同的用户,这意味着系统可以记录多达40亿个不同的用户。这个用来区分不同用户的数字被称为 User ID ,简称 UID。系统会自动记录“用户名”和“UID” 的对应关系。
Linux 系统中的用户分为3类,即普通用户、根用户、系统用户。
用户登录 | 权限 |
---|---|
普通用户 | 只能在其家目录、系统临时目录或其他经过授权的目录中操作,以及属于该用户的文件,通常普通用户的UID大于500,从500开始编号。 |
根用户 | 即ROOT用户,它的ID是0,也被称为超级用户,拥有对系统的完全控制权。 |
系统用户 | 系统用户指系统运行时必须有的用户,但并不是指真的使用者。比如在RedHat 或 CentOS 下运行网站服务时,需要使用系统用户 Apache 来运行 httpd 进程,而运行 Mysql 数据库服务时,需要使用系统用户 mysql 来运行 mysql 进程。系统用户的ID范围是 1-499。 |
用户组
在Linux系统中除了有用户之外,还有“用户组”的概念,不同的用户组同样也是用数字来区分的,这种用于区分不同用户组的ID被称为Group ID ,也就是GID。
查看ID
id
查看组
groups
配置文件
记录用户和用户的配置文件
新增用户
useradd UserName
对于系统来说,完成这个命令需要在后台执行很多行为。
- 将用户信息记录在 /etc/passwd 中,一般会在 /etc/password 和 /etc/shadow 两个配置文件末尾追加一条记录,同时会分配给该用户一个UID。
- 接着,要为该用户自动创建家目录。家目录以创建的用户名为目录名,创建的路径在/home 目录中。
- 然后,复制 /etc/skel 下所有的文件至 /home/john 。说明一下,如果你使用
ls -l /etc/skel
命令查看,可以发现这个目录下,什么也没有,但事实上,该目录下有很多隐藏文件,用户ls -la /etc/skel
可以查看。
- 最后,新建一个与该用户名一样的用户组,也就是说创建一个用户的同时,也创建了一个与用户名相同的用户组,而用户默认属于这个用户组。
可以说,/etc/skel 实际上是创建用户时的"模板"。
可以在创建用户的时候指定UID和GID
useradd -u UID UserName
useradd -g GroupName UserName
还可以使用-d
参数指定该用户的家目录,而不是使用系统默认的家目录。
useradd -d /home/DirName UserName
设置密码
passwd UserName
更改用户信息
更改家目录
usermod -d NewDir -m UserName
锁定/解锁用户
usermod -L UserName
usermod -U UserName
其实 usermod 命令就是对 /etc/passwd 和 /etc/shadow 文件做一些修改而已。明白了这个道理之后,就算不实用这个命令依然可以手工对用户进行修改操作。
删除用户
userdel UserName
使用这个命令可以删除用户在 /etc/passwd 和 /etc/shadow 中的记录。但是从数据安全方面考虑,默认情况下,删除用户并不会删除用户的家目录和邮件信息。可以使用-r参数删除用户家目录和用户的邮件。
一旦执行了这条命令,该用户的相关文件就会被全部删除。
新增和删除用户组
新增用户组
groupadd GroupName
在Linux中,使用 /etc/group 文件来记录用户组。
删除用户组
groupdel GroupName
这里需要注意的是,如果已有用户属于这个试图删除的组,该操作会失败。
检查用户信息
查看用户
users // 查看当前系统有哪些用户
从截图中发现有多个 ROOT 在当前机器中登录。实际上, Linux会把来自不同终端的活动定义为一个会话,从 who 命令的输出,可以看出 root 用户是通过不同的终端登录到系统中的。users 命令相对比较简单,所以列出的信息也比较少,可以使用命令 who 来看到更多的信息。
命令显示的结果有3列,第一列是登录用户的用户名,第二列是用户登录的终端,第三列是用户登录的时间。如果是通过远程网络登录,则同时会显示远程主机的主机名或IP地址。还可以使用命令 w 看到更详细的信息。
列 | 解释 |
---|---|
1 | 登录用户的用户名 |
2 | 用户登录的终端 |
3 | 如果用户从网络登录,则显示远程主机的主机名或IP地址 |
4 | 用户登录的时间 |
5 | 用户闲置的时间 |
6 | 与终端用户的当前所有运行进程消耗的CPU时间总量 |
7 | 当前WHAT列所对应的进程所消耗的CPU时间总量 |
8 | 用户当前运行的进程 |
调查用户
finger
如果发现没有该命令,需要安装:
yum install finger
切换用户
在使用Linux的过程中,很多时候由于实际需要可能要在不同的用户之间切换。比如原本是使用普通用户登录的,但是在操作的过程中由于权限原因必须使用 root 用户来做一些操作,这时就需要临时切换成 ROOT 用户。操作完成之后,再推出切换成普通用户。涉及到两种方法:su 和 sudo 。
切换成其他用户
su - UserName
如果不加参数,默认切换到 root 用户。完成操作之后,使用 exit 命令可以退出root切换到用来的用户。
su 命令后面还可以加上一个"-" 参数,就是键盘上的中横线。加上这个参数之后,切换成 root 的用户环境。所谓"用户环境"就是 /etc/passwd 中定义的家目录、使用的 Shell,以及关于这个用户的个性化设置等。
su 命令虽然方便,但还是有明显的缺陷,就是切换成其他用户要知道其密码。如果需要切换成 root ,那就要知道 root 的密码。我们知道,root 是系统中权限最高的用户,如果让太多人知道 root 密码,必然是很不安全的。为解决这个问题,我们可以使用 sudo 命令。
用其他用户的身份执行命令
sudo command // 使用 root 身份执行命令
运行该命令的时候,系统首先检查 /etc/sudoers,判断该用户是否有执行 sudo 的权限,在确认有执行权限之后,系统要求用户输入自己的密码,如果密码输入正确,则会使用 root 用户的身份运行 passwd UserName 命令。
使用 visudo 命令来修改 /etc/sudoers 配置文件,它可以自动检查语法。
加入 "username ALL =(ALL)ALL" 这一行代表的意思是,john 这个用户可以从任何地方登陆后执行任何人的任何命令。还可以定义某一组的 sudo 权限,比如 "%username ALL=(ALL)ALL" 可以让所有属于 john 用户组的用户从任何地方登陆后执行任何人的任何命令。
假设用户由于工作需要,经常要重启或者关闭服务器,那么就可以进行如下设置:
username ALL=(ALL) NOPASSWD:/sbin/shutdown,/usr/bin/reboot
严格来说,sudo 并不是真的切换了用户,而是使用其他用户的身份和权限执行了命令。
执行任务管理
日常生活中常会有例行性的事情,比如说每周工作日的闹钟、每年一次的生日提醒等。还有一些事情是偶发性的,比如突然需要处理一封紧急的邮件等。在Linux中也有处理这两种任务的方法。**如果任务是周期性执行的,其命令为 cron;如果只是在某一个特定的时间执行一次,其命令为 at **。
单一时刻执行一次任务
定时关机
第一行是定义从现在开始计算,30分钟后安排一个任务;
第二行是到了时间后执行关机操作;
第三行是<EOT>,这不是键盘输入的,而是使用了组合键 Ctrl+D ,表示输入结束。
第四行是系统提示有一个任务将于该时间执行。
atq // 查看当前使用 at 命令调度的任务列表
也可以使用如下命令删除已经进入任务队列的任务
atrm id
使用 at 还可以安排在具体的时间执行任务
默认情况下,所有用户都可以使用 at 命令来调度自己的任务,如果由于特殊的原因需要禁止某些用户使用这个功能,可以将该用户的用户名添加至 /etc/at.deny 中。
周期性执行任务 cron
首先要确定crond进程在运行,如果没有运行,需要先启动该进程。
该命令的执行环境为 CentOS 7
用户可以使用 crontab 来设置自己的计划任务,并使用-e参数来编辑任务。在这之前需要先了解一下设置的语法,但使用 crontab -e 进入编辑模式时,需要编辑执行的时间和执行的命令。
在下面的示例中,前面5个*
可以用来定义时间:
序号 | 含义 | |
---|---|---|
1 | 分钟 | 1-59 |
2 | 小时 | 0-23 |
3 | 日期 | 1-31 |
4 | 月份 | 1-12 |
5 | 星期几 | 0-6 |
举例
crontab -e
// 以下两种写法其实是一致的,都是每分钟重启 httpd 进程。
* * * * * systemctl restart httpd.services
*/1 * * * * systemctl restart httpd.services
// 每小时重启 httpd 进程
* 23-3/1 * * * systemctl restart httpd.services
// 每天晚上23点30分重启 httpd 进程
30 23 1 * * systemctl restart httpd.services
删除所有的任务
crontab -r
禁止某用户使用该功能
vim /etc/cron.deny
root 可以使用 -u 查看指定用户的任务
crontab -u UserName -l
/etc/crontab 的管理
用户可以通过 crontab -e 命令来编辑定义自己的任务,事实上,系统也有自己的例行任务,而其配置文件是 /etc/crontab 。