用户管理
查看本机的用户,有些人查看/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