Linux必备知识(五)

用户管理

查看本机的用户,有些人查看/home目录,一般用户都将主目录放在/home下

ls -l /home

更准确的方法当然是查看 /etc/passwd文件

cat /etc/passwd

我们可以通过wc统计出用户数量

cat /etc/passwd | wc -l

或查看具体的用户

cat /etc/passwd | grep chen

新建用户:

sudo useradd foxmulder

查看 /etc/passwd,能看到已创建了用户foxmulder,uid是1001

/etc/passwd中有很多用户,很多uid远低于1000,一般是赋于系统用户;而人类使用的交互用户,一般uid为1000及以上。

前面创建了用户formulder,我们查下 /home目录下有没有建立相应的主目录

ls -l /home

没有formulder文件夹!

这取决于各发行版,有些发行版可能会默认建立了主目录,而我使用的ubuntu20.04没有。

cat /etc/default/useradd

这是默认添加用户的配置文件,可以看到默认的shell、用户主目录等配置信息。我们当然可以修改这个配置,但一般的建议是添加用户时明确指定,不依赖于该默认配置文件。这样更方便编写脚本,移植命令到其他发行版。

我们重建一个原先的用户,先删除,然后明确定义参数添加用户主目录

sudo userdel formulder

这里删除用户不会删除主目录的。之前我们未建主目录,不用费事再去删除。然后,再建用户

sudo useradd -m formulder

加了 -m 参数后就建立了用户主目录,可以去主目录里查看确认。

ls -l /home

如果想删除用户时,同时删除主目录,可以加 -r 参数

sudo userdel -r formulder

会提示mail pool找不到之类,忽略掉就好,查看用户目录已同时被删除了。

更改密码:

passwd

不带任何参数表示对当前用户的密码更改

sudo passwd formulder

表示修改formulder的密码

创建系统用户:

系统用户对于自动化执行某些操作很有用的,来看看如何创建。

sudo useradd -r sysuser

添加 -r 参数即可创建系统用户,查看passwd文件发现它的uid是小于1000的。普通用户是1000及以上的UID,而系统用户的UID则是小于1000。

cat /etc/passwd | grep sysuser

可以通过man useradd 查看更多用法。

现在来看看 /etc/passwd的格式,用 :隔开各列

第一列:用户名

第二列:密码,一般总是x,表示有一个散列密码

第三列:uid,用户ID

第四列:gid, 组的ID

第五列:可选的用户信息,可以有多段

第六列:用户主目录

第七列:用户shell。用户也可以通过 echo $SHELL查询。很多系统用户使用是 /usr/sbin/nologin,表示不能登录,对于系统用户来说非常合适。

再看看/etc/shadow文件:

sudo cat /etc/shadow

可以看到有很多列:

第一列:用户

第二列:密码的散列值

第三列:最后修改日期,以从1970年1月1日起的天数形式

第四列:多少天后才能修改密码,0 表示随时能改。

第五列:必须更改密码的日期,以从1970年1月1日起的天数形式, 比如99999基本表示不用更改。

第六列:更改密码前几天提醒。比如7

第七列:用户锁定还剩的天数,通常为空

第八列:账户多少天后失效,通常为空

这些列我们其实不用太在意记住。

前面章节有谈过的sudo chage -l 命令可以检查。


组的管理

首先一点,所有文件都属于用户和用户组。我们可以在用户主目录下运行,查看所属的用户和组,主目录的文件都属于该用户。

ls -la

组可以简化管理,管理员可不想逐个给100个用户分配文件权限,更合理的是将这些用户加入组,再给组分配权限。

我们来查看自己属于哪个组,直接用不带参数的groups命令即可

groups

如果想查看用户kelemi属于哪个组,则加上用户名

groups kelemi

当用户被创建时,同时也创建了一个与用户同名的组,用户隶属于该同名组。

与用户一样,组也有一个文件来保存:/etc/group

第1列,组名

第2列,组密码,任何时候都是X

第3列,组的ID即GID,与用户UID一样,也是唯一的。

第4列,该组的成员,很多行这一列是空的,表示该组没有组成员。

添加删除组命令

sudo groupadd gamers

sudo groupdel gamers

有三种组的类型:主要组、辅助组、AKA次要组。

在/etc/passwd里指定的组ID是主要组。

主要组与辅助组有什么区别呢?其实没区别!

