Linux 用户与组

为什么引入用户和组?
安全性
—权限管理(哪些文件某个用户可以读写、哪些进程某个用户可以启动)
—资源管理(存储资源、IO、CPU资源)

[root@localhost ~]# id root
uid=0(root) gid=0(root) 组=0(root)
每个用户有唯一uid和gid
一个用户可以有不同的组
一个组可以有不同的用户

useradd增 userdel 删 usermod改 users查(查看当前登录用户)

创建一个用户会牵扯到哪些文件?
默认情况下,创建用户会添加一个和用户同名的组,默认将这个用户加入这个组
Linux 用户与组

1、和账户相关文件

/etc/passwd

保存用户账号的基本信息

[root@hahah ~]# cat /etc/passwd
...
hejin13:x:1022:1022::/home/hejin13:/bin/bash
sc:x:1023:1023::/home/sc:/bin/bash
  • 字段1: 用户名
  • 字段2: 密码占位符,通常为x或者*。
    因为文件任何人都可以访问,密码不安全;
    真正测密码放在/etc/shadow里面
  • 字段3: 用户id
  • 字段4: 所属基本组的id
  • 字段5: 用户描述信息
  • 字段6: 家目录位置
  • 字段7: 登录的shell信息

练习
查找出linux系统里的用户uid大于2000的用户,显示出它的名字、uid、shell、家目录

[root@192 nginx]# cat /etc/passwd|awk -F : '$3>2000 {print $1,$3,$7,$6}'
nobody 65534 /sbin/nologin /

/etc/shadow

[root@192 ~]# cat /etc/shadow
bin:*:18397:0:99999:7:::
daemon:*:18397:0:99999:7:::
...
hejin13:!!:18941:0:99999:7:::
sc:$6$wvTLEqS7sUZR.LcN$0EOiWoJy.QYcOGwepuQuqIIDvdeMf0ygmDJAPNxSZkapp9V9fLWN3/HKDVYs/jJi062YYNXDGbER1dfjwtkaE.:18946:0:99999:7:::

第2个字段:密码字段
*操作系统自带的,没有密码的
!!用户建的,没有密码的
提示: 密码字段为空说明密码被清除。
查看没有设置密码的用户

cat /etc/shadow|awk -F: 'BEGIN{i=0}length($2)<=2{print $1,"没有设置密码";i++}END{print "一共有"i"个用户"}'
[root@localhost ~]# diff /etc/passwd /etc/passwd-
47d46
< sc:x:1023:1023::/home/sc:/bin/bash

/etc/passwd- 和 /etc/shadow- 是/etc/passwd和/etc/shadow的备份文件,总比原文件少一次操作

2、组信息相关文件

/etc/group

[root@192 ~]# cat  /etc/group
hejin13: x :1022: 
sc : x: 1023:

/etc/gshadow

hejin13:!::
sc:!::

3、家目录信息相关文件

创建用户 默认在/home 创建同名的文件夹

/etc/skel/

用户环境默认设置文件
将 /etc/skel/ 下的文件拷贝到用户的家目录

[root@localhost skel]# ll -a
总用量 24
drwxr-xr-x.  2 root root   76 11月 15 11:31 .
drwxr-xr-x. 80 root root 8192 11月 15 11:31 ..
-rw-r--r--.  1 root root    0 11月 15 11:31 aa.txt
-rw-r--r--.  1 root root   18 7月  21 2020 .bash_logout
-rw-r--r--.  1 root root  141 7月  21 2020 .bash_profile
-rw-r--r--.  1 root root  376 7月  21 2020 .bashrc

/etc/login.defs

用户环境默认属性设置文件
–规定了uid从多少开始、密码过期的天数、密码的加密算法

  • 0 root 超级用户
  • 1~201 系统安装好就有的用户(系统用户、程序用户) :作用就是用来启动或登录某个程序
  • 201~999 自己新建的系统用户 没有家目录,是管理系统的,不需要登录
  • 1000~60000 自己新建的用户

超级用户root的UID为0
程序用户的UID1-999
普通用户的UID大于等于1000

/var/spool/mail

邮件目录
/var/spool/mail下面创建一个同名的文件

练习1:找uid大于1000的用户

找出系统中uid大于1000的用户 显示出名字、uid、家目录、shell信息

[root@localhost /]# awk -F: '$3>=1000{print $1,$3,$6,$7}' /etc/passwd
hejin12 1021 /home/hejin12 /bin/bash
hejin13 1022 /home/hejin13 /bin/bash
sc 1023 /home/sc /bin/bash
sc2 1024 /home/sc2 /bin/bash
>>> import os
>>> os.geteuid()  有效用户root用户有效的uid 为0
0 
>>> os.getegid()
0
>>> os.getpid()
2264 
>>> help(os.walk)
# 输出在文件夹中的文件名通过在树中游走,向上或者向下。
>>> list(os.walk("."))
[('.', [], ['passwd', 'access.log', 'config', 'ifcfg-ens33', 'hosts', 'test2.txt', 'path.txt', 'selinux', 'sshd_config', 't.txtr', 't.txt', '.test.txt.swp', 'test.txt'])]

