Linux系列教程——Linux文件编辑、Linux用户管理

Linux文件编辑

1.VIM基本概述

1.什么是VIM?

vi和vim是Linux下的一个文本编辑工具。(可以理解为windows的记事本,或word文档)

2.为什么要使用VIM?

因为Linux系统一切皆为文件,而我们工作最多的就是修改某个服务的配置(其实就是修改文件内容)。也就是说如果没有vi/vim,我们很多工作都无法完成。PS: vim是学习linux最重要的命令之一

3.VI与VIM有什么区别?

vi和vim都是文本编辑器,只不过vim是vi的增强版,比vi多了语法高亮显示,其他编辑功能几乎无差,所以使用vi还是vim取决个人习惯。(相当于windows系统下的文本编辑软件“记事本”与”notepad++”的区别)PS:因为前期最小化安装CentOS系统,所以默认情况下没有vim命令,但可以使用yum install vim -y安装

4.如何使用VIM编辑器?

在使用VIM之前,我们需要先介绍下VIM的三种模式: 普通模式、编辑模式、命令模式,每种模式分别支持多种不同的快捷键,要想高效率地操作文本,就必须先搞清这三种模式的操作区别以及模式之间的切换方法。img

5.VIM模式三种模式介绍

1.普通模式: 主要是控制光标移动,可对文本进行复制、粘贴、删除等工作。使用vim filename 编辑一个文件时,一进入该文件就是普通模式了。在这个模式下,可以进行光标移动、复制、删除、粘贴操作。
2.编辑模式: 主要进行文本内容编辑和修改从普通模式进入编辑模式,只需你按一个键即可(i, I, a, A, o, O)当进入编辑模式时,会在屏幕的最下一行会出现 “INSERT”标记从编辑模式回到普通模式只需要按键盘左上方的 ESC 键即可。
3.末行模式: 主要用于保存或退出文本。在普通模式下,输入 “:” 或者 “/“ 即可进入命令模式。在命令该模式下,可进行的操作有,显示行号、搜索、替换、保存、退出。
小结: vim编辑打开文件整体流程如下:1.默认打开文件处于普通模式2.从普通模式切换至编辑模式需要使用a、i、o3.编辑模式修改完毕后需要先使用ECS返回普通模式4.在普通模式输入”:”或”/“进入命令模式,可实现文件的保存与退出。PS: 在vim中,无法直接从编辑模式切换到命令模式。

2.VIM模式使用

1.普通模式

#1.命令光标跳转
G       #光标跳转至末端
gg      #光标跳转至顶端
Ngg     #光标跳转至当前文件内的N行
$       #光标跳转至当前光标所在行的尾部
^或者0     #光标跳转至当前光标所在行的首部

#2.文件内容较多
ctrl+f  #往下翻页(行比较多)
ctrl+b  #往上翻页


#3.复制与粘贴
yy      #复制当前光标所在的行
5yy     #复制当前光标以及光标向下4行
 
p(小写)   #粘贴至当前光标下一行   
P(大写)   #粘贴至当前光标上一行


#4.删除、剪贴、撤销  
dd      #删除当前光标所在的行   
4dd     #删除当前光标所在的行以及往下的3行
dG      #删除当前光标以后的所有行
D       #删除当前光标及光标以后的内容  
x       #删除当前光标标记往后的字符
X       #删除当前光标标记往前的字符
dd & p  #剪贴、先删除dd(number dd),后粘贴p
u       #撤销上一次的操作


#5.替换
r       #替换当前光标标记的单个字符
R       #进入REPLACE模式, 连续替换,ESC结束

2.编辑模式(从普通模式进入到编辑模式)

i   #进入编辑模式,光标不做任何操作
a   #进入编辑模式,将当前光标往后一位
o   #进入编辑模式,并在当前光标下添加一行空白内容


I   #进入编辑模式,并且光标会跳转至本行的头部
A   #进入编辑模式,将光标移动至本行的尾部
O   #进入编辑模式,并在当前光标上添加一行空白内容

