本文介绍Linux基础中与用户相关原理以及命令的使用。
用户和用户组都是Linux系统中的一种资源。
每个用户都用用户名、用户ID、所属组及其默认shell,可能包括密码、家目录、附属组和注释信息等。
每个组也都有用户组名、用户组ID。在Linux中,约定俗成的将同一用户的UID和GID保持一致。组分为主组和附加组,用户一定会属于一个主组,也可以同时加入多个附加组。
在Linux中,用户分为3中:超级管理员、系统用户、普通用户
(1)超级管理员
超级管理员是最高权限者,uid=0,默认超级管理员用户名为root。因为uid默认具有唯一性,所以超级管理员默认只能有一个。家目录为/root
(2)系统用户
系统用户是具有某些权限但不需要登录操作系统的用户。uid 范围从201到999。出于安全考虑,系统用户一般不用来登录,所以系统用户的默认 shell 一般是/sbin/nologin,并且大多数情况下它们没有家目录。
(3)普通用户
普通用户是权限受到限制的用户,默认只能执行/bin、/usr/bin、/usr/local/bin和自身家目录下的命令。uid 范围从500开始。普通用户对自身加目录下的所有文件拥有所有权限。家目录为/home下以用户名命名的文件夹。
超级管理员的命令提示符是"#",其他为"$"
1.用户文件/etc/passwd
/etc/passwd
文件记录操作系统中用户的信息,文件中有多少行系统就有多少个用户。
每一行表示一个用户,每一行格式都是6个冒号共7列属性,其中某些列属性可以留空。
2.用户密码文件/etc/shadow
/etc/shadow
文件中存放的是用户的密码信息,该文件除了超级管理员,任何人都不能直接读取和修改文件。用户之所以能修改自己的密码,是因为 passwd 程序的 suid 属性,使得修改密码时临时提升为 root 权限。
每一行表示一个用户密码属性,有8个冒号共9个属性
3.组文件 /etc/group 和 /etc/gshadow
/etc/group 包含了组的信息,每行一个组,3个冒号共4列信息,分别是组名、密码占位符、gid、该组的 user 列表
/etc/gshadow 包含了组密码信息
4.骨架目录/etc/skel
骨架目录的作用是当新建用户时,会将此目录的文件复制到新建用户的家目录中。默认只有三个环境配置文件,可以修改这里面的内容,或者添加文件在骨架目录中,以后新建的用户就会自动获得到这些环境和文件。
5.用户账号限制文件 /etc/login.defs
该文件的配置对 root 用户无效。如果/etc/shadow 文件中也有相同的配置,则以 shadow文件为准。
该文件可以设置关于密码的最大有效期、两次密码最小间隔、useradd 命令创建用户自动选择 uid 和 gid 的范围、家目录的 umask 值(默认022)、用户和组密码的默认加密算法等。
/etc/login.defs 中的设置控制的是 shadow-utils包中的组件,组件中的工具执行操作时会读取该文件中的配置。
6./etc/default/useradd
创建用户时使用的默认配置。useradd -D
修改的就是此文件
(7)/etc/sudoers
该文件主要配置 sudo 命令时指定的用户和对应的权限。主要包括别名的配置和 sudo 权限的配置
安全策略配置格式为:用户名 主机名=(可切换到的用户身份) 权限和命令
标签的使用方法:NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/userdel
上面表示 useradd 命令不需要输入密码,而 userdell 需要输入密码
示例
22.useradd && adduser
useradd
用于添加用户,adduser
是useradd
的软链接。默认会自动创建一个和用户名相同的用户组,由/etc/login.defs 中的USERGRUOP_ENAB 变量控制。创建普通用户时,不加任何和家目录相关的选项时,是否创建家目录是由/etc/login.defs 中的CREATE_HOME 变量控制的。
一般用法:useradd options login_name
选项
-b:指定家目录的 basedir,默认为/home 目录
-d:指定用户家目录,默认为/home/user_name
-m:创建家目录时,若家目录不存在则自动创建,若不指定该选项且/etc/login.defs 中CREATE_HOME 未启用时将不不会创建家目录
-M:显式指定不要创建家目录,会覆盖/etc/login.defs 中 CREATE_HOME 设置
-g:指定用户主组,要求组已存在
-r:创建一个系统用户。默认不会创建用户家目录,除非使用-m 选项
-s:指定用户默认的登录 shell,默认使用/etc/default/useradd 中的 SHELL变量设置
-u:指定用户 uid,默认 uid 必须唯一,除非使用-o 选项
-o:允许创建一个重复 uid 用户,只有和-u 选项同时使用才生效
-D:修改 useradd 创建用户时的默认选项,即修改/etc/default/useradd 文件
23.newusers
newusers
用于批量创建或修改已有用户信息。创建用户会读取 /etc/default/login.defs 的配置项。
一般用法:
newusers [options] [file]
file 文件定义了需要新建或修改用户的信息,一行代表一个用户,格式如下:
pw\_name:pw\_passwd:pw\_uid:pw\_gid:pw\_gecos:pw\_dir:pw\_shell
选项
-c:指定加密算法,可选 DES、MD5、NONE、SHA256、SHA512
-r:创建一个系统用户
newusers首先尝试创建或修改所有指定的用户,然后将信息写入到user和group的文件中。如果尝试创建或修改用户过程中发生错误,则所有动作都将回滚,但如果在写入过程中发生错误,则写入成功的不会回滚,这将可能导致文件的不一致性。要检查用户、组文件的一致性,可以使用showdow-utils包提供的grpck和pwck命令。
24.groupadd
groupadd
用于创建一个新组。
一般用法:groupadd options group
选项
-f:如果要创建的组已经存在,默认会错误退出,使用该选项则强制创建且以正确状态退出,只不过gid可能会不受控制
-g:指定gid,默认gid必须唯一,除非使用了-o选项
-K:修改/etc/login.defs中关于组相关的配置项。配置方式为KEY=VALUE,例如-K GID_MIN=100 -K GID_MAX=499
-o:允许创建一个非唯一gid的组
-r:创建系统组
25.passwd
passwd
用于修改密码。默认 passwd 命令不允许为用户创建空密码。
passwd 命令修改密码前会通过 pam 认证用户,pam 配置文件中与此相关的设置项如下:
一般用法:passwd options username
选项
-l:锁定指定用户的密码,在/etc/shadow 的密码列加上前缀"!"或"!!"。这种锁定不是完全锁定,使用ssh公钥还是能登录。要完全锁定,使用chage -E 0来设置帐户过期
-u:解锁-l锁定的密码,解锁的方式是将/etc/shadow的密码列的前缀"!"或"!!"移除掉。但不能移除只有"!"或"!!"的项
--stdin:从标准输入中读取密码
-d:删除用户密码,将/etc/shadow的密码列设置为空
-f:指定强制操作
-e:强制密码过期,下次登录将强制要求修改密码
-n:密码最小使用天数
-x:最大密码使用天数
-w:过期前几天开始提示用户密码将要过期
-i:设置密码过期后多少天,用户才过期。用户过期将被禁用,修改密码也无法登陆
26.chpasswd
以批处理模式从标准输入中获取提供的用户和密码来修改用户密码,可以一次修改多个用户密码。也就是说不用交互。适用于一次性创建了多个用户时为他们提供密码。
一般用法:chpasswd -e -c "user:passwd"
选项
-c:指定加密算法,可选的算法有DES,MD5,NONE,SHA256和SHA512
-e:passwd默认使用的是明文密码,如果要使用密文,则使用-e选项。参见man chpasswd
user:passwd为用户密码对,其中默认passwd是明文密码,可以指定多对,每行一个用户密码对。前提是用户是已存在的。
chpasswd会读取/etc/login.defs中的相关配置,修改成功后会将密码信息写入到密码文件中。
该命令的修改密码的处理方式是先在内存中修改,如果所有用户的密码都能设置成功,然后才写入到磁盘密码文件中。在内存中修改过程中出错,则所有修改都回滚,但若在写入密码文件过程中出错,则成功的不会回滚。
用法示例:
# 修改单个用户密码
echo "user1:123456" | chpasswd -c SHA512
# 修改多个用户密码
echo -e 'usertest:123456\nusertest2:123456' | chpasswd
# 使用文件修改多个用户密码
cat /tmp/passwdfile
zhangsan:123456
lisi:123456
chapasswd -c SHA512 </tmp/passwdfile
27.chage
chage
命令主要修改或查看和密码时间相关的内容。
选项
-l:列出指定用户密码相关信息
-E:指定账户(不是密码)过期时间,所以是强锁定,如果指定为0,则立即过期,即直接锁定该用户
28.userdell & groupdel
userdel
命令用于删除用户。
userdel [options] login_name
-r:递归删除家目录,默认不删除家目录。
-f:强制删除用户,即使这个用户正处于登录状态。同时也会强制删除家目录。
一般不直接删除家目录,即不用-r,可以使用vim /etc/passwd
将不需要的用户直接注释掉。
groupdel
命令删除组。如果要删除的组是某用户的主组,需要先删除主组中的用户。
29.usermod
usermod
用于修改用户账户属性信息。在执行此命令时,待修改的用户需要没有正在执行的进程。
usermod [options] login
选项说明:
-l:修改用户名,仅仅只是改用户名,其他的一切都不会改动(uid、家目录等)
-u:新的uid,新的uid必须唯一,除非同时使用了-o选项
-g:修改用户主组,可以是以gid或组名。对于那些以旧组为所属组的文件(除原家目录),需要重新手动修改其所属组
-m:移动家目录内容到新的位置,该选项只在和-d选项一起使用时才生效
-d:修改用户的家目录位置,若不存在则自动创建。默认旧的家目录不会删除
如果同时指定了-m选项,则旧的家目录中的内容会移到新家目录
如果当前用户家目录不存在或没有家目录,则也不会创建新的家目录
-o:允许用户使用非唯一的UID
-s:修改用的shell,留空则选择默认shell
-c:修改用户注释信息
-a:将用户以追加的方式加入到辅助组中,只能和-G选项一起使用
-G:将用户加入指定的辅助组中,若此处未列出某组,而此前该用户又是该组成员,则会删除该组中此成员
-L:锁定用户的密码,将在/etc/shadow的密码列加上前缀"!"或"!!"
-U:解锁用户的密码,解锁的方式是移除shadow文件密码列的前缀"!"或"!!"
-e:帐户过期时间,时间格式为"YYYY-MM-DD",如果给一个空的参数,则立即禁用该帐户
-f:密码过期后多少天,帐户才过期被禁用,0表示密码过期帐户立即禁用,-1表示禁用该功能
30.vipw和vigr
vipw和vigr是编辑用户和组文件的工具,vipw可以修改/etc/passwd和/etc/shadow,vigr可以修改/etc/group和/etc/gshadow,用这两个工具比较安全,在修改的时候会检查文件的一致性。
删除用户出错时,提示用户正在被进程占用。可以使用vi编辑/etc/paswd和/etc/shadow文件将该用户对应的行删除掉。也可以使用vipw和vipw -s来分别编辑/etc/paswd和/etc/shadow文件。它们的作用是一样的。
手动创建用户
手动创建用户需要全程使用管理员权限。
(1)添加用户组
在/etc/group 中添加用户所属组的相关信息。如果用户还有附加组则在附加组中加入该用户作为成员
(2)添加用户信息
在/etc/passwd 和/etc/shadow 中添加用户相关信息,此时家目录和密码还不存在,所以/etc/shadow的密码位使用"!!"代替
(3)创建家目录
mkdir /home/user_name
cp -r /etc/skel /home/user_home
(4)修改用户家目录以及子目录的所有者和属组
chown -R user_name:user_name /home/user_name
(5)修改用户家目录以及子目录的权限
chmod -R 700 /home/user_name
目前用户已经创建完成,只是没有密码,所以只能 su,不能登录
(6)生成密码
openssl passwd -1 -salt '123456' '123456' # -1指的是使用 MD5 算法
一下是手动创建用户的过程
shell> mkdir /tmp/12;cp /etc/group /etc/passwd /etc/shadow /tmp/12/ # 备份这些文件
shell> echo "userX:x:666" >> /etc/group
shell> echo "userX:x:666:666::/home/userX:/bin/bash" >> /etc/passwd
shell> echo 'userX:!!:17121:0:99999::::' >> /etc/shadow
shell> cp -r /etc/skel /home/userX
shell> chown -R userX:userX /home/userX
shell> chmod -R go= /home/userX
shell> passwd --stdin userX <<< '123456'
如果是使用openssl passwd创建的密码。那么使用下面的方法将这部分密码替换到/etc/shadow中。
shell> field=$(tail -1 /etc/shadow | cut -d":" -f2)
shell> password=$(openssl passwd -1 -salt 'abcdefg' 123456)
shell> sed -i '$s%'$field'%'$password'%' /etc/shadow
31.finger 命令
finger
命令用于查看用户信息
32.id 命令
id
用于显示用户的 UID 和 GID
选项
-u:只获取 UID
-n:得到用户名而不是 uid
-z:无任何空白字符输出模式,默认格式下不可用
33.users 命令
user
用于查看当前正在登录的用户名
34.last 命令
last
用于查看最近登录的用户列表,实际上 last 查看的是/var/log/wtmp 文件
选项
-n:列出最近指定次数登录的用户
35.lastb 命令
查看谁尝试登陆过但没有登录成功的。即能够审核和查看谁曾经不断的登录,可能那就是黑客。
选项
-n:只列出最近的n个尝试对象。
36.who 和 w 命令
用于查看登录的用户,以及登录用的的操作,w 查看的信息比 who 命令多
w 第一行的信息:当前时间、已开机时长、当前在线用户、过去1、5、15分钟的平均负载。与uptime
命令获取的信息完全一致。
37.lastlog 命令
lastlog
用于查看登录用户的来源 IP
选项
-u:指定查看用户
38.su 命令
su
用于切换用户或以指定用户运行命令。
su 默认不该改变当前目录,且仅设置 HOME 和 SHELL 这两个环境变量,如果目标用户时root,则还设置了 USER 和 LOGNAME 环境变量。
推荐使用 su 命令搭配--login 选项避免环境变量混乱
su [options...] [-] [user [args...]]
选项说明:
-c command:使用-c选项传递要指定的命令到shell上执行。使用-c执行命令会为每个su都分配新的会话环境
-, -l, --login:启动shell作为登录的shell,模拟真正的登录环境。它会做下面几件事:
1.清除除了TERM外的所有环境变量
2.初始化HOME,SHELL,USER,LOGNAME,PATH环境变量
3.进入目标用户的家目录
4.设置argv[0]为"-"以便设置shell作为登录的shell
使用--login的su是交互式登录。不使用--login的su是非交互式登录(除不带任何参数的su外
-m, -p, --preserve-environment:保留整个环境变量(不会重新设置HOME,SHELL,USER和LOGNAME),
保留环境的方法是新用户shell上执行原用户的各配置文件,如~/.bashrc。
当设置了--login时,将忽略该选项
-s SHELL:运行指定的shell而非默认shell,选择shell的顺序优先级如下:
1.--shell指定的shell
2.如果使用了--preserve-environment,选择SHELL环境变量的shell
3.选项目标用户在passwd文件中指定的shell
4./bin/sh
若su没有给定任何参数,将默认以root身份运行交互式的shell(交互式,所以需要输入密码),即切换到root用户,但只改变HOME和SHELL环境变量。
su - username是交互式登录,要求密码,会重置整个环境变量,它实际上是在模拟真实的登录环境。
su username是非交互登录,不会重置除HOME/SHELL外的环境变量。
在某些环境下或脚本中,可能需要临时切换身份执行命令,注意这时候的环境变量是否会改变,否则很可能报错提示命令找不到。
39.sudo和 sudoedit 命令
sudo可以让一个用户以某个身份(如root或其他用户)执行某些命令,它隐含的执行方式是切换到指定用户再执行命令,因为涉及到了用户的切换,所以环境变量是否重置是需要设置的。
sudo支持插件实现安全策略。默认的安全策略插件是sudoers,它是通过/etc/sudoers或LDAP来配置的。
安全策略是控制用户使用sudo命令时具有什么权限,但要注意,安全策略可能需要用户进行身份认证,如密码认证的机制或其他认证机制,如果开启了认证要求,则在指定时间内未完成认证时sudo会退出,默认超时时间为5分钟。
安全策略支持对认证进行缓存,使得在一定时间内该用户无需再次认证就可以执行sudo命令,默认缓存时间为5分钟,sudo -v可以更新认证缓存。
sudo支持日志审核,可以记录下成功或失败的sudo。
当sudo执行指定的command时,它会调用fork函数,并设置命令的执行环境(如某些环境变量),然后在子进程中执行command,sudo的主进程等待命令执行完毕,然后传递命令的退出状态码给安全策略并退出。
sudoedit等价于sudo -e,它是以sudo的方式执行文件编辑动作。
sudo [options] [command]
选项说明:
-b :(background)该选项告诉sudo在后台执行指定的命令。
注意,如果使用该选项,将无法使用任务计划(job)来控制维护这些后台进程,
需要交互的命令应该考虑是否真的要后台,因为可能会失败
-l[l] [command]:当单独使用-l选项时,将列出(list)用户可执行和被禁止的命令。
当配合command时,且该command是被允许执行的命令,将列出命令的全路径及该命令参数。
如果command是不被允许执行的,则sudo直接以状态码-1退出。
可以指定多个字母"l"来显示更详细的格式
-n :使得sudo变成非交互模式,但如果安全策略是要求输入密码的,则sudo将报错
-S :(stdin)该选项使得sudo从标准输入而非终端设备上读取密码,给定的密码必须在尾部加上换行符
-s [command] :(shell)指定要切换到的shell,如果给定command,则在此shell上执行该命令
-U user :(other user)配合-l选项来指定要列出哪个用户的权限信息
-u user :(user)该选项明确指定要以此处指定的用户而非root来运行command。
若使用uid的方式指定用户,则需要使用"#uid",但很多时候可能需要对"#"使用"\"转义,即使用"\#uid"
-E :(environment)该选项告诉sudo在执行命令时保留自己的环境变量,保留环境变量的方式是执行环境配置文件。
但因为跨了用户,所以很可能某些家目录下的环境配置文件会因为无权限而执行失败,此时sudo将报错
-k [command] :当单独使用-k选项时,sudo将使得用户的认证缓存失效。下次执行sudo命令需要输入密码。
当配合command时,-k选项将忽略用户的缓存,所以sudo将要求用户输入密码,但这次输入密码不会更新认证缓存
但执行-k选项本身,不需要密码
-K :(sure kill)类似于-k选项,但它会完全移除用户的认证缓存,且不会配合command,执行-K本身不需要密码
-v :(validate)该选项使得sudo更新用户认证缓存
-- :暗示sudo命令行参数到此结束
在sudo上可以直接设置环境变量,它会传递为command的环境。设置的方式为var=value,如LD_LIBRARY_PATH=/usr/local/pkg/lib
由于sudo默认的安全策略插件是sudoers,所以当用户执行sudo时,系统会自动去寻找/etc/sudoers文件(该文件里被root配置了用户对应的权限,也即安全策略),查看sudo要使用的用户是否有对应的权限,如果有则执行,如果没有权限就失败退出sudo。
参考链接
http://www.cnblogs.com/f-ck-need-u/p/7011460.html
http://www.cnblogs.com/f-ck-need-u/p/7011669.html#auto_id_1
https://www.cnblogs.com/hazir/p/sudo_command.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。