练习2:验证用户是否存在

用python脚本验证用户是否存在,会用到sys模块和os模块

os.system(cmd)的返回值是脚本的退出状态码,只会有0(成功),1,2
os.popen(cmd)返回脚本执行的输出内容作为返回值
方式1

import sys
import os
username = sys.argv[1]

result = os.system(f"id {username}")
print(result)
if result == 0:
# if not result:
    print("用户存在")
else:
    print("用户不存在")

方式2

import sys
user1 = sys.argv[1]
with open("/etc/passwd") as f:
    userList = []
    for data in f:
        data = data.strip()
        lst = data.split(':')
        userList.append(lst[0])
    if user1 in userList:        print("用户存在")
    else:
        print("用户不存在")

4、ftp协议(文件传输协议)

ftp是一个文件传输服务,主要用于上传和下载文件,实现共享文件。
vsftpd是“very secure TTP daemon”的缩写,是一个完全免费的、开放源代码的ftp服务器软件。

  • 1、安装vsftp服务
    yum install vsftpd -y
    检查是否安装了vsftpd
    rpm -qa|grep vsftpd
  • 2、安装客户端软件
    yum install lftp ftp -y
    lftp、ftp这两个都是ftp的客户端
  • 3、启动服务
    使用yum安装的服务基本上都可以使用systemctl启动;
    systemctl start vsftpd
    查看是否启动成功
    ps aux|grep vsftpd
  • 4、编辑配置文件
    vim /etc/vsftpd/vsftpd.conf
    第12行,默认是NO,不允许匿名用户登录
    centos8里vsftpd服务默认不允许匿名用户登录
    anonymous_enable=NO 修改为YES
    要重新加载配置文件,或者重启服务
    systemctl restart vsftpd
  • 5、使用
[root@sanchuang-linux ~]# cat /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin	 # 注:vsftpd的匿名用户,公共用户
#注:/var/ftp  ftp这个用户的家目录文件
[root@sanchuang-linux ~]# lftp ftp@192.168.0.27	 # 注:以ftp用户取登录程序
密码: 							  注:ftp是默认用户
[root@kafka01 ~]# ftp 192.168.149.132  
Connected to 192.168.149.132 (192.168.149.132).
220 (vsFTPd 3.0.3)
Name (192.168.149.132:root): ftp   #系统中的程序用户ftp, 使用ftp匿名用户登陆
331 Please specify the password.
Password:      #密码输入直接敲回车 一般是不会设置的
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

5、useradd 命令

格式:useradd [选项]… 用户名
常用选项
-u:指定 UID 标记号
-d:指定宿主目录,缺省为 /home/用户名
-e:指定帐号失效时间
-g:指定用户的基本组名(或GID号)
-G:指定用户的附加组名(或GID号)
-M:不为用户建立并初始化宿主目录
-s:指定用户的登录Shell
-c:用户注释描述信息 ,可以告诉别人创建改用户的目的
-r: 新建系统用户,不会有新建家目录

adduser username 默认不会创建家目录

统计当前/etc/passwd 中有几种shell信息

即用户一登上来执行什么操作

[root@localhost etc]# cat passwd | awk -F: '{print $7}'|sort -n|uniq -c
     27 /bin/bash   
      1 /bin/sync
      1 /sbin/halt
     19 /sbin/nologin   #ssh远程登录、su本地登录都不行
      1 /sbin/shutdown
[root@localhost etc]# awk -F: '{print $7}'   /etc/passwd |sort|uniq
/bin/bash    #系统默认用户的shell信息
/bin/sync    #将内存的缓存刷到磁盘
/sbin/halt   #登录就关机
/sbin/nologin  #用户不能登录系统
/sbin/shutdown  #关机

useradd -s /sbin/nologin sc01 无论是ssh还是su都不能登录
useradd -s /sbin/halt sc02 登录即关机

找出系统中uid大于1000 并且shell信息为/bin/bash,用户名包含sanchuang的用户信息(用户名,用户id,家目录)

[root@localhost ~]# cat /etc/passwd | awk -F: '$3>1000{print  $1,$3,$6,$7}'|grep /bin/bash|grep sangchuang
sangchuang03 1028 /home/sangchuang03 /bin/bash
sangchuang04 1029 /home/sangchuang04 /bin/bash

[root@localhost ~]# grep "sangchuang"  /etc/passwd |grep /bin/bash |awk -F: '$3>1000{print $1,$3,$6}'
sangchuang03 1028 /home/sangchuang03
sangchuang04 1029 /home/sangchuang04