3.命令模式,主要用于搜索, 保存, 退出文件。

#1.文件保存与退出
:w      保存当前状态
:w!     强制保存当前状态
:q      退出当前文档(文档必须保存才能退出)
:q!     强制退出文档不会修改当前内容
:wq     先保存,在退出
:wq!    强制保存并退出
:x      先保存,在退出
ZZ      保存退出, shfit+zz
:number 跳转至对应的行号
:set nu 显示行号
:set nonu 不显示行号

#2.文件内容查找
/string #需要搜索的内容(查找)
n       #按搜索到的内容依次往下进行查找
N       #按搜索到的内容依次往上进行查找


#3.文件内容替换
:1,5s#sbin#test#g   #替换1-5行中包含sbin的内容为test
:1,5s#sbin#test#   #只替换1-5行中第一个包含sbin的内容为test
:%s#sbin#test#g     #替换整个文本文件中包含sbin的替换为test
:%s#sbin#test#gc    #替换内容时时提示是否需要替换


#4.文件内容另存
:w /root/test.txt  #将所有内容另存为/root/test.txt文件中


#5.文件内容读入
:r  /etc/hosts  #读入/etc/hosts文件至当前光标下面
:5r /etc/hosts  #指定插入/etc/hosts文件至当前文件的第五行下面

4.视图模式(从普通模式进入视图模式),主要进行批量操作

ctrl+v  进入可视块模式,选中需要注释的行
    1.插入:按shift+i进入编辑模式,输入#,结束按ESC键
    2.删除:选中内容后,按x或者d键删除
    3.替换:选中需要替换的内容, 按下r键,然后输入替换后的内容


shift+v 进入可视行模式,选中整行内容
    1.复制:选中行内容后按y键及可复制。
    2.删除:选中行内容后按d键删除。

3.VIM扩展知识

1.环境变量临时生效

:set nu             #显示行号
:set ic             #忽略大小写, 在搜索的时候有用
:set ai             #自动缩进
:set list           #显示制表符(空行、tab键)
:set no[nu|ic|ai…]  #取消临时设定的变量

2.环境变量永久生效。~/.vimrc 个人环境变量(优先级高) /etc/vimrc 全局环境变量

# vim  ~/.vimrc #当下次再打开文件自动显示行号并忽略大小写
set nu
set ic

#如果个人vim环境没有配置, 则使用全局vim环境变量配置。
#如果个人vim环境和全局环境变量产生冲突, 优先使用个人vim环境变量。

3.如何同时编辑多个文件

vim -o file1 file2  #水平分割
vim -O file1 file2  #垂直分割

#ctrl+ww 文件间切换

4.相同文件之间差异对比,通常用于对比修改前后差异

# diff      #文件对比   
# vimdiff   #以vim方式打开两个文件对比,高亮显示不同的内容

5.如果VIM非正常退出 (ctrl+z)挂起或强制退出终端没关闭VIM后

#假设打开filename文件被以外关闭,需要删除同文件名的.swp文件即可解决
# rm -f .filename.swp

4.VIM练习示例

1.将/etc/passwd 复制到/root/目录下,并重命名为test.txt2.用vim打开test.txt并显示行号3.分别向下、向右、向左、向右移动5个字符,分别向下、向上翻两页4.把光标移动到第10行,让光标移动到行末,再移动到行首,移动到test.txt文件的最后一行,移动到文件的首行5.搜索文件中出现的 root 并数一下一共出现多少个,不区分大小写搜索6.把从第一行到第三行出现的root 替换成–od–,然后还原上一步操作8.把整个文件中所有的root替换成–od–9.把光标移动到20行,删除本行,还原上一步操作10.删除第19行,还原上一步操作11.删除从5行到10行的所有内容,还原上一步操作12.复制2行并粘贴到11行下面,还原上一步操作(按两次u)13.复制从11行到15行的内容并粘贴到8行上面,还原上一步操作(按两次u)14.把13行到18行的内容移动文件的尾部,还原上一步操作(按两次u)15.光标移动到首行,把/sbin/nologin改成/bin/bash16.在第一行下面插入新的一行,并输入”# Hello!”17.保存文档并退出
2.练习示例2-文件