我们查看 /etc/group文件,是没有指定组类型的字段的,说明任何组都可以是主要组,任何组也都可以是辅助组。如果组分配给用户是主要组,他就是主要组,分配给用户辅助组,他就是辅助组。组的类型不在于创建,则在于分配

一个用户只允许有一个主要组,但可以有多个辅助组。

我们来看看如何将用户加入组

sudo groupadd linux-admins

sudo usermod -aG linux-admins kelemi

上面命令,创建了一个组linux-admins,然后用usermod命令将kelemi加入了该组。usermod不特用于组的添加,只是其中有修改组的选项。参数 -a 表示添加,大写的G 表示加入辅助组。

如果想让kelemi的主要组变成 linux-admins,则需要用小写的g选项,当然一般不建议这么做,更改主组后还需做他工作。

sudo usermod -g linux-admins kelemi

修改了用户的组之后,需要注销再登录才能生效。

假设当前用户是kelemi,现在加入辅助组chen

sudo usermod -aG chen kelemi

我们检查组成员,能看到 chen

groups kelemi

但如果不加用户名kelemi,仅仅输入 groups,则表示当前会话的用户组,将不会显示chen。重新登录后才会有。

修改用户的组也可以用gpasswd命令,与usermod类似,这两个命令都可以完成组成员配置的工作,主要看个人习惯

sudo gpasswd -a kelemi linux-admins

我们来看一个实际场景:

我们要仅允许白名单内的用户登录ssh,而不是所有人,所以我们要先在 /etc/ssh/sshd_config文件里添加一行

AllowUsers chen kelemi xiaomi

添加后,还需重启ssh服务,这样就限制了ssh登录的用户。

但后续如果还有用户需要登录ssh,比如陆续有100个用户的话,我们要做同样的事情,而且每次还得重启ssh服务,显然很麻烦。使用用户组则可以解决问题!

我们修改/etc/ssh/sshd_config的这行

AllowGroups ssh-users

之后有新用户要使用ssh的话,只需加入ssh-users组即可,无需重启修改ssh配置文件以及重启服务。

最后我们看看如何删除组中的成员。使用gpasswd命令完成。

sudo groupadd testgroup

sudo usermod -aG testgroup kelemi

sudo gpasswd -d kelemi testgroup


格式化和挂载存储卷

给Linux服务器添加额外的存储很常见,我们来看看如何做。

lsblk

这个命令能查看到挂载情况。在linux桌面系统中,我们插入U盘等外部存储介质,一般能自动识别并挂载好。然后就能查看到。

lsblk不是唯一能查看linux存储情况的命令。我们也可使用 fdisk

sudo fdisk -l

查看挂载的命令是mount,也可以筛选出 sdb

mount

mount | grep sdb

卸载:

sudo umount /media/kelemi/disk

# 假设原挂载在 /media/kelemi/disk上。

再运行 lsblk,看到相关设备挂载点已没有了。也可以用 mount | grep sdb类似的命令确认下挂载情况。

下面将一个外部存储重新划分,并重新挂载。

sudo fdisk /dev/sdb

选择 p,查看分区,原已有一个。

选择 g,划分为gpt分区。现在一般都建议用gpt可以支持更大的磁盘,mbr基本属淘汰技术。

再选p,发现分区尚未划分。

n,创建新分区,默认分区号保持为1。起始扇区也保持默认。设置结束扇区或直接按回车键分配全部空间。

分区完毕后还是不能用,我们需要格式化。

sudo mkfs.ext4 /dev/sdb1

如果需要格式化在windows中能识别的格式,如fat,则输入格式化命令

sudo mkfs.exfat /dev/sdb1

一般linux发行版没有这个命令,需要安装下

sudo apt install exfat-utils exfat-fuse

sudo dnf install exfat-fuse exfat-utils (centos、fedora系列)

重新插拨下,我们再来看下卷情况。

lsblk
可以看到会随机分配一个卷标,我们在上一步的mkfs中指定卷标

sudo mkfs.exfat -n “label” /dev/sdb1

对于卷挂载的查询,下面这个命令是重要的

df -h

可以查到所有挂载的文件系统。

可以卸载挂载的目录。

sudo umount /media/kelemi/label

可以将设备挂载在任何文件夹,但一般建议是在 /mnt或/media文件夹下。

/media一般用于临时挂载,比如U盘,移动硬盘临时挂载,拷贝文件或备份。

/mnt 则一般用于永久挂载,比如给服务器添加第二块硬盘。

