一、文本编辑工具 vi/vim
vim是vi的增强版,操作方式两个基本一致
vi/vim 是一个模式编辑器
编辑模式
移动光标操作:j 向下移动、k 向上移动、l 向右移动、h 向左移动
替换操作
修改单独某个字符:r 修改一个字符、R 进入替换模式、使用esc 退出替换模式
编辑模式 → 插入模式
编辑模式输入字母 i a o I A O 都可进入插入模式
i 在光标前插入内容
a 在当前光标后输入内容
o 开启新的一行输入内容
I 在行首插入内容
A 在行尾插入内容
O 在光标当前行的上一行插入内容
编辑模式下的操作
dd: 删除光标所在的行【剪贴】
yy: 复制光标所在的行
p: 将剪贴/复制的内容,粘贴到当前所在的行的下一行
P: 将剪贴/复制的内容,粘贴到当前所在的行的上一行
/搜索的内容: 在 / 后面输入要搜索的内容,就可以直接开始搜索了
n: 继续向下搜索
N: 继续向上搜索
按 dd 删除一行
按 4dd 删除连续的四行
按 yy 复制一行
按 15yy 复制连续的十五行
末行模式下的操作
数字: 直接跳转到指定的行的行首
1 就是跳转到第一行
500 就是跳转到第五百行
$ 就是跳转到最后一行
set nu: 在每一行的前面,显示一个行号
set nonu: 取消每行前面的行号
nohl: 取消高亮
w: 保存
q: 退出
!: 强制执行
wq: 保存退出
q!: 强制退出
wq!: 强制保存退出
特殊操作
- 通过 vi 执行系统命令 :! command
- 将命令执行结果写入到文件中 :r ! command
- 将其他文件的内容输入到当前文件当中 :r /tmp/2.txt
- 设置tab键缩进字符数量 :set tabstop=4
- 复制指定内容到目标位置下 :start,stop co dest :3,5 co 7
- 删除指定的内容 :start,stop d :3,5 d
- 剪贴内容到目标位置 :start,stop p :3,5 m 9
vi/vim 编辑器的配置文件
/etc/vimrc 全局配置文件,对所有用户生效
~/.vimrc: 用户的单独配置文件,只对自己生效 对其他用户不生效【强烈建议使用这种方式修改vim的配置文件】
vim同时打开多个文件
:next 跳转到下一个文件
:prev 跳转到上一个文件
:first 跳转到第一个文件
:last 跳转到最后一个文件
同屏打开多个文件,切换文件之间的编辑操作 使用 ctrl + w + wvim -o 水平方向同屏显示多个文件
vim -O 垂直方向同屏显示多个文件
打开文件异常
警告信息产生警告的原因1. 用 vi 打开文件后,写入了内容,但是这个文件被意外关闭了【例如 直接关闭终端】2. 文件被意外关闭,会产生一个崩溃缓存文件,这个文件是一个隐藏文件,而且这个文件的后缀是 .swp3. 就是由于这个崩溃缓存文件的存在,才导致每次打开文件的是有一个警告信息解决方法删除所有的崩溃缓存文件,就不再产生警告了
二、用户管理
2.1用户的类别
每个用户都有一个唯一编号,编号称为用户UID
linux有三类用户:
管理员用户
- 只有一个
- 名字:root
- 管理员uid是:0 【linux中,uid是0的用户,就是管理员】
- 家目录:/root
- 权限:最高
- 可以执行的操作:可以执行任意的操作
系统用户
- uid是 1-500
- 通常无法登录系统,而且也没有用户家目录
- 系统用户的作用是用来运行一个特定的程序
普通用户
- 可以有多个【你自己创建的用户,默认就是普通用户】
- 普通用户的名字是自定义的
- 普通用户的uid大于0
- 家目录:/home下和用户名同名的那个目录,就是用户的家目录【在创建用户的时候,会自动的创建用户家目录】
- 权限:非常低
- 可以执行的操作:普通用户,只能在自己的家目录和/tmp下执行操作
2.2相关的配置文件
/etc/passwd
/etc/shadow
/etc/group
/set/skel
/etc/passwd
这个文件中,存储的是当前系统中,所有的用户
这个文件中,每行是一个用户【文件有多少行,就有多少个用户】
这个文件的每一行,都是由:分割成的一段一段的
第一段:用户名
第二段:密码占位符【为了安全,将密码放到了另一个位置】
第三段:用户uid 【管理员的uid是 0】
第四段:用户gid 【用户所在的组的编号】
第五段:这个是用户的描述信息,可以随便写,也可以空着
第六段:用户家目录位置
第七段:这个表示用户的shell类型
可以登录系统的shell类型:/bin/bash 和 /bin/sh
每新增一个用户,就会在这个文件中添加一行
每删除一个用户,这个文件就会自动删除相关的一行
/etc/shadow
这个文件中,存储的是用户的密码
/etc/group
记录用户组
/set/skel
用户家目录的来源
每创建一个用户,系统默认复制/set/skel到/home下,并改名为用户名
2.3相关命令
命令1:id
作用:查看用户是否存在
格式:id 用户名
结果:如果用户存在,就会显示用户id;如果用户不存在,就会提示无此用户
命令2:useradd
作用:新建用户
格式:useradd 用户名
选项:
-c:添加用户描述信息
-d:指定用户家目录的位置
-g:创建用户的时候指定用户的gid
-u:指定用户的uid,uid是唯一的
-M:创建用户,但不创建家目录
-p:创建用户的同时创建用户密码
-s:创建用户并且指定用户的shell类型 默认是/bin/bash /sbin/nologin
-G:创建用户并且修改指定用户的附加组
命令3:usermod
作用:修改用户
格式:usermod 用户名
选项:
-g:修改用户的基本组 用户修改了组id后,用户家目录下所有文件的组也随之变化,其他目录此用户创建的文件不发生变化
-G:修改用户的附加组
-u:修改用户的uid
-l:修改用户名
-d:修改用户的家目录,修改家目录后,需要将原有家目录的隐藏文件一并复制或者移动到新的家目录下
-m:将原有家目录下的内容一并移动过去
-L:锁定账户不能登录系统
-s:修改shell类型
命令4:userdel
作用:删除用户
格式:userdel 用户名
选项:-r:删除用户并删除用户的家目录
命令5:passwd
作用:修改用户的密码
格式:passwd 用户名
选项:
-S:查看密码信息
-l:锁定用户密码
-u:解锁用户密码
-d:删除密码
注意:普通用户只能修改自己的密码,管理员可以修改所有用户的密码
命令6:groupadd
作用:新建用户组 【用户组其实就是多个用户的集合】
格式:groupadd 组名
选项:
-g:设置一个组id
-n:更改组的名字
命令7:groupdel
作用:删除组
格式:groupdel 组名
2.4用户切换
注意:
在日常工作中,平时登录系统的时候,为了安全,都是以普通用户身份来登录linux的
用普通用户身份登录,权限很低,很安全,但是由于权限太低,导致很多工作无法实现,那么这个时候,就必须要切换用户身份。
切换用户有两种方法
- su
- sudo
su切换
命令格式:
su - 用户名
-:继承环境变量
注意:
从root切换到其他用户,切换的时候不需要输入密码。
如果是从普通用户切换到root用户,或者是从普通用户切换到其他的普通用户,就必须输入密码。
切换到其他用户以后,如果想返回到之前的用户,可以执行名exit
优势:使用简单
缺点:root密码容易泄露、普通用户可指定的操作不可控
sudo切换
sudo的作用:给普通用户授权,使普通用户可以执行特定的操作权限,相较于su操作复杂
优势:
- 不需要拥有root密码
- 用户可执行的命令都是预先设置好的(用户不可以执行权限以外的操作)
- 可以记录每个用户所执行过的所有命令
sudo授权过程
实现让jack001可以用root身份去执行两个命令:touch和mkdir
实现让jack002可以用root身份执行所有命令
第对jack001和jack002进行授权【在root账号中进行操作】
visudo
打开sudo的配置文件,然后再文件的第100行下面添加一行内容
jack001 ALL=(root) /usr/bin/touch,/usr/bin/mkdir
jack002 ALL=(root) ALL
用户名 主机=切换的用户 可执行的命令
用户名:普通用户的名称
主机:可以在那个主机上执行特定的命令
ALL 任意主机
localhost 表示当前主机
hostname 表示使用具体的主机名
x.x.x.x 表示使用IP地址来标识主机(192.168.240.252)
x.x.x.x/netmask 表示使用的是一个网段
切换的用户:切换到指定的用户来执行后面的命令,一般情况都是切换到root用户
表达方式 (ALL)最常用的 (root) 空
可执行的命令
格式:命令1,命令2..... /usr/sbin/useradd
/usr/sbin/* 可以使用通配符
可执行命令不能使用命令名称,必须使用命令的绝对路径
注意:
- 使用visudo命令修改sudo配置文件,如果修改正确不给出提示,如果修改错误(配置文件有错误的情况下)给出提示,并阻止保存
- 使用sudo命令,提示输入当前用户密码,但是再次使用相同命令则不需要使用密码。第一次输入的密码回生成一个秘钥保存起来,有效期5分钟,在5分钟内再次执行这个歌命令,则不需要使用密码
授权格式扩展:
zz2 ALL(root) /usr/bin/passwd
zz2 ALL(root) ALL
zz2 ALL= /usr/bin/passwd
zz2 ALL=(ALL) /usr/bin/passwd
zz2 ALL=(ALL) /usr/bin/* *表示可以执行/usr/bin/下的所以命令
%zz2 ALL=(root) /usr/bin/passwd zz2用户组中的所有用户都可以执行passwd命令
zz2 ALL=(root) NOPASSWD:/usr/bin/passwd zz2用户使用passwd命令的时候可以不输入密码
%zz2 ALL= NOPASSWD:ALL
%zz2 ALL= /usr/sbin/*,!/usr/sbin/usermod zz2用户组中所有的用户可以执行/usr/sbin下除usermod以外的命令
案例 :zz2用户可以修改其他用户的密码 但是不能修改root用户的密码
zz2 ALL=(root) /usr/sbin/tcpdump,NOPASSWD: /usr/bin/passwd,!/usr/bin/passwd root
sudo实际使用:给普通用户用vi执行系统用户的文件,这种情况就存在提权
sudo【选项】-l:查看当前用户的授权信息
-k:使当前主机的sudo秘钥立刻生效
visudo -c 检查sudo配置文件是否语法错误
三、文件的权限
3.1 文件的属性
- rw-r--r--. 1 alex gp001 60 3月 17 10:59 abc
文件类型 9个权限位 属主用户名 属组的名字 文件大小 创建时间/编辑时间 文件名
文件类型:
- -:表示是文本文件
- d:表示是目录
文件大小:
默认显示的文件单位是 字节
如果想显示单位 可以用 ls -lh 查看
9个权限位
9个权限位,是为了分为三组
- 前三位:是属主用户具有的权限
- 中三位:是属组用户具有的权限
- 后三位:是其他用户具有的权限
表示权限的时候,顺序是
读 写 执行
如果有权限就显示字母,如果没有权限就显示 -
3.2 权限的类别
- 读权限
- 写权限
- 执行权限
- 无权限
字母表示权限
- r 读权限
- w 写权限
- x 执行权限
- - 表示无权限
控制权限的方法
+ 在原有权限的基础上进行添加,添加权限
- 在原有权限的基础上进行删减,取出权限
= 直接设置最终的权限
权限的对象
- u:文件的属主用户:文件的主人、文件属于谁
- g:文件的属组用户:文件属于哪个组的用户
- o:文件的其他用户
- a:表示以上三种所有用户
示例:
u-x 给属主用户去除掉执行权限a+r 给所有用户添加上读权限o=rw 将其他用户的权限设置为读和写g+rx 给属组用户设置上读和执行权限u-wx 给属主用户去除掉写和执行权限g=rwx 将属组用户的权限设置为可读可写可执行a= 将所有用户的权限都去去掉
chmod 操作内容 文件名
权限的进制表示方式
r w x
4 2 1
各种权限的表示
rwx 数值是表示是 7rw- 数值是表示是 6r-x 数值是表示是 5r-- 数值是表示是 4-wx 数值是表示是 3-w- 数值是表示是 2--x 数值是表示是 1--- 数值是表示是 0
777 权限表示 rwxrwxrwx751 权限表示 rwxr-x--x000 权限表示 ---------111 权限表示 --x--x--x222 权限表示 -w--w--w-
案例:修改a.txt的权限,将属主的权限设置为可读可写可执行,属组的权限设置为可读可执行,其他用户的权限设置为可读
方法 1 :chmod u=rwx a.txtchmod g=rx a.txtchmod o=r a.txt方法 2 :chmod u=rwx,g=rx,o=r a.txt方法 3 :chmod 754 a.txt
3.3 两个命令
chmod命令
作用:修改文件的权限
格式:chmod 【选项】 权限 文件名
选项:
-R:用于设置目录及目录下的子文件的权限
chown命令
作用:修改文件的属主和文件的属组
格式:
chown 【选项】 属主 文件名 仅仅修改文件的属主
chown 【选项】 :属组 文件名 仅仅修改文件的属组
chown 【选项】 属主:属组 文件名 修改文件的属主和属组
选项:
-R:用于修改目录及目录中的子文件的属主和属组
3.4 特殊权限
SUID:
是对程序进行设置,让程序以程序的属主来运行
案例:
第一步:查看cat命令,
which cat
第二步:查看cat命令的详细信息,以及shadow文件的详细信息
ls -l /usr/bin/cat
ls -l /etc/shadow
第三步:用户zz2
用户是否可以执行cat命令? 可以
是否可以用cat来查看shadow文件 不可以
看此时的cat进程的属主是否有访问shadow的权限
此时cat程序是zz2用户发起的,那么cat进程属主就是zz2
但是zz2用户对shadow文件文件没有读权限,所以无法查看该文件
注意:谁发起的进程,进程的属主和属组就是谁
设置SUID的方式
chmod u+s /usr/bin/cat
注意:如果文件的属主拥有执行权限,加上SUID之后就变成s;如果没有执行权限加上SUID之后变成S
设置特殊权限的数字表达方式
SUID:4
SGID:2
Sticky:1
案例:
1、给所有用户加上s权限
chmod 7651 a.txt 7是给所有用户加上S权限,651是给属主,属组,其他用户设置权限
第一个7表示的是特殊权限位
四、扩展内容
4.1 手动生成密码
格式:openssl passwd -1 -salt 'suiji' 123
openssl:是一个开源的软件库,提供了各种加密算法和工具
passwd:是openssl的一个子命令,用于生成加密后的密码
-1:表示使用MD5算法进行加密
-salt ‘suiji’:表示使用随机盐值(salt)进行加密。这里的盐值为‘随机’
123:表示要加密的原始密码为123
这段代码的意思就是:使用openssl工具,通过MD5算法和随机盐值'suiji'对原始密码123进行加密,生成加密后的算法。
可以将生成的密码直接写在/etc/passwd中的密码占位符的位置就可以使用了
也可以这样写
创建用户的同时创建密码
格式1:useradd aaa -p `openssl passwd -1 -salt 'suiji' aaa`格式2:useradd bbb -p $(openssl passwd -1 -salt 'suiji' bbb)
``:反引号的作用是将命令替换成命令的执行结果$():也是将命令替换成命令的执行的结果
4.2 手动创建用户
- /etc/passwd 在文件的最后一行添加一行
- /etc/group 写一行你添加的用户id
- 创建家目录 - 复制 /etc/skel - 修改家目录的属主和属组
- /etc/shadow 写一行【也可以直接在/etc/passwd的密码占位符写】
案例:
- vi /etc/passwd
- 在最后一行添加一个新用户 例如:joker:x:4017:4017::/home/joker:/bin/bash
- 注意:用户uid是唯一的,别忘了修改用户家目录
- vi /etc/group
- 在最后一行添加一个组id 例如:joker:x:4017
- cp -a /etc/skel /home/joker
- chown -R joker:joker /home/joker
- vi /etc/shadow
- 在最后一行给joker添加一个密码 例如:joker:$1$lisjf$DGxx2hGOM7FxCnQ8yEfpy.:19802:0:99999:7:::
- 第二段是加密之后的密码,用的是openssl passwd -1 -salt 'saf' 123 生成的
- 验证是否登录成功
4.3 几个命令
who
whoami
last
lastb
w
lastlog
4.3.1 who命令
作用:检查当前linux的链接会话有几个
[root@localhost ~]# whoroot tty1 2024-03-19 20:22root pts/0 2024-03-19 20:06 (172.16.100.1)root pts/1 2024-03-19 20:10 (172.16.100.1)root pts/2 2024-03-19 20:21 (172.16.100.1)root pts/3 2024-03-19 20:21 (172.16.100.1)bob02 pts/4 2024-03-19 20:21 (172.16.100.1)
第一列:链接linux的用户名第二列:链接linux的类型
- tty:表示是在linux中直接进行的
- pts/0..1:表示是远程连接上来的
第三列:链接的时间
第四列:客户端的ip地址
4.3.2 whoami命令
作用:查看当前会话的用户名
4.3.3 last命令
作用:显示每个用户的登录时间,已经登录的状态
4.3.4 lastb命令
作用:记录现实中每个用户登录失败的信息。每登录失败一次,这里就会记录一次。
案例:
1、统计每个用户的失败次数
lastb | awk -F " " '{print $1}' | sort | uniq -c
sort:排序
uniq -c:统计
4.3.5 w命令
作用:显示每个会话,已经登录的会话正在执行的命令
4.3.6 lastlog命令
作用:显示用户的上一次登录时间等信息
4.4 日志文件
4.4.1 /var/log/messages
系统的日志文件
Mar 19 20:44:50 localhost systemd: Started OpenSSH server daemon.Mar 19 20:44:56 localhost dhclient[768]: DHCPREQUEST on ens36 to 192.168.13.254port 67 (xid=0x64360728)Mar 19 20:44:56 localhost dhclient[768]: DHCPACK from 192.168.13.254(xid=0x64360728)Mar 19 20:44:56 localhost NetworkManager[679]: <info> [1710895496.8349] dhcp4(ens36): address 192.168.13.196Mar 19 20:44:56 localhost NetworkManager[679]: <info> [1710895496.8349] dhcp4(ens36): plen 24 (255.255.255.0)Mar 19 20:44:56 localhost NetworkManager[679]: <info> [1710895496.8349] dhcp4(ens36): gateway 192.168.13.2Mar 19 20:44:56 localhost NetworkManager[679]: <info> [1710895496.8349] dhcp4(ens36): lease time 1800Mar 19 20:44:56 localhost NetworkManager[679]: <info> [1710895496.8349] dhcp4(ens36): nameserver '192.168.13.2'Mar 19 20:44:56 localhost dbus[670]: [system] Successfully activated service'org.freedesktop.nm_dispatcher'Mar 19 20:44:56 localhost systemd: Started Network Manager Script DispatcherService.Mar 19 20:44:56 localhost nm-dispatcher: req:1 'dhcp4-change' [ens36]: newrequest (3 scripts)Mar 19 20:44:56 localhost nm
4.4.2 /var/log/secure
客户端远程登录linux的ssh的日志文件
【下面是使用一个不存在的账号密码进行登录产生的日志文件】
Mar 19 20:48:43 localhost sshd[2956]: Invalid user aaa from 172.16.100.1 port51705Mar 19 20:48:43 localhost sshd[2956]: input_userauth_request: invalid user aaa[preauth]Mar 19 20:49:33 localhost sshd[2956]: pam_unix(sshd:auth): check pass; userunknownMar 19 20:49:33 localhost sshd[2956]: pam_unix(sshd:auth): authenticationfailure; logname= uid=0 euid=0 tty=ssh ruser= rhost=172.16.100.1
4.4.3 apache或者是nginx的日志,例如access_log、error_log
4.4.4 查看日志文件内容变化/分析
tail -f 日志文件
4.4.5 日志文件的滚动
作用:防止日志文件变得过大
日志文件的滚动
- 方法一:基于时间
- 方法二:基于空间