[root@www ~]# cat proxy.conf
server {
    Listen 8080;
    Server_Name vim.OldboyEDU.com;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forward-for;
        proxy_intercept_errors on;
        proxy_next_upstream error timeout;
        proxy_next_upstream_timeout 3s;
        proxy_next_upstream_tries 2;
        error_page 500 502 403 404 = /proxy_error.html;
    }
    location = /proxy_error.html {
        root /code/proxy;
    }
}

2.练习示例2-题目1.使用vim打开proxy.conf文件2.修改Listen为listen小写,并将8080修改为803.修改ServerName为server_name小写。4.修改vim.OldboyEDU.com为vim.oldboy.com5.在server_name行下插入一行 root /code;5.复制5-14行的内容,然后将其粘贴到14行下面6.删除与proxy_set_header相关的两行全部删除7.如上操作完成后,在13-20行前面加上#号8.删除21-23的行,然后保存当前文件
ver_name小写。4.修改vim.OldboyEDU.com为vim.oldboy.com5.在server_name行下插入一行 root /code;5.复制5-14行的内容,然后将其粘贴到14行下面6.删除与proxy_set_header相关的两行全部删除7.如上操作完成后,在13-20行前面加上#号8.删除21-23的行,然后保存当前文件

2 Linux用户管理

1.用户基本概述

1.什么是用户?

用户指的是能够正常登录Linux或Windows系统(可以理解为你租了房子,能够正常入驻)F:那Linux与Windows系统的用户有什么区别? Q:本质都是登陆系统,只不过Linux支持多个用户同时登陆。F:难道Windows就不算多用户操作系统吗? Q:其实不是,在Windows系统中可以创建多个用户,但不允许同一时刻多个用户登陆系统,但Linux系统则允许同一时刻多个用户同时登陆,登陆后相互之间操作并不影响。
img

2.Linux下的用户有什么用

或者说我们为什么要创建用户?
1.系统上的每一个进程(运行的程序),都需要一个特定的用户运行2.通常在公司是使用普通用户管理服务器,因为root权限过大,容易造成故障。

3.查看用户

如何查看系统中所存在的用户

1.查看当前登录的用户信息

[root@bgx ~]# id    #查看当前所登陆的用户信息
# uid:用户id,系统只能识别uid,不能识别名字,人看名字
# gid:组id
uid=0(root) gid=0(root) groups=0(root)
[root@bgx ~]# id oldboy #查看其它用户的信息
uid=1000(oldboy) gid=1000(oldboy) groups=1000(oldboy)

2.每一个进程都会由一个用户身份运行

[root@bgx ~]# ps aux|less #简单使用一下,不用理解
root      33782  0.0  0.0      0     0 ?        R    02:46   0:00 [kworker/u256:0]
root      35637  0.0  0.0      0     0 ?        R    05:11   0:03 [kworker/0:2]

4.用户存存放位置

Linux系统会将用户的信息存放在/etc/passwd,记录了用户的信息,但没有密码信息,密码被存放在/etc/shadow中。也就是说这两个文件非常的重要,不要轻易删除与修改。
1./etc/passwd 配置文件解释如下图,或者man 5 passwdimg2./etc/shadow 配置文件解释如下图,或者man 5 shadowPS: 使用change修改密码过期时间示例img
4.最后我们需要了解下系统对用户的一个约定?(约定娶你,就真的会娶吗?)

用户UID
系统中约定的含义

0
超级管理员,最高权限,有着极强的破坏能力

1~200
系统用户,用来运行系统自带的进程,默认已创建

201~999
系统用户,用来运行用户安装的程序,所以此类用户无需登录系统