[root@localhost ~]# awk -F: '$3>1000  && $1~/sangchuang/ && $7=="/bin/bash"  {print $1,$3,$6}' /etc/passwd
sangchuang03 1028 /home/sangchuang03
sangchuang04 1029 /home/sangchuang04
#指定家目录,但是受安全机制selinux限制
#selinux 一个linux内核的安全子系统,由于安全规则太繁琐,一般会将其关闭
[root@localhost ~]# useradd -d /tmp/sangchuang05 sangchuang05
useradd: cannot set SELinux context for home directory /tmp/sangchuang05
# 修改安全机制,重启系统生效配置
[root@localhost ~]# vim /etc/selinux/config
SELINUX=enforcing ——》SELINUX=disabled
# getenforce 查看是否生效
#指定组名
[root@localhost ~]# useradd -g sanchuang01 -G  sangchuang04,sangchuang05  sangchuang07
[root@localhost ~]# id sangchuang07
uid=1031(sangchuang07) gid=1026(sanchuang01) 组=1026(sanchuang01),1029(sangchuang04),1030(sangchuang05)

6、userdel 命令

格式:userdel [-r] 用户名
添加 -r 选项时,表示连用户的宿主目录一并删除
添加 -f 选项时,表示强制删除

[root@localhost ~]# userdel sangchuang04  #删除用户帐号,而不删除相关文件。 
userdel:组“sangchuang04”没有移除,因为它包含其它成员。

7、usermod 命令

格式:usermod [选项]… 用户名
常用选项
-u: 修改 UID
-d:指定宿主目录,缺省为 /home/用户名
-e:指定帐号失效时间
-g:指定用户的基本组名(或GID号)
-G:指定用户的附加组名(或GID号)
-s:指定用户的登录Shell

-l:更改用户帐号的登录名称
-L: 锁定用户账户
-U:解锁用户账户

[root@localhost ~]# usermod -u 1200 sc2  #修改UID
[root@localhost ~]# id sc2
uid=1200(sc2) gid=1024(sc2) 组=1024(sc2)
[root@localhost ~]# usermod -d /temp/ooo ooo  #修改家目录
[root@localhost ~]# tail /etc/passwd
sc2:x:1200:1024::/home/sc2:/bin/bash
ooo:x:1025:1025::/temp/ooo:/bin/bash
[root@localhost ~]# usermod -g 1026 ooo   #修改gid
[root@localhost ~]# id ooo
uid=1025(ooo) gid=1026(sanchuang01) 组=1026(sanchuang01)
[root@localhost ~]# usermod -G 1027 ooo #修改组id
[root@localhost ~]# id ooo
uid=1025(ooo) gid=1026(sanchuang01) 组=1026(sanchuang01),1027(snagchuang02)
[root@localhost ~]# usermod -c "修改注释" sanchuang11 #修改注释
[root@localhost ~]# tail /etc/passwd
...
sanchuang11:x:1033:1033:修改注释:/tmp/sanchuang11:/bin/bash
sanchuang12:x:1034:1034:描述信息:/home/sanchuang12:/bin/bash

账户锁定就是修改系统存储的密码字段,验证密码失败,达到账户锁定的目的
锁住的状态,其实就是在密码字段前面加一个!

[root@localhost ~]# usermod -L sangchuang07 锁定
[root@localhost ~]# usermod -U sangchuang07 解锁

8、passwd 命令

格式:passwd [选项]… 用户名
常用选项:
-d:清空用户的密码,使之无需密码即可登录

  • l:锁定用户帐号
    -u:解锁用户帐号
    -S:查看用户帐号的状态(是否被锁定)
    –stdin:接收别的命令stdout做为stdin标准输入设置 密码

root用户可以修改所有用户密码,不要求复杂性
普通用户只能修改自己的密码,有密码复杂度的要求

#使用标准输入来设置密码
[root@kafka01 lianxi]# echo 12345678 |passwd sanchuang13 --stdin

练习1

创建20个用户,用户名以beautwen开头,指定家目录在/tmp/lianxi/beautiwen01…20
登录shell 都指定为/usr/bin/sh
给出提示:创建之前判断,如果用户存在,就删除当前用户
Linux 用户与组

练习2

Linux 用户与组

9、groupadd

添加组

[root@localhost lianxi]# groupadd -g 5000 sanle
[root@localhost lianxi]# less /etc/group
sanle:x:5000:

10、 groupmems

对组成员进行修改,可以添加删除
groupmems -g 组名 -a 用户名 往这个组里面添加用户
groupmems -g 组名 -l 查看组里的用户

11、groupdel