手动挂载

sudo mount /dev/sdb1 /mnt/disk1/     (/mnt/disk1目录事先要建好)

要查询服务器各目录占用空间,需要用到ncdu工具,默认是不安装的,需要手动安装。

which ncdu 默认是没安装的

sudo apt install ncdu

或者 sudo dnf install ncdu (centos、fedora等系统)

通过ncdu可以方便查看,需要加上sudo,否则可能会有各种无权访问的提示

sudo ncdu

查看当前目录文件的占用情况,如果要查整个文件系统,可以加上目录参数

sudo ncdu /

有时除了本地文件系统,还会挂其他网络文件系统等,可以用 -x 排除,只搜索本地文件系统。

sudo ncdu / -x

最后我们来看一下 /etc/fstab文件

该文件是linux系统非常非常非常重要的文件,如果你编辑错了,有可能导致无法启动!

cat /etc/fstab

在系统启动时,将读取这个文件的信息自动挂载。下一小节我们将来专门介绍。


/etc/fstab文件

首先说明,在使用/etc/fstab要非常小心,如果错了,有可能导致系统无法启动!

本节的目的是编辑/etc/fstab文件实现系统启动时自动挂载 /dev/sdb1卷。

首先我们查下设备

lsblk 

看到有sdb设备分区sdb1,再用mount检查,发现未挂载

mount | grep sdb

打开 /etc/fstab,我们不要编辑这个文件已有的行,而是添加行,将我们的卷在启动时加载。我们添加下面这行:

/dev/sdb1 /mnt/mydisk ext4 defaults 0 0

将sdb1挂载到 /mnt/mydisk目录下,格式是ext4.

选项有很多,全介绍将会很长,这里用defaults就好。实际上defaults等于rw,suid,dev,exec,auto,nouser,async

第一个数字跟转储与备份有关,用得不多,这里保持0就好,

第二个数字是指文件系统完整性检查的顺序,0表示不检查,如果要进行检查,而且 / 根文件系统是1,这里就设2就比较合适,表示在根文件检查之后再检查该文件系统。这里我们全保持为0

保存文件之后,先不要重启,确保挂载的目录 /mnt/mydisk已建好。

sudo mkdir /mnt/mydisk -p

现在手动挂载就可以省略掉/dev/sdb1了,直接跟目录就好,因为映射关系已在 /etc/fstab中指定了。

sudo mount /mnt/mydisk

为了测试,我们先卸载掉

sudo umount /mnt/mydisk

可以测试下/etc/fstab文件是否正常,没有太大的错误

sudo mount -a

这个命令不能保证挂载百分百正确,但基本保证正确,可以查看挂载

mount | grep sdb

目前一切还不错,但有个真正的问题,我们查看/etc/fstab,发现其他行的挂载是用UUID的,而我们用的是设备路径 /dev/sdb1.

当系统重新启动时,要是该磁盘被分配了/dev/sdc,这是完全可能的,那么 /etc/fstab里添加的/etc/sdb1这行将是无效的。而UUID是不会变的,所以更好的方法是采用UUID。

用 blkid命令可以查询UUID

sudo blkid

查到UUID后,先umount,然后修改 /etc/fstab

sudo umount /mnt/mydisk

再修改/etc/fstab的这行为:

UUID=XXXX /mnt/mydisk ext4 defaults 0 0

保存后,再测试执行

sudo mount -a

发现这个卷已能正常挂载。

一般建议用blkid查询到UUID,然后在/etc/fstab中设置UUID自动挂载。

最后再介绍一个选项,我们添加 noauto 选项,表示启动时不自动挂载。

UUID=XXXX /mnt/mydisk ext4 defaults,noauto 0 0

默认defaults是包括auto的,添加noauto修改成不自动挂载。

我们再执行 sudo mount -a 是不会挂载的。但手动指定是会挂载的。

如:

sudo mount /mnt/mydisk

所以添加一条挂载记录且包含noauto是有用的,可以方便脚本编写,可随时手动命令准确挂载,而且系统启动时不会自动挂载,对于一些临时用于备份的卷是比较有用的。

如同用noauto覆盖auto一样,我们可以用 ro 覆盖默认的rw,表示挂载的卷是只读的。一般建议加上这个选项,除非确定需要读写时再改成rw。

UUID=XXXX /mnt/mydisk ext4 defaults,ro,noauto 0 0

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注