1000+
普通用户,正常可以登陆系统的用户,权限比较小,能执行的任务有限

PS:在CentOS7系统之前, UID1-499用于系统用户, 而UID 500+则用于普通用户

2.用户相关命令

下面我们就围绕着用户的创建、变更、删除等来讲讲涉及到的命令: useradd、usermod、userdel

1.新增用户

使用useradd命令,注意: adduser命令软链接指向useradd命令

#选项
# -u 指定要创建用户的UID,不允许冲突
# -g 指定要创建用户默认组
# -G 指定要创建用户附加组,逗号隔开可添加多个附加组
# -d 指定要创建用户家目录
# -s 指定要创建用户的bash shell  /bin/bash   /sbin/nologin
# -c 指定要创建用户注释信息
# -M 给创建的用户不创建家目录
# -r 创建系统账户,默认无家目录


#1.创建bgx用户,UID5001,基本组students,附加组sa 注释信息:2019 new student,登陆shell:/bin/bash
[root@bgx ~]# groupadd sa
[root@bgx ~]# groupadd students
[root@bgx ~]# useradd -u 5001 -g students -G sa -c "2019 new student" -s /bin/bash bgx

#2.创建mysql系统用户,-M不建立用户家目录 -s指定nologin使其用户无法登陆系统
[root@bgx ~]# useradd mysql -M -s /sbin/nologin
[root@bgx ~]# useradd -r dba -s /sbin/nologin

# 3 
useradd od -u 7777 -G sa -d /tmp/od -s /sbin/nologin
grep "7777" /etc/passwd
# 4 SELinux
getenforce # 查看
setenforce 0 # 临时关闭
cat /etc/selinux/config
SELINUX=disabled

2.修改用户信息

使用usermod命令修改用户信息

#选项
# -u 指定要修改用户的UID
# -g 指定要修改用户基本组
# -G 指定要修改用户附加组,使用逗号隔开多个附加组, 覆盖原有的附加组,-aG追加
# -d 指定要修改用户家目录 -md 旧家搬新家
# -s 指定要修改用户的bash shell
# -c 指定要修改用户注释信息
# -l 指定要修改用户的登陆名
# -L 指定要锁定的用户
# -U 指定要解锁的用户

#1.检查此前创建的用户信息
[root@bgx ~]# grep "bgx" /etc/passwd
bgx:x:5001:503:2019 new student:/home/bgx:/bin/bash

#2.修改bgx用户uid、gid,附加组  -a表示追加
[root@bgx ~]# groupadd -g 5008 network_sa
[root@bgx ~]# groupadd -g 5009 devops
[root@bgx ~]# usermod -u 6001 -g5008 -a -G 5009 bgx

#3.修改bgx用户的注释信息, 用户家目录, 登录shell, 登录名 -l:改名字,-md,把环境也带过去
[root@bgx ~]# usermod -c "2019 new student" -md /bgx -s /bin/sh -l change_bgx bgx

#检查是否修改成功
[root@bgx ~]# grep "bgx" /etc/passwd
bgx_lqz:x:6001:5008:2019 new student:/bgx:/bin/sh
[root@bgx ~]# id change_bgx
uid=6001(change_bgx) gid=5008(network_sa) groups=5008(network_sa),503(sa),5009(devops)
[root@bgx ~]# ll -d /bgx
drwx------. 2 bgx_lqz network_sa 4096 2014-09-23 00:13 /bgx

#4.锁定用户[扩展]
[root@bgx ~]# echo "123" |passwd --stdin change_bgx
[root@bgx ~]# usermod -L change_bgx  #锁定后会无法登陆系统

#5.解锁用户[扩展]
[root@bgx ~]# usermod -U change_bgx

3.删除账户

使用userdel命令删除账户

#选项 -r 删除用户同时删除它的家目录

#1.删除user1用户,但不删除用户家目录和 mail spool
[root@bgx ~]# userdel user1
[root@bgx ~]# ls /var/spool/mail/