[root@kafka01 lianxi]# groupdel sanle  #删除sanle这个组
groupdel: cannot remove the primary group of user 'sanle1'#组里面有sanle1这个成员 所以删除不来
[root@kafka01 lianxi]# userdel -r sanle1  #先删除成员
[root@kafka01 lianxi]# groupdel sanle     #再删除组

12、groupmod

[root@localhost lianxi]# groupadd -g 6000 sanchuang  #添加用户指定GID
[root@localhost lianxi]# groupmod -g 4000 sanchuang  #修改GID
[root@localhost lianxi]# groupmod -n sanchuang2 sanchuang  #修改组名
[root@localhost lianxi]# tail -n 1 /etc/group
sanchuang2:x:4000:

13、newgrp修改有效组

用户必须是组成员才能改变有效组
有效组: 新建文件夹或文件的时候,属组是谁,谁就是有效组

[root@localhost lianxi]# id usersanle
uid=1329(usersanle) gid=1329(usersanle) 组=1329(usersanle),5000(sanle)
[usersanle@localhost ~]$ touch bb
[usersanle@localhost ~]$ ls -al
...
-rw-rw-r--   1 usersanle usersanle    0 11月 17 10:51 bb
[usersanle@localhost ~]$ newgrp sanle
[usersanle@localhost ~]$ touch cc
[usersanle@localhost ~]$ ll
...
-rw-rw-r-- 1 usersanle usersanle 0 11月 17 10:51 bb
-rw-r--r-- 1 usersanle sanle     0 11月 17 10:55 cc
             属主      属组

14、/etc/skel 文件

新建用户账号的时候,会复制到宿主目录
主要控制用户初始化环境配置
.bash_profile 用户每次登录时执行
.bashrc 用户退出登录的时候执行的
.bash_logout 用户每次进入新的bash环境执行
.bash_history 用户的历史命令。退出时会将历史命令写入这个文件

/etc/bashrc 在每个新的bash开启的时候执行
/etc/profile 在系统开启的时候执行
su - sanle:.bash_profile 和 .bashrc 都会被执行
su sanle :.bashrc 只会执行这个文件

#登陆的时候
.bash_profile  --> ~/.bashrc  --> /etc/bashrc

#进入新bash的时候
.bashrc --> /etc/bashrc

15、su命令

[root@localhost lianxi]# su - usersanle 
#连同环境一起切到usersanle,家目录下的.bashrc   .bash_profile都会执行

[root@localhost lianxi]# su usersanle  
#只是切换了用户,环境变量没有切换,只会执行.bashrc

16、who/w命令

查看已经登录到主机的用户信息

[root@kafka01 ~]# w  #显示的比who多俩行
 14:43:32 up  1:19,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.149.1    11:10    2:35m  0.19s  0.19s -bash
root     pts/1    192.168.149.1    11:16    3:27m  0.01s  0.01s -bash
root     pts/2    192.168.149.1    14:42    1.00s  0.02s  0.01s w
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
使用者 ID 使用的终端机 从哪边连上来的 上线时间 呆滞时间 CPU 使用量 动作

17、last/lastlog命令

last 显示用户最近登录信息
lastlog 查看所有用户上一次登录情况

18、audit 安全审计

系统安全
记录某个用户某些操作
记录某个程序某些操作
audit详解

回顾:

  • 如何知道一个用户是否在linux系统里存在?
    1、id 用户名 查看
    2、查看/etc/passwd

  • 如何禁用一个用户登录linux系统?
    1、passwd -l 用户名 锁定
    2、usermod -L 用户名 锁定
    3、useradd -s /sbin/nologin {username} 修改登录的shell

  • 如何知道一个用户属于哪些组?
    1、groups uname
    2、结合/etc/passwd和/etc/group查看
    3、id uname

  • 如何知道哪些用户现在已经登录在linux里?
    w、who

  • 哪些用户曾经 登录过linux系统?
    last 显示用户最近登录信息
    lastlog 查看所有用户上一次登录情况

  • 如何给用户重新设置密码?
    echo 密码|passwd sanchuang13 --stdin

  • linux的root密码忘记了,怎么办?
    进入单用户模式,修改root密码

  • 如何将已经登录在系统里的用户踢出系统?
    pkill -KILL -t pts/0 (pts/0为w指令看到的用户终端号)
    ps aux | grep sshd 查看sshd进程PID
    kill -9 10482 杀掉test登录的sshd进程PID

  • 并且防止它再次登录系统?
    1.踢出可疑的root登录用户,马上修改密码
    2.sshd—》/etc/hosts.deny hosts.allow —》ip
    3./etc/ssh/sshd_config -->DenyUsers -->用户
    4.把/bin/bash修改成/sbin/nologin

上一篇:杂项-Windows下PHPstorm-git中文乱码解决


下一篇:shell命令行的选项和参数是如何处理的?