用户权限命令以及ACL权限相关命令
1. Linux安全模型
资源分派:
- Authenticaton:登陆认证,验证用户身份
- Authorization:授权,不同的用户设置不同权限
- Accouting:审计,检查用户的时候行为
即Linux的AAA认证,是针对网络设备的网络访问控制策略和安全模型
- 1用户
- Linux是多系统用户,可以同时存在多个用户,每个用户之间都是相互隔离的
- 在系统当中,每个用户通过User ID (UID)来做唯一标识。
- 超级管理员:root(可以更改名称)的用户ID为 0
- 普通用户-系统用户:系统用户 ID为1-499(CentOS6及以前),1-999(CentOS) 分配给后台程序使用如:mysql
- 普通用户-登陆用户:500+( CentOS6及以前),1000+(CentOS及以后)给用户进行交互登陆
- 2用户组
- Linux中可以将多个用户加入到一个组当中,组就是包含0个或多个用户集合,用户组通过Group ID(GID)来唯一标识
- 管理员组:root, 0
- 普通组:
系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用
用户和组的关系:
- 一个用户至少有一个组,也可以有多个组
- 一个组至少有0个用户,也可以有多个用户
- 用户主要组又称私有组:一个用户必须属于且只有一个主组,创建用户时,默认创建于其同名的组作为主组;
- 用户附加组又称辅助组,一个用户可以属于0个或多个附加组
- 使用组,可以对用户进行批量管理,比如对一个组授权,则改组所有用户都能继承这个组的使用权限
- 3安全上下文
-
- 在Linux系统中,运行的程序(即进程process),都是进程发起者的身份运行;进程所能访问的资源取决于进程运行者的身份
-
- 什么是程序:能执行的二进制文件即是程序
-
- 什么是进程:运行中的程序,就是进城
2.用户和组的配置文件
- 用户和组主要配置文件
/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/shadow:用户密码及其相关属性
/etc/group:组及其属性信息
/etc/gshadow:组密码及其相关属性
3.1用户和组管理命令
useradd命令可以创建新的Linux用户
点击查看代码
useradd -g #用于指定用户组
useradd -c #新账户的GECOS字段
useradd -u #指定UID
useradd -s #指定shell 可以在/etc/shells 中查看
useradd -r #创建系统用户
useradd -m #创建家目录 一般用于登陆用户
useradd -M #不创建家目录 一般用于不登陆用户
useradd -p #设置密码 密码是以明文的形式存在
useradd -o #允许使用重复的UID创建用户
useradd -G #为用户指明附加组,组须事先存在
useradd -N #不创建同名组 使用users组做主组
useradd -D #显示或默认的user add·配置,默认配置文件是/etc/default/useradd
useradd -e #指定账户的过期日期
useradd -f #密码过期之后,账户被彻底禁用之前的天数,0表示密码过期立即禁用,-1 #表示不使用此功能
useradd -k #指定目录模版,创建家目录,会生成一些默认文件,如果指定,就会该目录复制文件,默认/etc/skel/,要配合-m使用
useradd -K #不使用/etc/login.defs中的默认值
useradd -l #不将用户添加到最近登陆和登陆失败记录
3.2用户属性修改
usermod命令修改用户属性
点击查看代码
-b, --badname allow bad names
-c, --comment COMMENT GECOS 字段的新值
-d, --home HOME_DIR 用户的新主目录
-e, --expiredate EXPIRE_DATE 设定帐户过期的日期为 EXPIRE_DATE
-f, --inactive INACTIVE 过期 INACTIVE 天数后,设定密码为失效状态
-g, --gid GROUP 强制使用 GROUP 为新主组
-G, --groups GROUPS 新的附加组列表 GROUPS
-a, --append GROUP 将用户追加至上边 -G 中提到的附加组中,
并不从其它组中删除此用户
-h, --help 显示此帮助信息并退出
-l, --login NEW_LOGIN 新的登录名称
-L, --lock 锁定用户帐号
-m, --move-home 将家目录内容移至新位置 (仅于 -d 一起使用)
-o, --non-unique 允许使用重复的(非唯一的) UID
-p, --password PASSWORD 将加密过的密码 (PASSWORD) 设为新密码
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-s, --shell SHELL 该用户帐号的新登录 shell
-u, --uid UID 用户帐号的新 UID
-U, --unlock 解锁用户帐号
-v, --add-subuids FIRST-LAST 添加子 UID 范围
-V, --del-subuids FIRST-LAST 移除子 UID 范围
-w, --add-subgids FIRST-LAST 添加子 GID 范围
-W, --del-subgids FIRST-LAST 移除子 GID 范围
-Z, --selinux-user SEUSER 用户的新的 SELinux 用户映射
3.3删除用户
userdel 可删除Linux用户
点击查看代码
选项:
-f, --force 强制删除,哪怕用户正在登陆状态
-h, --help 显示此帮助信息并退出
-r, --remove 删除主目录和信件池
-R, --root chroot 到的目录
-Z, --selinux-user 为用户删除所有的 SELinux 用户映射
3.4查看用户相关的ID信息
id命令可以查看用户的UID,GID等信息
点击查看代码
-a 忽略,仅为与其他版本相兼容而设计
-Z, --context 仅显示当前用户的安全上下文
-g, --group 仅显示有效用户组ID
-G, --groups 显示所有组ID
-n, --name 显示组名称而非数字,与 -ugG 一起使用
-r, --real 显示真实ID 而非有效ID,与 -ugG 一起使用
-u, --user 仅显示有效用户ID
3.5切换用户以其他用户身份执行
点击查看代码
-m, -p, --preserve-environment 不重置环境变量
-g, --group 指定主组,只有root切换普通用户才指定此参数
-|-l, --login 完全切换
-c, --command 不切换用户,而临时使用该用户权限和环境执行命令
--session-command 使用 -c 向 shell 传递一条命令
而不创建新会话
-f, --fast 向shell 传递 -f 选项(csh 或 tcsh)
-s, --shell 若 /etc/shells 允许,运行
-P, --pty create a new pseudo-terminal
说明:root su至其他用户无须密码;非root用户切换时需要密码
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很
多的bash子进程,环境可能会混乱。
3.6密码相关设置
passwd可以修改用户密码 可以使用--help
查看详细用法
passwd [option...] 用户名
普通用户修改自己密码,要验证当前使用的密码 其实就是更新/etc/shadow文件
chage 可以修改用户密码策略
3.8创建组
groupadd 实现创建组 可以使用--help
查看详细用法
格式:groupadd [options ] 组名称
groupmod 组属性修改
grouupdel 可以删除组
删除组:如果改组下有用户将组作为主组,则不能删除
删除用户:会把与其同ID的主组也给删除,前提是该组没有其他用户
4.文件权限管理
文件分属三种不同用户 属主 u
属组 g
其他用户 o
文件权限只有三种 读 -r
写 -w
可执行权限 -x
设置文件所有者chown
可以修改文件属主,也可以修改文件属组
chown owner
# 只修改所有者
owner:group
#同时修改所有者和属组
:group
#只修改属组,冒号也可以用. 代替
设置文件属组信息chgrp
可以只修改文件属组
修改文件权限chomd
ACL相关命令
setfacl
可以设置ACL权限
getfacl
可以查看设置的ACL权限
点击查看代码
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
#常用选项
-m|--modify=acl #修改acl权限
-M|--modify-file=file #从文件读取规则
-x|--remove=acl #删除文件acl 权限
-X|--remove-file=file #从文件读取规则
-b|--remove-all #删除文件所有acl权限
-k|--remove-default #删除默认acl规则
--set=acl #用新规则替换旧规则,会删除原有ACL项,用新的替代,一定要包含
UGO的设置,不能象 -m一样只有 ACL
--set-file=file #从文件读取新规则
--mask #重新计算mask值
-n|--no-mask #不重新计算mask值
-d|--default #在目录上设置默认acl
-R|--recursive #递归执行
-L|--logical #将acl 应用在软链接指向的目标文件上,与-R一起使用
-P|--physical #将acl 不应用在软链接指向的目标文件上,与-R一起使用
vim相关操作
- 直接输入
vim 文件名
即可进入编辑模式 输入:q
可以直接退出文件编辑 - 打开文件按
i
即可进入插入模式 按esc
键即可推出插入模式 - 在终端输入
vim 1.txt
打开文件 按住i
进入插入模式,输入“马哥出品,必属精品”esc
推出插入模式,输入:wq
保存退出即可 - 查看刚刚输入的内容 在终端输入
cat 1.txt
即可在输出文件内容
点击查看代码
#命令模式 --------------------------> 插入模式
#下列按键皆可
#i insert, 在光标所在处输入
#I 在当前光标所在行的行首输入
#a append, 在光标所在处后面输入
#A 在当前光标所在行的行尾输入
#o 在当前光标所在行的下方打开一个新行
#O 在当前光标所在行的上方打开一个新行
#命令模式 --------------------------> 扩展命令模式
#直接敲冒号 :
#################################################################
#插入模式 -------------------------> 命令模式
#按ESC键
#插入模式 -------------------------> 扩展命令模式
#按ESC到命令模式,再按冒号 : 到扩展命令模式
#################################################################
#扩展命令模式 ----------------------> 命令模式
#ESC键或Enter键或退格健
#扩展命令模式 ---------------------> 插入模式
#ESC|Enter|退格键 到命令模式,再i|I|a|A|o|O 到插入模式
[root@ubuntu2204 ~]# echo -e '\e[1;31mhello\e[0m'
查找并替换内容
:s /要查找的内容/要替换的内容/修饰符
:%s 表示全文查找
正则表达式及grep的基本用法
点击查看代码
. #匹配任意单个字符
[] #匹配指定范围的单个字符
[^] #匹配指定范围外的任意单个字符
\s #匹配任何空白字符
\S #匹配任何非空白字符
\w #匹配一个字母,数字,下划线,汉字,其他国家文字
\W #匹配一个非字母,数字,下划线,汉字,其他国家文字的字符
---------------------------------------------------------------------------------------
匹配次数
* #匹配前面的字符任意次
.* #任意长度的任意字符
\? #匹配其前面的字符出现0次或1次
\+ #匹配其前面字符最少一次
\{n\} #匹配前面的字符n次
\{m,n} #匹配前面字符至少m次,至少n次
\{,n\} #匹配前面字符至多n次
\{n,\} #匹配前面的字符至少n次
----------------------------------------------------------------------------------------
位置锚定
^ #行首锚定,用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^$ #空行
^PATTERN$ #用于模式匹配整行
^[[:space:]]*$ #空白行
\< 或 \b #词首锚定,用于单词模式的左侧
\> </或> \b #词尾锚定,用于单词模式的右侧
\ <PATTERN\> #匹配整个单词
删除/etc/passwd文件每一行第一个字符
cp /etc/passwd 到 ~/
在终端输入 sed -r 's/^.//g' passwd
删除文件每行的第二个字符:sed -r 's/^(.)(.)/\1/g' passwd
删除每行倒数第一个字符:``sed -r ' s/.$//g' passwd
删除每行倒数第二个字符sed 's/(.)(.)$/\2/' passwd
shell编程基础
变量的命名规则:
- 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
- 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
- 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
- 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
- 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
- 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数
环境变量:可以向下继承的变量 ,可以使子继承父进程 ,但父进程无法继承子进程 。 一般只用于文件配置例如 PATH,USER,PS1,PWD...
用户可以使用export
来自己声明环境变量
例如:export MYSQL_HOME = /etc/mysql
位置变量:位置变量通常用于为 Shell 脚本或函数传递所需的参数
点击查看代码
例如:$1表示传递给shell脚本的第1个参数
$2表示传递给shell脚本的2参数
............依次类推
$0 命令本身,包括路径
$* 传递脚本的所有参数,全部参数合成一个字符串
$@ 传递给脚本所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数
状态变量:
点击查看代码
$$ 获取当前shell的进程号(pid)
$! 执行上一个指令的pid,上一个后台运行进程的进程号
$? 获取执行上一个指令的返回值(0为成功,非零为失败)
$_ 在此之前执行的命令(上一个命令)或脚本的最后一个参数
只读变量:可以使用 declare -r 命令或 readonly 命令将变量声明为只读。
只读变量一旦赋值后,其变量值将不能被改变
shell解决鸡兔同笼问题
问题:鸡和兔子头共有30只 ,腿共有80只。问鸡有几只,兔子有几只。
for循环创建100个用户
(1)for 遍历1..100
(2)用户ID是否存在
(3)用户存在说明存在,不存在则输出用户添加成功
点击查看代码
#遍历1到100
for i in {1..100}
do
#判断用户是否存在 ,不存在则输出重定向到/dev/null并创建用户 输出创建成功信息
if ! id user$i &>/dev/null;then
#创建用户 用户名为 user + i
useradd user$i
echo "user$i User create sucessful "
else
#输出创建失败信息
echo "user$i USer already exists"
fi
done