#2.-r参数可以连同用户家目录一起删除(慎用)
[root@bgx ~]# userdel -r user1

4.其他

  1. 使用finger命名查询用户信息以及登录信息(yum install finger),示例: finger UserName2) 使用chfn命令修改用户信息(其实是修改注释),示例: chfn UserName3) 使用chsh命令修改用户登录Bash Shell,示例: chsh UserName4) 使用who(当前有哪些用户登录了)、whoami、w检查用户登陆情况
    img

3.用户扩展知识

1.创建流程

前面我们学习如何创建、修改、删除用户,接下来了解下用户的?
1.useradd创建用户时,系统会以/etc/login.defs、/etc/defaults/useradd两个配置文件作为参照物,如果在创建用户时指定了参数则会覆盖/etc/login.defs、/etc/defaults/useradd文件默认配置,如未指定则使用默认。

[root@bgx ~]# grep -Ev "^#|^$" /etc/login.defs
[root@bgx ~]# cat /etc/login.defs
MAIL_DIR    /var/spool/mail  # 定义了邮件路径放在哪
PASS_MAX_DAYS   99999        # 密码过期时间
PASS_MIN_DAYS   0            # 密码最少0天
PASS_MIN_LEN    5            # 密码长度
PASS_WARN_AGE   7            # 7天提醒
UID_MIN                  1000
UID_MAX                 60000
SYS_UID_MIN               201
SYS_UID_MAX               999
GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999
CREATE_HOME yes             # 是否创建home
UMASK           077
USERGROUPS_ENAB yes         # 用户不指定组,默认创建一个同名组
ENCRYPT_METHOD SHA512       # 密码加密算法

[root@bgx ~]# cat /etc/default/useradd
GROUP=100
HOME=/home      #把用户的家目录建在/home中。
INACTIVE=-1     #是否启用账号过期停权,-1表示不启用。
EXPIRE=         #账号终止日期,不设置表示不启用。
SHELL=/bin/bash #新用户默认所有的shell类型。
SKEL=/etc/skel  #配置新用户家目录的默认文件存放路径。
CREATE_MAIL_SPOOL=yes   #创建mail文件。

2.当使用useradd创建用户时,创建的用户家目录下会存在 .bash_ 环境变量相关的文件,这些环境变量文件默认从/etc/skel目录中拷贝。这个默认拷贝环境变量位置是由/etc/defaults/useradd配置文件中定义的。

#故障案例,在当前用户家目录执行了rm -rf .,下次登录系统时出现-bash-4.1$,如何解决!
-bash-4.1$ cp -a /etc/skel/.bash ./
-bash-4.1$ exit
[root@bgx ~]#   #重新连接即可恢复

2.设置、修改密码

创建用户后,如需要使用该用户登陆系统则需要为用户设定密码,设定密码使用passwd命令。建议密码复杂度高一些、长度大于10、出现各种特殊字符、无任何规律(不要出现名字,电话,生日等)PS: 注意事项1.普通用户只允许变更自己的密码,无法修改其他人密码,并且密码长度必须8位字符2.管理员用户允许修改任何人的密码,无论密码长度多长或多短。

#1.使用passwd命令修改用户密码
# passwd        #给当前用户修改密码
# passwd root   #给root用户修改密码
# passwd oldboy #给oldboy用户修改密码,普通用户只能自己修改自己


#2.验证如下几项指标
# passwd                #root管理员用户登陆,修改root用户密码
# passwd lqz     #root用户登陆,修改其他用户的密码
$ passwd root           #普通用户修改root管理员密码
# echo "123" | passwd --stdin lqz    #非交互式修改密码
# 批量创建100个用户,密码都为123456
for i in {1..100}
do
 	useradd test$1
 	echo "123456" |passwd --stdin test$1
done




#3.系统内置变量生成随机字符串(对随机字符串进行md5加密)
[root@bgx ~]# echo $RANDOM|md5sum|cut -c 1-10
d09fe9b1xs
[root@bgx ~]# echo $(echo $RANDOM|md5sum |cut -c 5-14) |tee pass.txt| passwd --stdin lqz

#4.mkpasswd生成随机字符串, -l设定密码长度,-d数子,-c小写字母,-C大写字母,-s特殊字符
[root@bgx ~]# yum install -y expect   //需要安装扩展包
[root@bgx ~]# mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4
|K&13bR)i/

PS: 推荐密码保存套件工具,支持windows、MacOS、Iphone以及浏览器插件Lastpass官方网站

4.用户组的管理

1.什么是用户组

其实就是一种逻辑层面的定义,逻辑上将多个用户归纳至一个组,当我们对组操作,其实就相当于对组中的所有用户操作。

2.组有类别

对于用户来说,组有几种类别?
基本组,用户只能有一个基本组,创建时可通过-g指定,如未指定则创建一个默认的组(与用户同名),简称私有组附加组,基本组不能满足授权要求,创建附加组,将用户加入该组,用户可以属于多个附加组img

3.组的信息位置

组账户信息保存在/etc/group和/etc/gshadow两个文件中。重点关注group
1./etc/group 配置文件解释如下图

head -1 /etc/group

img2./etc/gshadow 配置文件解释如下图img

1 groupadd新增组

使用groupadd命令新增组,groupadd [-g GID] groupname

#创建基本组, 不指定gid
[root@bgx ~]# groupadd no_gid
[root@bgx ~]# tail -n1 /etc/group
no_gid:x:1000:

#创建基本组, 指定gid为5555
[root@bgx ~]# groupadd -g 5555 yes_gid
[root@bgx ~]# tail -n1 /etc/group
yes_gid:x:5555:

#创建系统组,gid从201-999
[root@bgx ~]# groupadd -r sys_group
[root@bgx ~]# tail -n1 /etc/group
sys_group:x:990:

2 groupmod修改组

使用groupmod命令修改组

#-g 修改组gid
[root@bgx ~]# groupmod -g 1111 no_gid
[root@bgx ~]# tail -1 /etc/group
no_gid:x:1111:

#-n 修改组名称(把yes_gid名字改为active_group)
[root@bgx ~]# groupmod yes_gid -n active_group 
[root@bgx ~]# tail -1 /etc/group
active_group:x:5555:

3.groupdel删除组,

删除时需要注意,如果用户存在基本组则无法直接删除该组,如果删除用户则会移除默认的私有组,而不会移除基本组。

# 私有组的情况,直接删除用户,组也就没了
[root@bgx ~]# userdel jack

#删除组
[root@bgx ~]# groupdel active_group

#删除用户附加组
[root@bgx ~]# id lqz
uid=1069(lqz) gid=5005(lqz) groups=5005(lqz),5004(devops)
[root@bgx ~]# groupdel devops
[root@bgx ~]# id lqz
uid=1069(lqz) gid=5005(lqz) groups=5005(lqz)

#无法删除用户基本组
[root@bgx ~]# groupdel network_sa
groupdel: cannot remove the primary group of user 'bgx_lqz'
#只有删除用户或者用户变更基本后,方可删除该组

4 gpasswd设置组密码

使用gpasswd设置组密码[扩展,可以不会]

[root@bgx ~]# groupadd devops
[root@bgx ~]# gpasswd devops
Changing the password for group devops
New Password:
Re-enter new password:

5 newgrp切换基本组身份

使用newgrp命令切换基本组身份[扩展,可以不会]

#1.检查账户信息
[root@bgx ~]# useradd lqz
[root@bgx ~]# id lqz
uid=1069(lqz) gid=5005(lqz) groups=5005(lqz)

#2.切换普通用户
[root@bgx ~]# su - lqz

#3.创建新文件,查看文件的属主和属组
[lqz@bgx ~]$ touch file_roots
[lqz@bgx ~]$ ll
-rw-rw-r-- 1 lqz lqz 0 Jun 13 10:06 file_roots

#4.使用newgrp切换到devops组
[lqz@bgx ~]$ newgrp devops
Password:

#5.创建文件,检查属主和属组
[lqz@bgx ~]$ touch file_test
[lqz@bgx ~]$ ll
-rw-rw-r-- 1 lqz lqz 0 Jun 13 10:06 file_roots
-rw-r--r-- 1 lqz devops     0 Jun 13 10:08 file_test

5.用户如何提权

往往公司的服务器对外都是禁止root用户直接登录,所以我们通常使用的都是普通用户,那么问题来了?当我们使用普通用户执行/sbin目录下的命令时,会发现没有权限运行,这种情况下我们无法正常的管理服务器,那如何才能不使用root用户直接登录系统,同时又保证普通用户能完成日常工作?PS: 我们可以使用如下两种方式: su、sudo1.su切换用户,使用普通用户登录,然后使用su命令切换到root。优点:简单 缺点:需要知道root密码2.sudo提权,当需要使用root权限时进行提权,而无需切换至root用户,优点:安全、方便 缺点:复杂

1.su身份切换

在使用su切换前,我们需要了解一些预备知识,比如shell分类、环境变量配置文件有哪些
1.Linux Shell主要分为如下几类交互式shell,等待用户输入执行的命令(终端操作,需要不断提示)非交互式shell,执行shell脚本, 脚本执行结束后shell自动退出登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
2.bash shell配置文件介绍(文件主要保存用户的工作环境)个人配置文件:~/.bash_profile ~/.bashrc 。
全局配置文件:/etc/profile /etc/profile.d/.sh /etc/bashrcprofile类文件, 设定环境变量, 登陆前运行的脚本和命令。bashrc 类文件, 设定本地变量, 定义命令别名PS: 如果全局配置和个人配置产生冲突,以个人配置为准。
3.登陆系统后,环境变量配置文件的应用顺序是?登录式shell配置文件执行顺序: /etc/profile->/etc/profile.d/
.sh->/.bash_profile->/.bashrc->/etc/bashrc非登陆式shell配置文件执行顺序: ~/.bashrc->/etc/bashrc->/etc/profile.d/*.shPS: 验证使用echo在每行添加一个输出即可
4.说了这么多预备知识,那这些和su命令切换用户有什么关系?su - username属于登陆式shell,su username属于非登陆式shell,区别在于加载的环境变量不一样。su username 属于非登陆式shell
普通用户su -可以直接切换至root用户,但需要输入root用户的密码。超级管理员root用户使用su - username切换普通用户不需要输入任何密码。

#1.普通用户使用su切换root
[lqz@node1 ~]$ su 
密码:         #输入root的密码
[root@node1 lqz]# pwd
/home/lqz

#2.普通用户使用su -切换到root,会加载root的环境变量
[lqz@node1 ~]$ su -
密码:
[root@node1 ~]# pwd
/root

#3.以某个用户的身份执行某个服务,使用命令su -c username
[root@bgx ~]# su - lqz -c 'ifconfig'
[root@bgx ~]# su - lqz -c 'ls ~'

#4 其他
yum provides pstree
yum install psmisc
pstree

# 5 关闭root远程登陆,普通用户登进来,su - 切换到root用户
vim /etc/ssh/sshd_config
PermitRootLogin yes  # 设成no

2.sudo提权

su命令在切换用户身份时,如果每个普通用户都能拿到root用户的密码,当其中某个用户不小心泄漏了root的密码,那系统会变得非常不安全。为了改进这个问题,从而产生了sudo这个命令。
其实sudo就相当于给某个普通用户埋下了浩克(hulk)的种子,当需要执行一些高级操作时,进行发怒,但正常情况下还是普通人,还是会受到限制。img
1.如何快速埋下hulk的种子呢?

#1.快速配置sudo方式[先睹为快]
[root@node1 ~]# usermod bgx -G wheel # 把用户加到wheel组中
[root@node1 ~]$ sudo tail -f /var/log/secure    #sudo审计日志

#2.一般正常配置sudo方式
[root@www ~]# #visudo => vim /etc/sudoers
#1.用户名  2.主机名=(角色名)       4.命令名
bgx       ALL=(ALL)         /usr/bin/yum,/usr/sbin/useradd   #允许使用sudo执行命令
oldboy   ALL=(ALL)          NOPASSWD:/bin/cp, /bin/rm   #NOPASSWD不需要使用密码

visudo -c # 检查刚刚编辑的是否有错误
sudo -l  # 对主机有哪些权限

2.埋下了hulk种子后又如何提权使用呢?

#1.切换普通用户
[root@bgx ~]# su - lqz

#2.检查普通用户能提权的命令
[lqz@lqz ~]$ sudo -l
User lqz may run the following commands on this host:
    (ALL) ALL

#3.普通用户正常情况下是无法删除opt目录的
[lqz@lqz ~]$ rm -rf /opt/
rm: cannot remove `/opt: Permission denied

#4.使用sudo提权,需要输入普通用户的密码。
[lqz@lqz ~]$ sudo rm -rf /opt

3.开启某个命令的使用权限

提升的权限太大,能否有办法限制仅开启某个命令的使用权限?其他命令不允许?
第一种方式:使用sudo中自带的别名操作,将多个用户定义成一个组,这个组只有sudo认可

[root@bgx ~]# visudo  #也可以使用vi /etc/sudoers来配置
# 1.使用sudo定义分组,这个系统group没什么关系
User_Alias OPS = oldboy,alex
User_Alias DEV = bgx,py

# 2.定义可执行的命令组,便于后续调用
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount
Cmnd_Alias DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

# 3.使用sudo开始分配权限
OPS  ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES
DEV  ALL=(ALL) SOFTWARE,PROCESSES

#4.登陆对应的用户使用 sudo -l 验证权限

第二种方式:使用groupadd添加组,然后给组分配sudo的权限,如果有新用户加入,直接将用户添加到该组.

#1.添加两个真实的系统组,  group_dev group_op
[root@www ~]# groupadd group_dev
[root@www ~]# groupadd group_op

#2.添加两个用户,      group_dev(user_a  user_b)   group_op(user_c  user_d)
[root@www ~]# useradd user_a -G group_dev
[root@www ~]# useradd user_b -G group_dev
[root@www ~]# useradd user_c -G group_op
[root@www ~]# useradd user_d -G group_op

#3.记得添加密码
[root@www ~]# echo "1" | passwd --stdin user_a
[root@www ~]# echo "1" | passwd --stdin user_b
[root@www ~]# echo "1" | passwd --stdin user_c
[root@www ~]# echo "1" | passwd --stdin user_d

#4.在sudo中配置规则
[root@www ~]# visudo
    Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
    Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
    Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
    Cmnd_Alias STORAGE = /bin/mount, /bin/umount
    Cmnd_Alias DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp
    Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

    %group_dev ALL=(ALL) SOFTWARE
    %group_op ALL=(ALL) SOFTWARE,PROCESSES

#5.检查sudo是否配置有错
[root@www ~]# visudo -c
/etc/sudoers: parsed OK


#6.检查user_a,和user_d的sudo权限
[user_a@www.oldboyedu.com ~]$ sudo -l
User user_a may run the following commands on www:
    (ALL) /bin/rpm, /usr/bin/yum

[user_d@www.oldboyedu.com ~]$ sudo -l
User user_d may run the following commands on www:
    (ALL) /bin/rpm, /usr/bin/yum, /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

4.sudo命令的执行流程

  1. 普通用户执行sudo命令时, 会检查/var/db/sudo是否存在时间戳缓存2) 如果存在则不需要输入密码, 否则需要输入用户与密码3) 输入密码会检测是否该用户是否拥有该权限4) 如果有则执行,否则报错退出
    img
    sudo不支持系统内置命令

版权声明:本文为m0_67155975原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。