入门功法——Linux简介
Linux操作系统
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的[Red Hat Enterprise Linux](https://baike.baidu.com/item/Red Hat Enterprise Linux/10770503)、SUSE、[Oracle Linux](https://baike.baidu.com/item/Oracle Linux/6876458)等
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。
总结:
- Windows 收费闭源操作系统,主要用于日常办公、游戏、娱乐多一些 -
- Linux 免费的,开源的,主要用于服务器领域,性能稳定,安全
- Unix 用于封闭的硬件环境,企业的应用依赖于定制化开发
内核
- 什么是操作系统?
操作系统是负责整个系统最基本功能和系统管理,包括内核、设备驱动程序、启动引导程序、命令行shell或其它种类的用户界面、基本的文件管理工具和系统工具。
用户界面是操作系统的外在表象,内核是操作系统的内在核心。
- 什么是内核?
内核由一系列程序组成,包括负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理地址空间的内存管理程序、网络、进程间通信的系统服务程序等。
内核负责管理系统的硬件设备。
- 内核空间 VS 用户空间
内核空间表示内核拥有的内存空间,用户空间表示用户程序执行时的内存空间。
内核拥有直接访问硬件设备的所有权限,用户程序不能直接访问硬件设备,因此用户程序通过系统调用和内核通信来运行。
Linux内核
操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
主要的子程序
- 系统调用接口
- 进程管理
- 内存管理
- 虚拟文件系统
Linux内核的功能
1、进程管理
内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出)。不同进程间通讯(通过信号,管道,或者进程间通讯原语)对整个系统功能来说是基本的,也由内核处理。另外,调度器,控制进程如何共享CPU,是进程管理的一部分。更通常地,内核的进程管理活动实现了多个进程在一个单个或者几个CPU 之上的抽象。
2、内存管理
计算机的内存是主要的资源,处理它所用的策略对系统性能是至关重要的。内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间。内核的不同部分与内存管理子系统通过一套函数调用交互,从简单的malloc/free对到更多更复杂的功能。
3、文件系统
Unix 在很大程度上基于文件系统的概念;几乎Unix中的任何东西都可看作一个文件。内核在非结构化的硬件之上建立了一个结构化的文件系统,结果是文件的抽象非常多地在整个系统中应用。另外,Linux 支持多个文件系统类型,就是说,物理介质上不同的数据组织方式。例如,磁盘可被格式化成标准Linux的ext3文件系统,普遍使用的FAT 文件系统,或者其他几个文件系统。
4、设备控制
几乎每个系统操作终都映射到一个物理设备上。除了处理器,内存和非常少的别的实体之外,全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行,这些代码称为设备驱动.。内核中必须嵌入系统中出现的每个外设的驱动,,从硬盘驱动到键盘和磁带驱动器。内核功能的这个方面是本书中的我们主要感兴趣的地方。
5、网络
网络必须由操作系统来管理,因为大部分网络操作不是特定于某一个进程:进入系统的报文是异步事件。报文在某一个进程接手之前必须被收集,识别,分发。系统负责在程序和网络接口之间递送数据报文,它必须根据程序的网络活动来控制程序的执行。另外,所有的路由和地址解析问题都在内核中实现。
Linux的发展历程
https://www.linuxprobe.com/origin-of-linux.html
centos7 的安装
见博客:http://101.37.172.180:8848/archives/vmware虚拟机安装centos7
沟通丹田——初识Shell
shell是系统的用户界面,提供了用户与内核进行交互的一种接口。它接收用户输入的命令并把它送到内核中去执行。实际上Shell是一个命令解释器,它解释用户输入的命令并把用户的意图传达给内核。(可以理解为用户和内核之间的翻译官角色)
Shell 分类
常见的Shell类型有sh, bash, csh, tcsh, ash,bash shell 是Linux默认的shell,
Shell 语法
命令:整条shell命令的主体部分
选项:会影响会微调命令的行为,通常以-或者--开头
参数: 命令作用的对象(长参数,短参数)
bash的基本特性
自动补全
[root@localhost ~]# yum install -y bash-completion.noarch
快捷键
-
Ctrl + l - 清屏
-
Ctrl + A - 光标移到行首
-
Ctrl + E - 光标移到行尾
-
Ctrl + W - 清除光标之前一个单词
-
Ctrl + K - 清除光标到行尾的字符
-
Ctrl + T - 交换光标前两个字符
-
Ctrl + V - 输入控制字符 如Ctrl+v ,会输入^M
-
Ctrl + F - 光标后移一个字符
-
Ctrl + B - 光标前移一个字符
-
Ctrl + H - 删除光标前一个字符
历史命令
[root@localhost ~]# history
选项
- -c:将目前shell中的所有history命令消除(只清空缓存,不清空文件)
- -a:将目前新增的命令写入 histfiles , 默认写入 ~/.bash_history
- -d:删除指定的历史命令
- -r:将 histfiles 内容读入到目前shell的history记忆中
- -w:将目前history记忆的内容写入到 histfiles
- 使用 ! 执行历史命令
# history [n] n为数字,列出最近的n条命令
[root@localhost ~]# history -w histfiles.txt 1
[root@localhost ~]# history -c ! number 执行第几条命令 ! command 从最近的命令查到以 command 开头的命令执行
!! 执行上一条
命令别名(alias)
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
设置别名
[root@localhost ~]# alias cathis='cat /root/.bash_history'
[root@localhost ~]# cathis
取消别名
[root@localhost ~]# unalias cathis='cat /root/.bash_history'
man手册
查看某个命令的 man手册
[root@localhost ~]# man ls
下载安装中文版的man手册
[root@localhost ~]# yum -y install man-pages-zh-CN.noarch
[root@localhost ~]# echo alias cman='man -M /usr/share/man/zh_CN' >> /root/.bashrc
[root@localhost ~]# source .bashrc
[root@localhost ~]# cman ls
打通身体经脉——文件管理
文件系统目录结构
在Linux中,文件以树状图的形式表现出来。其中/ 为根目录 只有一个根目录 。所以也称之为单根文件系统
-
/bin:(Red Hat7以后,该目录被淘汰)
bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 -
/boot:
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 -
/dev :
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。 -
/etc:
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。 -
/home:(普通用户家目录)
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。 -
/root:
该目录为系统管理员,也称作超级权限者的用户主目录。 -
/lib:
lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。 -
/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。 -
/media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。 -
/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。 -
/opt:
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。 -
/proc:
proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-
/sbin:
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。 -
/selinux:
这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。 -
/srv:
该目录存放一些服务启动之后需要提取的数据。 -
/sys:
这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
-
/tmp:
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。 -
/usr:
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。 -
/usr/bin:
系统用户使用的应用程序。 -
/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。 -
/usr/src:
内核源代码默认的放置目录。 -
/var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。 -
/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
文件定位 路径
路径的作用:定位文件
绝对路径:从根目录下出发的路径称为绝对路径
相对路径:相对于当前目录下出发的路径称为相对路径
[root@localhost ~]# cd [路径]
#相对路径
[root@localhost ~]# mkdir test
[root@localhost ~]# cd test
#绝对路径
[root@localhost ~]# cd /root/test
文件管理 (文件操作)
文件(touch)
[root@localhost ~]# touch [fiile-name] # 无则创建,有则修改时间
[root@localhost ~]# touch file1 file2 file3
[root@localhost ~]# touch /home/{file4,file4}
[root@localhost ~]# touch test{1..1000}
# 创建test1-test1000 文件
[root@localhost ~]# touch test{1,10}
# 创建test1 和 test10
目录(mkdir)
[root@localhost ~]# mkdir dir
[root@localhost ~]# mkdir dir1 dir2 dir3
[root@localhost ~]# mkdir dir{1..5}
[root@localhost ~]# mkdir -p /dir/test/dir1
# 递归创建
选项:
-v:将创建的结果打印出来
-p:递归创建
拷贝(cp)
[root@localhost ~]# cp [目标file/目录] [目的file/目录]
[root@localhost ~]# cp /root/dir/test test1
参数
-a:相当于 -pdr 的意思,至于 pdr 请参考下列说明;(常用)
-d:若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l:进行硬式连结(hard link)的连结档创建,而非复制文件本身;
-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
-r:递归持续复制,用于目录的复制行为;(常用)
-s:复制成为符号连结档 (symbolic link),亦即『捷径』文件;
移动(mv)
[root@localhost ~]# mv file1 /root/dir # 将file1移动到/root/dir
[root@localhost ~]# mv file2 /root/dir/file20
# 将file2 移动到 /root/dir 目录下, 并改名为 file20
[root@localhost ~]# mv file3 file4
# 将file3改名为file4
删除(rm)
[root@localhost ~]# rm -f(强制删除) [file_name]
[root@localhost ~]# rm -r(递归删除) [file_name] # 删除目录
[root@localhost ~]# rm -i [file_name] # 交互模式删除
[root@localhost ~]# rm -rf [file_name]
查看(cat)
除此之外还有:tac less more tail tailf'
cat:从上往下(正常顺序)打开
tac:从下网上打开
less:打开较大的文件时,不会一次性加载所有的文件,只会加载一部分,通过空格键向后继续查询
more:跟less类似,只不过more查看完就退出了 显示进度 (空格翻页、q退出)
head:默认从前面查看10行
tail:从后面查看
tailf:实时追踪
下品功法——管道符、重定向与环境变量
重定向
-
输入输出
- 标准输入
- 标准正确输出1
- 标准错误输出2
-
输出重定向
- '>' : 覆盖重定向
- '>>' : 追加重定向
- '2>' : 覆盖重定向错误输出数据流
- '2>>' : 追加重定向错误输出数据流
-
输入重定向
- '<':覆盖输入重定向
- '<<':追加输入重定向
-
标准输出和错误输出各自重定向至不同位置
[root@localhost ~]# commmand 1> /path/file.out 2> /path/error.out /dev/null
-
合并标准输出和错误输出为同一个数据流进行重定向
- '&>':覆盖重定向
- '&>>': 追加重定向
- '2>&1': 将错误流重定向到标准输出文件中
- '1>&2': 将正确流重定向到标准错误输出文件中
-
标准输入
[root@localhost ~]# cat > output <<EOF
> 123
> 456
> 678
> EOF
[root@localhost ~]# cat >> output <<EOF
> 789
> 456
> 123
> EOF
[root@localhost ~]# cat output
管道符命令
通俗来说,把前一个命令原本要输出到屏幕上的内容当成后一个命令的数据 两个命令用 " | " 分隔开
[root@localhost ~]# 命令1 | 命令2 | 命令3
[root@localhost ~]# grep "/sbin/nologin" /etc/passwd | wc -l
15
通过管道符重置用户密码
[root@localhost ~]# echo redhat | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
命令行的通配符
- '*': 代表匹配所有
[root@localhost ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 Oct 18 07:32 /dev/sda
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
- '?': 代表匹配单个字符
[root@localhost ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
- 除了使用[0-9]来匹配 0~9 之间的单个数字,也可以用[135]这样的方式仅匹配这三个指定 数字中的一个,若没有匹配到,则不会显示出来:
[root@localhost ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
[root@localhost ~]# ls -l /dev/sda[135]
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
重要的环境变量
变量是计算机系统用于保存可变值的数据类型。在 Linux 系统中,变量名称一般都是大 写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux 系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件 存放位置等。
变量名 | 作用 |
---|---|
HOME | 用户的主目录(及家目录) |
SHELL | 用户在使用的Shell解释器的名称 |
HISTSIZE | 输出的历史命令条数 |
HISTFILESIZE | 保持的历史命令条数 |
邮件保存路径 | |
LANG | 系统语言,语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
我们可以自己定义变量,例如定义一个变量WORKDIR,方便直接到达用户工作的目录,如下:
[root@localhost ~]# useradd user1
[root@localhost ~]# echo 123 | passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# mkdir /home/user1/test
[root@localhost ~]# WORKDIR=/home/user1/test/
[root@localhost ~]# cd $WORKDIR
[root@localhost test]# pwd
/home/user1/test
但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户所使用。可以使用export命令将其提升为全局变量。
[root@localhost ~]# export WORKDIR
小工具
tr命令
[root@localhost ~]# tr [option] [set1] [set2]
常用选项
-d: 删除
案例1:
将/etc/passwd文件中的前5行的内容转换为大写后保存在/tmp/passwd.out中
[root@localhost ~]# head -n 5 /etc/passwd | tr 'a-z' 'A-Z' > /tmp/passwd.out
[root@localhost ~]# cat /tmp/passwd.out
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
案例2:
[root@localhost ~]# who
root pts/0 2021-10-18 17:51 (192.168.88.1)
[root@localhost ~]# who | tail -n 1 | tr 'a-z' 'A-Z' > /tmp/who.out
[root@localhost ~]# cat /tmp/who.out
ROOT PTS/0 2021-10-18 17:51 (192.168.88.1)
wc命令(统计)
常用选项:
-l: 显示行数
-w: 单词数
-c: 字符数
cut命令(切割命令)
常用选项:
-d: 指定分割符
-f: 指定字段
sort命令(排序文件)
常用选项:
-f: 忽略大小写
-r: 逆序
-t: 字段分割符
-k #: 以指定字段为标准排序
-n: 以数值进行排序
-u: 排序后去重
uniq命令(去重)
常用选项:
-c: 仅显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
案例:
[root@localhost ~]# cut -d: -f6-10 /etc/passwd | cut -f3 | sort -n | uniq -c 1 /bin:/sbin/nologin
1 /home/user1:/bin/bash
1 /root:/bin/bash
1 /root:/sbin/nologin
1 /sbin:/bin/sync
4 /:/sbin/nologin
1 /sbin:/sbin/halt
1 /sbin:/sbin/nologin
1 /sbin:/sbin/shutdown
1 /usr/games:/sbin/nologin
1 /var/adm:/sbin/nologin
1 /var/empty/sshd:/sbin/nologin
1 /var/ftp:/sbin/nologin
1 /var/lib/chrony:/sbin/nologin
1 /var/spool/lpd:/sbin/nologin
1 /var/spool/mail:/sbin/nologin
1 /var/spool/postfix:/sbin/nologin
气运丹田,重构身体——文本编辑器
Linux上也有图形化的文本编辑器,类似windows的记事本,但是很多时候我们也只能用命令行来管理Linux操作系统,所以必须要掌握命令行的文本编辑器软件。
目前常见的文本编辑器有:
- nano: 在debain系列的系统上会比较常见,但是在其他的发行版中也可以安装
- vi: 所有的Unix link 系统都会内置vi 文本编辑器,其他的文本编辑器则不一定会存在
- vim: 具有程序编辑能力的文本编辑器,可以主动以字体颜色辨别语法的正确性,方便设计程序
目前vim是使用最多的,也是比较推荐的Linux文本编辑器
什么是vim
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中 被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是 程序开发者的一项很好用的工具。
连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。
vim是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常 用的键位,在vim官方网站上我们可以找到vim键盘图的完整版,不过对于初学者来说,我们只需要知道常用 的就可以了。
vi/vim的使用
基本上vi/vim共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和末行模式 (Last line mode)。 这三种模式的作用分别是:
命令模式
刚刚启动vim的时候就进入了命令模式
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下 i ,并不会输入一个字符, i 被当作了一个命令。
以下是常用的几个命令:
- i : 切换到命令模式(在当前字符的前面输入)
- a : 切换命令模式(在当前字符后买你输入)
- o : 切换命令模式(在当前行的下一行输入)
- x : 删除当前光标所在位置的字符
- ':' : 切换到末行模式,在最底下一行输入命令
若想要编辑文本:启动Vim,进入了命令模式,按下 i、a、o ,切换到输入模式
命令模式只有一些最基本的命令,因此需要末行模式在输入更多的命令。
输入模式
进入输入模式的命令上面讲到
在输入模式中,可以使用以下按键:
- 字符按键及Shift组合,输入字符
- ENTER 回车键,换行
- DEL 删除键,删除光标后面的一个字符
- hjkl : 方向键,不过这个只能在命令模式中使用
- ESC ,退出输入模式,切换到命令模式
- HOME/END,移动光标到行首/行尾
- Page Up/Page Down,上/下翻页
末行模式
在命令模式下按下:
(英文冒号) 就可以进入末行模式,在末行模式下可用的命令非常多。基本命令有:
- q :退出但不保存
- w : 写入(保存)
- x :保存并退出
详细用法
- 移动光标的方法
h 或 向左 箭头键 (←) | 光标向左移动一个字符 |
---|---|
j 或 向下 箭头键(↓) | 光标向下移动一个字符 |
k 或 向上 箭头键(↑) | 光标向上移动一个字符 |
l 或 向右 箭头键 (→) | 光标向右移动一个字符 |
[Ctrl] + [f] | 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) |
[Ctrl] + [b] | 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
[Ctrl] + [d] | 屏幕『向下』移动半页 |
[Ctrl] + [u] | 屏幕『向上』移动半页 |
+ | 光标移动到非空格符的下一行 |
- | 光标移动到非空格符的上一行 |
n+空格 或者 nl/nh | 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。 例如 20 则光标会向后面移动 20 个字符距离。 |
0 或功能 键[Home] | 这是数字『 0 』:移动到这一行的最前面字符处 (常用) |
$ 或功能 键[End] | 移动到这一行的最后面字符处(常用) |
H | 光标移动到这个屏幕的最上方那一行的第一个字符 |
M | 光标移动到这个屏幕的中央那一行的第一个字符 |
L | 光标移动到这个屏幕的最下方那一行的第一个字符 |
G | 移动到这个文件的最后一行(常用 |
nG | n 为数字。移动到这个文件的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)d |
gg | 移动到这个文件的第一行,相当于 1G 啊! (常用) |
n |
n 为数字。光标向下移动 n 行(常用) |
- 文本的搜索与替换
/word | 向光标之下寻找一个名称为 word 的字符串。 (常用) |
---|---|
?word | 向光标之上寻找一个字符串名称为 word 的字符串。 |
n | 这个 n 是英文按键。代表重复前一个搜寻的动作。 |
N | 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 |
:n1,n2s/word1/word2/g | n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串 取代为 word2 (常用) |
:1,$s/word1/word2/g 或 :%s/word1/word2/g | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用) |
:1,$s/word1/word2/gc 或 :%s/word1/word2/gc | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取 代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用) |
- 删除/剪切、复制与粘贴
x, X | 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) |
---|---|
nx | n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』 |
dd | 删除/剪切光标所在的那一整行(常用) |
ndd | n 为数字。删除/剪切光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用) |
d1G | 删除光标所在到第一行的所有数据 |
dG | 删除光标所在到最后一行的所有数据 |
d$ | 删除游标所在处,到该行的最后一个字符 |
d0 | 那个是数字的 0 ,删除光标所在处,到该行的最前面一个字符 |
yy | 复制游标所在的那一行(常用) |
nyy | n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) |
y1G | 复制游标所在行到第一行的所有数据 |
yG | 复制游标所在行到最后一行的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有数据 |
y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
p, P | p为将已复制的数据在光标下一行贴上,P 则为贴在光标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行 开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用) |
J | 将光标所在行与下一行的数据结合成同一行 |
c | 重复删除多个数据,例如向下删除 10 行,[ 10c ] |
u | 复原前一个动作。(常用) |
[Ctrl]+r | 重做上一个动作。(常用) |
. | 重复前一个动作。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了 (常用) |
- 进入输入或者取代的编辑模式
i, I | 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格 符处开始输入』。 (常用) |
---|---|
a, A | 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在 行的最后一个字符处开始输入』。(常用) |
o, O | 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一 行; O 为在目前光标所在的上一行处输入新的一行!(常用) |
r, R | 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文 字,直到按下 ESC 为止;(常用) |
[Esc] | 退出编辑模式,回到一般模式中(常用) |
- 保存退出,离开的指令
:w | 将编辑的数据写入硬盘中(常用) |
---|---|
:w! | 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的权 限有关 |
:q | 离开 vi (常用) |
:q! | 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存。 |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ | 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出) |
:x | 效果等同于(保存并退出) |
:X | 大写的X,用于加密文件 |
ZQ | 不保存,强制退出。效果等同于:q!。 |
:w [filename] | 将编辑的数据储存成另一个文件(类似文件另存为) |
:r [filename] | 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到光标所在 行后面 |
:n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个文件。 |
:! command | 暂时离开 vi 到bash命令行下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中 察看 /home 底下以 ls 输出的文件信息! |
vim环境变量
root@localhost ~]# vim .vimrc # 当前用户生效
root@localhost ~]# vim /etc/vimrc # 全局生效
# 行号
显示:set number,简写为set nu
取消显示:set nonumber,简写为set nonu
# 括号匹配
匹配:set showmatch,简写为set sm
取消:set nosm
# 自动缩进
启用:set ai
禁用:set noai
# 高亮搜索
启用:set hlsearch
禁用:set nohlsearch
# 语法高亮
启用:syntax on
禁用:syntax off
# 忽略字符的大小写
启用:set ic
不忽略:set noic
# 获取帮助
: help
文件基本属性与文件查找
文件属性
文件时间
任何一个操作系统都有时间的概念,时间的概念主要用于对文件和系统中发生的时间进行记录,在Linux中, 可以使用stat查看Linux系统中文件的时间
stat
用于显示文件时间和inode内容
stat [选项]... 文件...
实例
- stat查看文件时间,这边为了方便我们看的懂,建议改成英文系统环境
root@localhost ~]# export LANG="en_US.UTF-8"
# 改回中文是LANG="zh_CN.UTF-8"
[root@localhost ~]# stat anaconda-ks.cfg
File: ‘anaconda-ks.cfg’
Size: 1241 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33574979 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2021-04-04 17:54:09.700844151 +0800
Modify: 2021-04-04 16:53:30.524854041 +0800
Change: 2021-04-04 16:53:30.524854041 +0800
Birth: -
- Access:访问时间,也叫atime
- 当文件被访问的时候。这个时间就会发生改变
- Linux文件运行的时候查看文件又频繁数量又大,如果每次都刷新atime都要记入硬盘中,长期以来,会给硬盘带来很大的压力。RHEL6开始relatime,atime延迟修改,必须满足其中一个条件:
- 自上次atime修改后,已达到86400秒
- 发生写操作的时候
- Modify:修改时间(内容),也叫mtime
- 当文件内容发生变化的时候,这个时间就会变化
- Change:改变时间(状态)
- 当文件状态被改变的时候,这个时间就会发生变化
文件类型
Linux系统和Windows系统有很大的区别,Windows系统查看文件的后缀名就可以知道这个是什么类型的文 件,比如: test.jpg 这个是一个图片,如果你在windows上双击打开,就会使用支持查看图片的软件打 开。
Linux系统就根本不看文件的后缀名,你认为这个是什么文件,你就使用什么工具打开这个文件,如果打开错 误,就会报错,看下面的案例
root@localhost ~]# cat file
cat: file: Is a directory
当你以为file是个文件,使用cat命令查看的时候,cat会提示你这个是个文件夹,你才反应过来,应该使用cd 命令打开。 所以在Linux中,我们需要使用和windows不一样的方法来判断这个文件的类型。
方法一:ls
使用ls可以查看当前目录下有哪些文件,我们会发现文件夹和文件的颜色并不一样,所以我们可以简单的通过 颜色来进行判断,不过这种判断的方式并不准确,因为不同的Linux发行套件颜色的标准并不一样,不同的远 程管理工具对颜色的理解也有偏差,比如可能把蓝色显示为淡蓝色,而淡蓝色又显示成其他颜色。所以最推荐 的做法是通过 ls -l
查看第一个字母:
- -普通文件(文本文档,二进制文件,压缩文件,电影,图片等等)
- d目录文件(一般为蓝色)
- b块设备文件(块设备)存储设备硬盘,U盘 /dev/sda,/dev/sda1
- c字符设备文件(字符设备)如打印机,终端/dev/tty1,/dev/zero
- s套接字文件
- p管道文件
- l链接文件(一般为淡蓝色)
[root@localhost ~]# type ll
ll 是 `ls -l --color=auto' 的别名
[root@localhost ~]# ll -d /etc/hosts /bin/ls /home /dev/sda /dev/tty1
/etc/grub2.cfg /dev/log /run/dmeventd-client
-rwxr-xr-x. 1 root root 117680 10月 31 2018 /bin/ls
srw-rw-rw-. 1 root root 0 4月 4 16:54 /dev/log
brw-rw----. 1 root disk 8, 0 4月 4 16:54 /dev/sda
crw--w----. 1 root tty 4, 1 4月 4 16:56 /dev/tty1
lrwxrwxrwx. 1 root root 22 4月 4 16:49 /etc/grub2.cfg ->
../boot/grub2/grub.cfg
-rw-r--r--. 1 root root 158 6月 7 2013 /etc/hosts
drwxr-xr-x. 2 root root 6 4月 11 2018 /home
prw-------. 1 root root 0 4月 4 16:54 /run/dmeventd-client
方法二:file
file是专门用来查看文件类型的命令
[root@localhost ~]# file /etc/hosts
/etc/hosts: ASCII text
[root@localhost ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
[root@localhost ~]# file /dev/sda
/dev/sda: block special
[root@localhost ~]# file /dev/tty1
/dev/tty1: character special
[root@localhost ~]# file /etc/grub2.cfg
/etc/grub2.cfg: symbolic link to `../boot/grub2/grub.cfg'
[root@localhost ~]# file /home
/home: directory
[root@localhost ~]# file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)
文件查找
which
用于查找文件
which命令会在环境变量$PATH设置的目录里查找符合条件的文件
[root@localhost ~]# which [filename...]
实例
- 查看ls命令的可执行文件在哪个目录
[root@localhost ~]# which ls
lias ls='ls --color=auto'
/usr/bin/ls
# which会先告诉你ls其实是一个别名
# 然后显示出来ls所在的具体位置
小知识:我们在执行ls的时候,其实执行的是ls -color=auto
这条命令,在显示文件的时候使用不同的颜色表示不同的文件类型,如果我们想执行ls
本体,而不想执行别名,我们可以输入\ls
就可以了,这样就不会就不同颜色的文件类型了。
- 查看poweroff在什么目录
[root@localhost ~]# which poweroff
/usr/sbin/poweroff
locate
用于查找符合条件的文件,他会去保存文件和目录名称的数据库内,查找合乎范本样式条件的文件或者目录
在centos7的最小安装中,并没有自带locate命令,需要输入如下命令进行安装
[root@localhost ~]# yum -y install mlocate
locate命令的使用方式如下
[root@localhost ~]# locate [选项]...[范本样式]...
在使用locate之前,需要更新一下数据库,因为locate只会在数据库中查找文件所在的位置,所以locate查找 速度极快,缺点就是数据库更新并不是实时的,更新数据库有两种方式:
- 手动更新,输入 updatedb
- 默认情况下,updatedb 会每天自动执行一次
选项
- -c:只输出找到的数量
- -n:至多显示 n个输出
- -i:忽略大小写
- -r:使用基本正则表达式
- --regex:使用扩展正则表达式
- -d DBPATH:使用 DBPATH 指定的数据库,而不是默认数据库
/var/lib/mlocate/mlocate.db
实例
- 查找
passwd
文件所在的位置
root@localhost ~]# updatedb
# 更新数据库并不是每次查找都需要,但是建议更新数据库来保证数据是最新的
[root@localhost ~]# locate passwd
- 查找ens33网卡配置文件所在的位置
[root@localhost ~]# locate -r ens33$
/etc/sysconfig/network-scripts/ifcfg-ens33
# $在正则表达式中表示以什么结尾,所以ens33$表示的是以ens33结尾的文件
find
实时查找工具,通过遍历指定路径下的文件系统来完成文件的查找
工作特点:
- 查找速度略慢
- 精确查找
- 实时查找
- 可以满足多种条件的匹配
使用方法如下
find [选项] [路径] [查找条件 + 处理动作]
# 查找路径:指定具体目录路径,默认是当前文件夹
# 查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
# 处理动作:对符合条件的文件做什么操作,默认输出屏幕
查找条件
- 根据文件名查找
root@localhost ~]# find /etc -name "ifcfg-ens33"
[root@localhost ~]# find /etc -iname "ifcfg-ens33" # 忽略大小写
[root@localhost ~]# find /etc -iname "ifcfg*"
- 按照文件大小查找
[root@localhost ~]# find /etc -size +5M # 大于5M
[root@localhost ~]# find /etc -size 5M # 等于5M
[root@localhost ~]# find /etc -size -5M # 小于5M
[root@localhost ~]# find /etc -size +5M -ls # 找到的处理动作-ls
- 指定查找的目录深度
[root@localhost ~]# find / -maxdepth 3 -a -name "ifcfg-ens33" # 最大查找深度
# -a是同时满足,-o是或
[root@localhost ~]# find / -mindepth 3 -a -name "ifcfg-ens33" # 最小查找深度
- 按照时间查找
root@localhost ~]# find /etc -mtime +5 # 修改时间超过5天
[root@localhost ~]# find /etc -mtime 5 # 修改时间等于5天
[root@localhost ~]# find /etc -mtime -5 # 修改时间5天以内
atime: 文件访问时间
ctime: 文件状态修改时间
mtime: 文件内容修改时间
- 按照文件属主,属组查找
[root@localhost ~]# find /home -user atopos # 属主是atopos的文件
[root@localhost ~]# find /home -group atopos
[root@localhost ~]# find /home -user atopos -group atopos
[root@localhost ~]# find /home -user atopos -a -group root
[root@localhost ~]# find /home -user atopos -o -group root
[root@localhost ~]# find /home -nouser # 没有属主的文件
[root@localhost ~]# find /home -nogroup # 没有属组的文件
其中-a
是和,-o
是或
- 按文件类型
root@localhost ~]# find /dev -type d
- 按照文件权限查找
root@localhost ~]# find / -perm 644 -ls
[root@localhost ~]# find / -perm -644 -ls # 权限小于644的
[root@localhost ~]# find / -perm 4000 -ls
[root@localhost ~]# find / -perm -4000 -ls
- 按正则表达式查找
[root@localhost ~]# find /etc -regex '.*ifcfg-ens[0-9][0-9]'
# .* 任意多个字符
# [0-9] 任意一个数字
处理动作
- -print:默认的处理动作,显示到屏幕上
- -ls:类似与对查找到的文件执行ls -l命令
- -delete: 删除查找到的文件
- -fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定的文件中
- -ok COMMAND{}:对查找到的文件执行由COMMAND指定的命令,需要确认
- -exec COMMAND{}:对查找到的文件执行由COMMAND指定的命令,不需要确认
- {}:用于引用查找到的文件名自生
实例
- 查找/var目录下属主为root,且属组为mail的所有文件或目录
[root@localhost ~]# find /var -user root -a -group mail
- 查找/usr目录下不属于root,bin或Hadoop的所有文件或目录
[root@localhost ~]# find /usr -not -user root -not -user bin -not -user Hadoop(centos)
[root@localhost ~]# find /usr -not \(-user root -user bin -user Hadoop\)
- 查找/etc目录下最近一周内容曾被修改过的文件或目录
[root@localhost ~]# find /etc -mtime -7
- 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
[root@localhost ~]# find / \(-nouser -o -nogroup\) -a -atime -7
- 查找/etc目录下大于1M且类型为普通文件的所有文件或目录
[root@localhost ~]# find /etc -size +1M -a -type f
- 查找/etc目录下所有用户都没有写权限的文件
[root@localhost ~]# find /etc -not -perm -222
- 查找/etc目录下至少一类用户没有执行权限的文件
[root@localhost ~]# find /etc -not -perm 111
- 查找/etc/init.d目录下,所有用户都执行权限,且其它用户写权限的文件
[root@localhost ~]# find /etc/init.d -perm -113
功法管理——用户权限管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须向管理员申请一个账号,然后输入这个账号的身份进入系统。
为了更加方便的管理多个用户,就出现了用户组的相关概念,关于用户和用户组:
- 系统上每个进程(运行的程序)都是作为特定用户运行的
- 每个文件是由一个特定的用户拥有
- 访问文件和目录收到用户的限制
- 与正在运行的进程相关联的用户确定该进程可以访问的文件和目录
实现用户账号的管理,主要完成的工作有以下的几个方面:
- 用户账号的添加,删除和修改
- 用户口令的管理
- 用户组的管理
用户和用户组的查看
id
现实用户的ID,以及所属群组的ID
id
会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID
[root@localhost ~]# id [OPTION]... [USER]
- g:显示用户所属群组的ID
- -G:显示用户所属附加组的ID
- -n:显示用户,所属群组或者附加组的名称
- -r:显示实际ID
- -u:显示用户ID
uid的约定
Linux系统会依赖用户的uid数值来判定这个用户的角色,分别如下:
- 0:超级管理员,也就是root,在Linux系统中拥有绝对的权力
- 1~999:系统用户,系统用户往往是用来约束系统中的服务用的
- 1000+:普通用户,可以用来登录和使用Linux操作系统
关于root用户
- uid是0
- 拥有操作系统的所有权利
- 该用户有权力覆盖文件系统上普通权限
- 安装后者删除软件并管理系统文件和目录
- 大多数设备只能有root控制
实例
- 查看当前登录用户的信息
[root@localhost ~]# id
uid=0(root) gid=0(root) 组=0(root) 环境
=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- 查看文件的拥有者
- 查看运行进程的用户名
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 09:06 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 09:06 0:01 [ksoftirqd/0]
root 4 0.1 0.0 0 0 ? R 09:06 0:09 [kworker/0:0]
root 5 0.0 0.0 0 0 ? S< 09:06 0:00 [kworker/0:0H]
相关的文件
Linux一切皆文件,所以用户和用户组相关的信息也都是保存在文本文件中的
passwd文件
用于保存用户信息,一般第一行是root用户,下面都是其他用户
[root@localhost ~]# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 这个格式为用户名:密码:uid:gid:描述:家目录:登陆后执行的命令
shadow文件
格式中密码占位置太长了,所以用x来代替,Linux系统会到shadow文件中查找x部分的密码内容
[root@localhost ~]# head -n 1 /etc/shadow
root:$6$frokclXSnQa8EbKs$pWElbjPlmxjYh30tr8qLsTQVOhuPg7GmW9Sanm2yXAK8TNMgje1gyc
/vwPgqvmSMf6VaoEvveM0gFvtETmXy/.::0:99999:7:::
# 这个格式为用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的
警告天数:密码过期后的宽限时间:账号失效时间:保留字段
密码在 passwd 文件中会使用加密算法加密,所以别想知道我的密码是什么,加密算法默认是 $6 ,这个类 型6的加密算法是sha-512。
group文件
用户和组的对应关系,会保存在group这个文件中
[root@localhost ~]# head -n 1 /etc/group
root:x:0:
# 这个格式是组名:口令:组标识号:组内用户列表
用户组管理
groupadd 添加用户组
groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中
[root@localhost ~]# groupadd [选项] 组名
选项
- -g:指定新建工作组的ID
- -r:创建系统工作组,系统工作组的ID小于500
- -k:覆盖配置文件
/etc/login.defs
- -o:允许添加组ID号不唯一的工作组
- -f:如果指定的组已经存在,此选项将失明了仅以成功的状态退出,当与 -g 一起使用,并且指定的 GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)
实例
[root@localhost ~]# groupadd hr -g 1000
[root@localhost ~]# groupadd sale -g 2000
[root@localhost ~]# groupadd it -g 3000
[root@localhost ~]# groupadd fd -g 4000
[root@localhost ~]# tail -n 4 /etc/group
hr:x:1000:
sale:x:2000:
it:x:3000:
fd:x:4000:
groupmod 修改用户组
groupmod命令用于更改用户组识别码或者名称
[root@localhost ~]# groupmod [选项] 名称
选项
- -g:将组ID改为GID
- -n:改名
- -o:允许重复使用GID
实例
- 修改fd组的名称为finance
[root@localhost ~]# groupmod -n finance fd
[root@localhost ~]# tail -n 1 /etc/group
finance:x:4000:
groupdel:删除用户组
groupdel命令用于删除群组
需要从系统上删除群组时,可用groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用 户,则必须先删除这些用户后,方能删除群组。
[root@localhost ~]# groupdel 组名
实例
- 删除一个用户组
[root@localhost ~]# groupadd test
[root@localhost ~]# groupdel test
gpasswd:用户组成员管理
gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组 中删除
[root@localhost ~]# gpasswd [选项] 组名
选项
- -a:将用户添加到组里面
- -d:从组里删除用户
- -A:指定管理员
- -M:指定组成员和-A的用途差不多
- -R:限制用户登入组,只有组中的用户才可以用newgrp加入该组
实例
- 创建用户test,并且加入it组
[root@localhost ~]# useradd test
[root@localhost ~]# gpasswd -a test it
正在将用户“test”加入到“it”组中
[root@localhost ~]# cat /etc/group |grep it:
it:x:3000:test
# 在组文件中,可以看到这个组的成员
[root@localhost ~]# id test
uid=6667(test) gid=6667(test) 组=6667(test),3000(it)
# 在用户的信息中,可以看到这个用户的所属组
用户管理
useradd:添加用户
uaeradd可以用来添加新的用户
[root@localhost ~]# useradd [选项] 用户名
新建用户home目录下的bash开头的文件时从/etc/skel/中复制过去的
如果创建一个用户时,未指定任何选项,系统会创建一个和用户名相同的组作为用户的 Primary Group
选项
- -c comment:指定一段注释性描述
- -d :指定用户的主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
- -m:创建用户的主目录
- -g:指定用户所属的用户组,默认会创建一个和用户名差不多的用户组
- -G:指定用户的附加组,一个用户可以属于多个附加组
- -s:指定用户登录的shell
- -u:指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号
- -r:创建系统用户
实例
- 添加一般用户
[root@localhost ~]# useradd test1
- 为添加的用户指定相应的用户组
[root@localhost ~]# useradd -g root test2
- 为新添加的用户指定home目录
[root@localhost ~]# useradd -m /home/test3 test3
- 创建一个不给登录的用户
[root@localhost ~]# useradd -s /sbin/nologin test4
usermod:修改用户信息
usermod用于修改用户的的各类设定
[root@localhost ~]# usermod [选项] 用户名
选项
-
-c:修改用户账号的备注信息
-
-a:追加,默认的修改是覆盖
-
-d:修改用户登入时的目录
-
-e:修改账号的有效期限
-
-f:修改在密码过期后多少天关闭该账号
-
-g:修改用户所属群组
-
-G:修改用户所属附加组
-
-l:修改用户账号的名称
-
-L:锁定用户密码,使密码无效
-
-a:修改用户登录后使用是shell
-
-u:修改用户uid
-
-U:解除密码锁定
实例
- 更改登录的目录
[root@localhost ~]# useradd user01
[root@localhost ~]# usermod -d /home user01
[root@localhost ~]# su - user01
-bash-4.2$ pwd
/home
- 改变用户的UID
[root@localhost ~]# usermod -u 6666 user01
userdel:删除用户
userdel命令用于删除用户账号
userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件
[root@localhost ~]# userdel [-r] 用户账号
选项
- -r:删除用户登入目录以及目录中所有的文件
passwd文件中的shell
查看/etc/passwd
文件会发现每一行的最后面是我们登录成功以后执行的命令,其中有两种命令使用最为频繁
/bin/bash
:这个是Linux命令行工具,我么你正常登录后默认进入的就是这个命令行/sbin/nologin
:如果写成nologin,那么用户将无法登录,有些用户是作为进程权限管理而存在的,不需 要登录。如果提供登录的功能反而不安全,所以写成nologin
cat一下/etc/passwd
文件
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
新建一个用户,给他自定义命令
[root@localhost ~]# useradd -s /bin/vi test
[root@localhost ~]# tail -n 1 /etc/passwd
test:x:1000:1000::/home/test:/bin/vi
我们切换到test用户就会发现用户默认进入vi编辑页面
login.defs
useradd参照文件
创建用户时对用户的一些限制,对root用户无效
[root@atopos ~]# vim /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
CREATE_HOME yes
ENCRYPT_METHOD SHA512
[root@atopos ~]# vim /etc/default/useradd
SHELL=/bin/bash
chage
[root@localhost ~]# chage [选项] 用户
选项
- -d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期”
- -E, --expiredate 过期日期 将帐户过期时间设为“过期日期”
- -h, --help 显示此帮助信息并推出
- -I, --inactive INACITVE 过期 INACTIVE 天数后,设定密码为失效状态
- -l, --list 显示帐户年龄信息
- -m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数”
- -M, --maxdays 最大天数 将两次改变密码之间相距的最大天数设为“最大天数”
- -R, --root CHROOT_DIR chroot 到的目录 -W, --warndays 警告天数 将过期警告天数设为“警告天数”
实例
[root@atopos ~]# useradd user01
[root@atopos ~]# echo 123456 |passwd --stdin user01
更改用户 user01 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@atopos ~]# chage -d 0 user01 # 强制用户在下次登录的时候换密码
用户密码管理
root用户可以直接设置普通用户密码,普通用户必须要提供原密码,才可以修改自己密码。
passwd命令
[root@localhost ~]# passwd [选项...] 账号名称
选项
- -n mindays:指定最短使用期限
- -x maxdays:指定最大使用期限
- -w warndays:提前多少天开始警告
- -i inactivedays:非活动期限
- --stdin:从标准输入接收用户密码
实例
[root@localhost ~]# echo "123456" | passwd --stdin username
sudo:提权
以root用户的身份授权普通用户
功法修炼等级限制——文件权限
基本权限 UGO
文件权限时控制某个用户或者用户组访问某个文件的方式
UGO设置基本权限
权限对象
U:属主
G:属组
O:其他人
权限类型
r:读 数字:4
w:写 数字:2
x:执行 数字:1
权限管理
chown:更改文件的属组和属主
[root@localhost ~]# chown user01:user01 file
# 更改属主和属组
[root@localhost ~]# chown :user01 file
# 只更改属组
[root@localhost ~]# chown user01 file
# 只更爱属主
chmod:更改文件权限
对象:u g o a
赋值符号:+ - =
权限类型:r w x 也可以用数字
[root@localhost ~]# chown u+x file # 属主增加执行全新啊
[root@localhost ~]# chown a=rwx file # 所有用户赋予rwx权限
[root@localhost ~]# chown ug=rw,o=r file # 属主属组赋予读写,其他人只读
# 使用数字
[root@localhost ~]# chown 644 file # 属主拥有读写权限,属组和其他用户只读
chown:改变某个文件的属主属组
chmod:改变某个文件自身的权限
r,w,x权限对文件和目录的意义区别
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
r(读取) | 可以读取文件的内容 | 可以列出目录的内容,可以使用ls相关命令 |
w(写入) | 可以更改文件的内容 | 可以创建或删除目录中的文件,可以使用touch,rm等相关命令 |
x(执行) | 可以执行可执行文件 | 可以访问目录里面的内容,可以使用cd等相关命令 |
目录权限跟文件权限无关
ACL设置基本权限(r,w,x)
UGO设置基本权限:只能一个用户或者一个组或者其他人
ACL的基本用法
[root@localhost ~]# setfacl [选项] 文件/目录
选项
- -m:添加acl设定参数
- -x:删除acl设定参数
- -b:移除所有的acl设定参数
- -R:递归添加acl设定参数
- -d:添加默认的acl设定参数(目录)
实例
[root@atopos ~]# ll file1
-rw-r--r--. 1 centos it 0 9月 4 11:03 file1
[root@atopos ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwgroup::r--
other::r--
[root@atopos ~]# setfacl -m u:centos:rw file1 # 增加用户权限
[root@atopos ~]# setfacl -m u:user05:- file1 # 增加用户权限
[root@atopos ~]# setfacl -m o::rw file1 # 修改其他人权限
[root@atopos ~]# ll file1
-rw-rw-rw-+ 1 centos it 0 9月 4 11:03 file1
[root@xwz ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwuser:centos:rwuser:user05:---
group::r--
mask::rwother::rw-
[root@xwz ~]# setfacl -m g:hr:r file1 # 增加组权限
[root@xwz ~]# setfacl -x g:hr file1 # 删除组权限
[root@xwz ~]# setfacl -b file1 # 删除所有acl权限
mask
mask决定了用户对文件的的最高权限,说白了,mask和acl共同控制用户对文件的权限,如果mask权限为r--,acl权限为rwx,则最后的权限只能时r--
mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。
设置mask权限
[root@atopos ~]# setfacl -m m::--- file1
[root@atopos ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwgroup::r-- #effective:---
mask::---
other::---
default
一般正对访问目录,默认权限独立与该目录本身的权限,规定了在该目录中创建文件的默认acl权限
default可以指定在目录中创建的新文件的初始acl权限
实例
用户centos能够对/home以及以后再/home下创建的文件具有读写执行权限
[root@atopos ~]# setfacl -m u:centos:rwx /home
[root@atopos ~]# setfacl -m d:u:centos:rwx /home
[root@atopos ~]# getfacl /home
getfacl: Removing leading '/' from absolute path names
# file: home
# owner: root
# group: root
user::rwx
user:centos:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:centos:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
特殊权限
文件除了上述的r,w,x基本权限,还有三个特殊权限:suid,sgid,sbit(sticky)
suid
suid 属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行文件 时,会拥有该执行文件所有者的权限。如果给一个非二进制文件文件附加 suid 权限,则会显示大写S,属于无效。
普通用户能够执行 passwd 命令修改自己的密码,修改密码其实就是修改 /etc/shadow 这个文件,查 看 /etc/passwd 这个文件的权限,发现除了 root 其他人没有写权限,但是普通用户能够成功执行 passwd ,其原因就在于 passwd 这个命令的权限是 rwsrw---- ,其中 s 的作用就是让执行命令的人具有和 该命令拥有者相同的权限。
[root@atopos ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
实例
[root@localhost ~]# su - user1
[user1@localhost ~]$ passwd
更改用户 user1 的密码 。
为 user1 更改 STRESS 密码。
(当前)UNIX 密码:
- 保持这个会话,新建一个会话,查看系统进程,可以看到当前是root用户在执行passwd命令
[root@localhost ~]# ps -aux |grep passwd
root 7521 0.0 0.1 170760 2052 pts/0 S+ 10:24 0:00 passwd
- 如果想自己添加suid权限,可以输入下面两个命令
chmod u+s file
chmod 4765 file
sgid
sgid 属性可运用于文件或者目录,运用在文件的含义是开放文件所属组的权限给其他用户,即当用户执行 该执行文件时,会拥有该执行文件所属组用户的权限。如果给一个非二进制文件文件附加 sgid 权限,则会 显示大写S,属于无效。
运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样。即如 果 /home/user1 目录具有 sgid 权限,且所属组是 user1 ,则任何用户在 /home/user1 下创建的子目录 或者文件的所属组都是 user1 。
实例
- 设置sgid,让用户在workdir下创建的文件都属于worker组
[root@atopos ~]# mkdir workdir
[root@atopos ~]# chmod g+s workdir/
[root@atopos ~]# cd workdir/
[root@atopos workdir]# touch file2
[root@atopos workdir]# ll
total 0
-rw-r--r--. 1 root root 0 Jan 13 07:04 file
-rw-r--r--. 1 root worker 0 Jan 13 07:05 file2
sbit(sticky)
sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限是777 或者其他。一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件(仅对目录有效)
实例
- 设置sbit,让普通用户只能创建文件,不能删除文件
[root@localhost ~]# chmod 777 /workdir/
[root@localhost ~]# chmod o+t /workdir/
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ touch user1file
[user1@localhost workdir]$ exit
登出
[root@localhost ~]# su - user2
[user2@localhost ~]$ cd /workdir/
[user2@localhost workdir]$ touch user2file
[user2@localhost workdir]$ rm -rf user1file # 不给删除别人的文件
rm: 无法删除"user1file": 不允许的操作
[user2@localhost workdir]$ rm -rf user2file # 只能删除自己的文件
[user2@localhost workdir]$ ll
总用量 0
-rw-rw----+ 1 user1 worker 0 4月 14 11:11 user1file
chattr文件属性
chattr命令用来改变文件的属性
这项指令可以改变存放在文件或者目录属性,这些属性共有一下8种模式:
- a:让文件或目录仅供附加用途
- b:不更新文件或目录的最后存取时间
- c:将文件或目录压缩后存放
- d:将文件或目录排除在倾倒操作之外
- i:不得任意更动文件或目录
- s:保密性删除文件或目录
- S:即时更新文件或目录
- u:预防意外删除
[root@localhost ~]# chattr [-RV][+/-/=<属性>][文件或目录...
选项
- -R:递归处理,将指定目录下的所有文件及子目录一并处理
- -v <版本编号>:设置文件或目录版本
- -V:显示指令执行过程
- +<属性>:开启文件或目录的该项属性
- -<属性>:关闭文件或目录的该项属性
- = <属性>:指定文件或目录的该项属性
实例
- 使用chattr命令防止系统中某个关键文件被修改
[root@localhost ~]# chattr +i /etc/resolv.conf
[root@localhost ~]# lsattr /etc/resolv.conf
----i----------- /etc/resolv.conf
[root@localhost ~]# echo test >> /etc/resolv.conf
-bash: /etc/resolv.conf: 权限不够
[root@localhost ~]# chattr +a /var/log/messages
[root@localhost ~]# lsattr /var/log/messages
-----a---------- /var/log/messages
[root@localhost ~]# echo > /var/log/messages # 不允许清空日志
-bash: /var/log/messages: 不允许的操作
umask
umask命令指定在建立文件时预设的权限掩码,进程 新建文件、目录的默认权限会收到umask的影响, umask表示要减掉得到权限。
umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后, 即可产生建立文件时预设的权限。
[root@localhost ~]# umask [选项][权限掩码]
选项
- -S:以文字的方式来表示权限掩码
实例
- 查看当前用户的umask权限
[user01@atopos ~]$ umask
0002
- 查看最终所有的权限
[user01@atopos ~]$ umask -S
u=rwx,g=rwx,o=rx
- 修改umask数值(临时)
[user01@atopos ~]$ umask 0000
[user01@atopos ~]$ mkdir dir1
[user01@atopos ~]$ ll
total 0
drwxrwxrwx. 2 user01 user01 6 Jan 13 07:28 dir1
- 修改umask数值(永久)
[root@localhost ~]# vim /etc/profile
--------------
59 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
60 umask 002
61 else
62 umask 022
63 fi
---------------
[root@localhost ~]# source /etc/profile # 立即在当前shell中生效
- 通过umask决定新建用户 HOME 目录的权限
[root@localhost ~]# vim /etc/login.defs
-----------------
61 # The permission mask is initialized to this value. If not specified,
62 # the permission mask will be initialized to 022.
63 UMASK 077
------------------
正在运行中的功法——进程process
什么是进程
进程是cpu进行资源分配的最小单位,是一个在系统中运行的程序
进程是已启动的可执行程序的运行实例,进程有一下部分组成:
- 已分配的内存空间
- 安全属性,包括所有权凭据和特权
- 进程代码的一个或多个执行线程
- 进场状态
进程:程序运行的过程,动态,有生命周期及运行状态
进程类型
守护进程:在系统引导启动过程中启动的进程,跟终端无关
前台进程:跟终端相关,通过终端启动的进程
进程的生命周期
父进程复制自己的地址空间(fork)创建一个新的子进程结构,每个新进程分配一个唯一的进程ID(PID),满足跟踪安全之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进 程都是第一个系统进程的后代:
centos5/6:init
centos7: systemd
进程状态:
子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代 码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。 当子进程完成时发出(exit)信息请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之 为僵尸(zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的 程序代码。
进程状态
在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。在进程运行时,它对 CPU时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。
R:运行状态(runing): 表明进程要么在运行中要么在运行队列里,并不意味着进程一定在运行中。
S:睡眠状态(sleeping):意味着进程在等待事件的完成(这里的睡眠有时候也叫做可中断睡眠)
D:磁盘睡眠状态(Disk sleep): 有时候也叫做不可中断睡眠,在这个状态的进程通常会等待IO的结束
T:停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止(T)进程。这个被暂停的进程可以通过 发送SIGCNT信号让进程继续运行。
Z:僵尸状态(zombie):通知父进程回收所有的资源
X:死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
- 僵尸进程:当一个进程fork一个子进程之后,如果子进程退出,而父进程没有利用wait 或者 waitpid 来获取子进程的状态信息,那么子进程的状态描述符依然保存在系统中。
- 孤儿进程:当一个父进程fork一个子进程之后,父进程突然被终止了,那么这个子进程就成为了一 个孤儿进程,它会被init进程接管
- 参考博客:僵尸进程与孤儿进程解析_TerryZjl的博客-CSDN博客_僵尸进程和孤儿进程的区别
查看进程
ps命令
静态查看进程ps 注: ps -aux 不同于 ps aux
常用组合:aux
u:以用户为中心组织进程状态信息显示
a:与终端相关的进程;
x:与终端无关的进程;
~]# ps -uax
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
用户 进程ID CPU占用 内存占用
VSZ:Virtual memory SiZe 虚拟内存集
RSS:ReSident Size 常驻内存集———其他的都可以放入交换内存中
STAT:进程状态
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
+:前台进程
l:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader
START:启动时间
TIME:运行占据cpu的累积时长
COMMAND:由哪个命令来启动的相关进程
常用组合:ps -ef
-e:显示所有进程
-f:显示完整格式程序信息
常用组合:ps -eFH
-F:显示完成格式的进程信息
-H:以进程层级格式显示进程相关信息
常用组合:eo,axo
自定义想要查询的字段值
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
-axo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wcha n:14,comm
ni:nice值
pri:priority,优先级
psr:processor,CPU
rtprio:实时优先级
[root@atopos ~]# ps aux |less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193720 6768 ? Ss 05:38 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 05:38 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 05:38 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 05:38 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 05:38 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 05:38 0:00 [rcu_bh]
USER:运行进程的用户
PID:进程ID
%CPU:CPU占用率
%MEM:内存占用率
VSZ:占用虚拟内存
RSS:占用实际内存 驻留内存
TTY:程序运行的终端
STAT:进程状态 man ps(/STATE)
- R(runing):运行状态
- S(sleeping):浅度睡眠状态
- D(disk sleep):磁盘睡眠状态
- T(stopped):停止进程
- X(dead):死亡状态
- Z(zombie):僵尸状态
START:进程的启动时间
TIME:进程占用CPU的总时间
COMMAND:进程文件,进程名
[root@atopos ~]# ps aux --sort %cpu |less # 按照CPU使用率排序
[root@atopos ~]# ps aux --sort -%cpu |less
[root@atopos ~]# ps aux --sort rss |less
[root@atopos ~]# ps aux --sort -rss |less
[root@atopos ~]# yum -y install httpd
[root@atopos ~]# systemctl start httpd
[root@atopos ~]# ps auxf |grep httpd # 按照父子进程层级显示
root 29276 0.0 0.0 112724 988 pts/1 S+ 14:25 0:00
\_ grep --color=auto httpd
root 29267 0.2 0.2 230408 5192 ? Ss 14:24 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
[root@xwz ~]# ps -ef # 精简显示
自定义显示字段
[root@atopos ~]# cat /run/sshd.pid
[root@atopos ~]# ps aux |grep sshd
[root@atopos ~]# pgrep -l sshd
[root@atopos ~]# pidof sshd
查看进程树(需要安装pstree)
[root@atopos ~]# pstree
top命令
动态显示系统相关资源的管理器,有点类似于windows当中的任务管理器
[root@atopos ~]# top
[root@atopos ~]# top -d 1 # 一秒钟刷新一次
[root@atopos ~]# top -d 1 -p 6995 # 查看指定PID
[root@atopos ~]# top -d 1 -p 6995,1 # 查看多个PID进程
[root@atopos ~]# top -d 1 -u apache # 查看指定用户的进程
[root@atopos ~]# top -d 1 -b -n 2 > top.txt # 将2次top信息写入到文件
第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平 均值,数值越小意味着负载越低)。
第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源 百分比等。
第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。(buffer和cache之间的区 别,cache是提高cpu和内存之间的数据交换速度,buffer是io设备和存储设备之间的缓冲区)
第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。
进程信息:
- h|?:帮助
- M:按内存的使用排序
- P:按CPU使用排序
- N:以PID的大小排序
- R:对排序进行反转
- f:自定义显示字段
- 1:显示所有CPU的负载
- k:输入信号
- < :向前
- > :向后
- z:彩色
- W:保存top环境设置 ~/.toprc
信号控制进程
[root@atopos ~]# kill -l # 列出所有支持的信号
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42)
SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47)
SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52)
SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57)
SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62)
SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
常用信号
信号 | 信号名 | 作用 |
---|---|---|
1 | SIGHUP | 重新加载配置 |
2 | SIGINT | 键盘中断^C |
3 | SIGQUIT | 键盘退出 |
9 | SIGKILL | 强制终止 |
15 | SIGTERM | 终止(正常结束),缺省信号 |
18 | SIGCONT | 继续 |
19 | SIGSTOP | 停止 |
20 | SIGTSTP | 暂停 |
[root@atopos ~]# ps aux |grep sshd
root 6995 0.0 0.2 112756 4356 ? Ss 9月09 0:00
/usr/sbin/sshd -D
root 31872 5.0 0.2 160844 5620 ? Ss 18:56 0:00 sshd:
root@pts/1
root 31917 0.0 0.0 112728 988 pts/1 S+ 18:56 0:00 grep --
color=auto sshd
[root@atopos ~]# kill -1 6995 # 重新加载配置文件
实例
测试信号9和信号15
[root@atopos ~]# touch file1 file2
[root@atopos ~]# tty
/dev/pts/1
[root@atopos ~]# vim file1
[root@atopos ~]# tty
/dev/pts/2
[root@atopos ~]# vim file2
[root@atopos ~]# ps aux |grep vim
root 32072 0.2 0.2 151532 5064 pts/1 S+ 19:09 0:00 vim file1
root 32127 0.1 0.2 151532 5080 pts/2 S+ 19:09 0:00 vim file2
root 32176 0.0 0.0 112728 988 pts/3 S+ 19:09 0:00 grep --
color=auto vim
[root@atopos ~]# kill 32072
[root@atopos ~]# kill -9 32127
[root@atopos ~]# killall vim # 杀死所有vim进程
测试信号18和信号19
[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32229 0.0 0.0 112724 988 pts/3 S+ 19:14 0:00 grep --
color=auto httpd
[root@atopos ~]# kill -19 29267
[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ts 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32231 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --
color=auto httpd
[root@atopos ~]# kill -18 29267
[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32233 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --
color=auto httpd
踢出远程登录用户
[root@atopos ~]# w
19:21:16 up 1 day, 6:26, 4 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 四11 ?xdm? 2:05m 0.50s
/usr/libexec/gnome-se
root pts/0 :0 四11 5days 1.36s 0.36s -bash
root pts/1 192.168.222.1 18:56 4.00s 0.14s 0.02s w
centos pts/2 192.168.222.1 19:21 3.00s 0.04s 0.04s -bash
[root@atopos ~]# pkill -u centos
[root@atopos ~]# pkill -t pts/2 # 终止pts/2上所有进程
[root@atopos ~]# pkill -9 -t pts/2 # 终止pts/2上所有进程,并结束pts/2
进程优先级 nice
Linux进程调度及多任务
每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程 (和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速 切换,从而给用户多个进程在同时运行的假象。(并发)
相对优先级
由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常 规系统上运行的大多数进程所使用的的调度策略为SCHED_OTHER(也称为SCHED_NORMAL),但还有其他 一些调度策略用于不同的目的。SCHED_OTHER调度策略运行的进程的相对优先级称为进程的nice值, 可以有40种不同级别的nice值。
进程优先级 0-99:实时优先级,数字越小,优先级越低
00-139:静态优先级,数字越小,优先级越高
进程默认启动时nice为0,优先级为120
nice值越高表示优先级越低,例如+19,该进程容易将CPU使用量让给其他进程
nice值越低表示优先级越高,例如-20,该进程更倾向于不让出CPU
查看进程的nice级别
使用ps查看
[root@atopos ~]# ps axo pid,command,nice --sort=nice
[root@atopos ~]# ps axo pid,command,nice,cls --sort=-nice
TS表示该进程使用的调度策略为SCHED_OTHER
使用top查看
NI:实际nice级别
PR:将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
启动具有不同nice级别的进程
启动进程的时候为进程指定nice值
启动进程时,通常会继承父进程的nice级别,默认为0
[root@atopos ~]# nice -n -5 sleep 6000 &
[root@atopos ~]# ps axo command,pid,nice |grep sleep
[root@atopos ~]# nice -n -20 systemctl start httpd
[root@atopos ~]# ps axo pid,command,nice,cls |grep httpd
10146 /usr/sbin/httpd -DFOREGROUN 0 TS
10161 /usr/sbin/httpd -DFOREGROUN 0 TS
10162 /usr/sbin/httpd -DFOREGROUN 0 TS
10163 /usr/sbin/httpd -DFOREGROUN 0 TS
10164 /usr/sbin/httpd -DFOREGROUN 0 TS
10165 /usr/sbin/httpd -DFOREGROUN 0 TS
10167 grep --color=auto httpd 0 TS
更改现有进程的nice级别
- 使用top更改nice级别
r 调整进程的优先级(Nice Level) (-20高) - - - 0 - - - (19低)
- 使用shell更改nice级别
[root@atopos ~]# sleep 7000 &
[2] 10267
[root@atopos ~]# renice -20 10267
10267 (进程 ID) 旧优先级为 0,新优先级为 -20
丹田控制——存储管理
磁盘管理
认识Linux上的磁盘
从工作原理区分
机械硬盘HDD
固态硬盘SSD
从磁盘尺寸区分
SATA
HDD
从磁盘主要接口区分
SATA(Serial ATA)
SAS(Serial Attached SCSI)
磁盘设备的命名
物理磁盘:/dev/sd[a-z]
KVM虚拟化:/dev/vd[a-z]
,/dev/sd[a-z]
设备命名:
IDE:/dev/hd
SCSI,SATA,SAS,USB:/dev/sb
不同设备上:[a-z]
同一设备上:[1,2,3,,]
分区方式的区别
MBR <2TB fdisk 4个主分区,扩展分区,逻辑分区
GPT >2TB gdisk 128个分区
MBR: 使用32位表示扇区数,分区不超过2T ,按柱面进行分区,4个主分区;3主分区+1扩展(N个逻辑分 区)。
GPT:支持128个分区,使用64位,使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT 分区 表自动备份在头和尾两份
注意:从MBR转到GPT,或从GPT转换到MBR会导致数据全部丢失
存储结构与磁盘划分
Linux上的目录结构前面有详细的结束,可以看前面的内容
物理设备的命名规则
常见的硬件设备及其文件名称
硬件设备 | 文件名称 |
---|---|
IDE设备 | /dev/hd[a-d] |
SCSI/SATA/U盘 | /dev/sd[a-p] |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
磁带机 | /dev/st0或/dev/ht0 |
文件系统与数据资料
文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。
文件系统 | 解释 |
---|---|
Ext3 | 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据 的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分 之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便 在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。 |
Ext4 | Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批 量分配block块,从而极大地提高了读写效率。 |
XFS | 是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意 外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费 极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需 求。 |
格式化后发生的事情
- Linux创建一个硬盘地图'superblock',记录此filesystem 的整体信息,包括inode/block的总量、 使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block 号码,默 认一个inode表格128字节,一个block记录消耗4B,记录满了后会新建inode用于扩展。
- 该文件的访问权限(read、write、execute)
- 该文件的所有者与所属组(owner、group)
- 该文件的大小(size)
- 该文件的创建或内容修改时间(ctime)
- 该文件的最后一次访问时间(atime)
- 该文件的修改时间(mtime)
- 文件的特殊权限(SUID、SGID、SBIT)
- 该文件的真实数据地址(point)
- block:用于存储数据
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘 结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口, 这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
mount 挂载硬件设备
[root@atopos ~]# mount 设备名 挂载点
选项
-a:挂载所有在/etc/fstab
中定义的磁盘设备
-t:指定文件系统的类型
直接使用mount,只是临时挂载,必须将分区信息写入/etc/fstab
中,在使用mount -a
挂载信息文件中的设备
第一个字段:挂载的设备
- 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)
第二个字段:挂载的目录
- 指定要挂载到那个目录下面,需要事前创建好该目录
第三个字段:格式类型
- 指定文件的格式类型,
第四个字段:权限选项
- 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
第五个字段:是否备份
- 若为1则开机后使用dump进行磁盘备份,为0则不备份
第六个字段:是否自检
- 若为1则开机后自动进行磁盘自检,为0则不自检
umount 撤销挂载
撤销已经挂载的设备文件 umount [挂载点/设备文件]
[root@atopos ~]# umount /dev/sdb1
添加磁盘设备
fdisk 管理磁盘分区
[root@atopos ~]# fdisk [磁盘名称]
选项
- m:查看可用的全部参数
- n:添加新的分区
- d:删除某个分区文件
- l:列出所有可用的分区类型
- t:改变某个分区的类型
- p:查看分区信息
- w:保存并退出
- q:不保存直接退出
挂载磁盘的步骤
1. 添加一块磁盘
2. 使用fdisk创建分区
3. 使用mkfs.ext4进行文件系统格式化
4. 使用mount挂载分区
du 查看文件数据的占用量
[root@atopos ~]# du [选项] [文件]
[root@atopos ~]# du -sh /*
0 /app
0 /bin
113M /boot
0 /dev
35M /etc
0 /home
0 /lib
0 /lib64
0 /media
0 /mnt
0 /opt
du: cannot access ‘/proc/20259/task/20259/fd/4’: No such file or directory
du: cannot access ‘/proc/20259/task/20259/fdinfo/4’: No such file or directory
du: cannot access ‘/proc/20259/fd/4’: No such file or directory
du: cannot access ‘/proc/20259/fdinfo/4’: No such file or directory
0 /proc
44K /root
9.6M /run
0 /sbin
0 /srv
0 /sys
0 /tmp
1.4G /usr
368M /var
选项
- -a或-all:显示目录中个别文件的大小。
- -b或-bytes:显示目录或文件大小时,以byte为单位。
- -c或--total:除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
- -D或--dereference-args:显示指定符号连接的源文件大小。
- -h或--human-readable:以K,M,G为单位,提高信息的可读性。
- -H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
- -k或--kilobytes:以1024 bytes为单位。
- -l或--count-links:重复计算硬件连接的文件。
- -L<符号连接>或--dereference<符号连接>:显示选项中所指定符号连接的源文件大小。
- -m或--megabytes:以1MB为单位。
- -s或--summarize:仅显示总计。
- -S或--separate-dirs:显示个别目录的大小时,并不含其子目录的大小。
- -x或--one-file-xystem:以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
- -X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
- --exclude=<目录或文件>:略过指定的目录或文件。
- --max-depth=<目录层数>:超过指定层数的目录后,予以忽略。
- --help:显示帮助。
- --version:显示版本信息。
df 查看文件系统占用情况
pass
添加交换分区
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时 存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术
在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍
[root@atopos ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 5242876 KiB
no label, UUID=494ce424-6f8e-4dc7-a1f7-7df45da24928
[root@atopos ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 195M 1.1G 9.5M 469M 1.3G
Swap: 2.0G 0B 2.0G
[root@atopos ~]# sw
swaplabel swapoff swapon switch_root
[root@atopos ~]# swapon /dev/sdb1
[root@atopos ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 200M 1.1G 9.5M 469M 1.3G
Swap: 7.0G 0B 7.0G
命令
mkswap [磁盘路径] # 格式化swap
swapon [磁盘路径] # 挂载swap分区
swapoff [磁盘路径] # 卸载swap分区
参数:
-a:全部
磁盘容量配额
实例
描述:
- 创建5个用户user1,user2,user3,user4,user5,密码和用户名相同,初始组为usergrp组。
- 5个用户都可以取得300M的磁盘使用空间,文件数量不限。超过250M,给于提示。
- usergrp这个组内成员最大使用空间1GB。
- 如果有用户超过soft限制,给14天的宽限时间。
准备磁盘
- 创建分区
[root@atopos ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x29af810b
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
- lsblk 查看当前分区情况
[root@atopos ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 1024M 0 rom
- 格式化分区的文件系统
[root@atopos ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
- 创建目录并挂载
[root@atopos ~]# mkdir /mnt/mountpoint1
[root@atopos ~]# mount /dev/sdb
sdb sdb1
[root@atopos ~]# mount /dev/sdb1 /mnt/mountpoint1/
[root@atopos ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 17G 2.2G 15G 13% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.7M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 146M 869M 15% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
overlay overlay 17G 2.2G 15G 13% /var/lib/docker/overlay2/ea6bd330b5a7154860e3e7b90affaf8b12673a6f71ff35665ecea39a47e3bce0/merged
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt/mountpoint1
准备用户
[root@atopos ~]# setenforce 0
# 临时关闭SELinux
[root@atopos ~]# getenforce
Permissive
[root@atopos ~]# groupadd usergrp
[root@atopos ~]# for i in {1..5}; do useradd -g usergrp -b /mnt/mountpoint1 user$i; done
确保文件系统支持
- 检查挂载点是否支持quota配置
[root@atopos ~]# mount | grep mountpoint1
/dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,data=ordered)
- 重新挂载,让文件系统支持quota配置
[root@atopos ~]# mount -o remount,usrquota,grpquota /mnt/mountpoint1/
[root@atopos ~]# mount | grep mountpoint1
/dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota,data=ordered)
[root@atopos ~]#
安装 quota
- 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
- 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
quotacheck主要参数
- -a:扫描所有在/etc/mtab内含有quota参数的文件系统
- -u:针对用户扫描文件与目录的使用情况,会新建一个aquota.user文件
- -g:针对用户组扫描文件与目录的使用情况,会新增一个aquota.group文件
- -v:显示扫描过程的信息
[root@atopos ~]# yum install -y quota
开启 quota
[root@atopos ~]# quotacheck -avug
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/sdb1 [/mnt/mountpoint1] done
quotacheck: Cannot stat old user quota file /mnt/mountpoint1/aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file /mnt/mountpoint1/aquota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old user quota file /mnt/mountpoint1/aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file /mnt/mountpoint1/aquota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Checked 8 directories and 15 files
quotacheck: Old file not found.
quotacheck: Old file not found.
[root@atopos ~]# quotaon -avug
/dev/sdb1 [/mnt/mountpoint1]: group quotas turned on
/dev/sdb1 [/mnt/mountpoint1]: user quotas turned on
编辑配额配置
[root@atopos ~]# edquota -u user1
- 可以将针对user1的限制复制给user2
[root@atopos ~]# edquota -p user1 -u user2
- 查看限制情况
[root@atopos ~]# repquota -as
*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
Space limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 20K 0K 0K 2 0 0
user1 -- 16K 245M 293M 4 0 0
user2 -- 16K 245M 293M 4 0 0
user3 -- 16K 0K 0K 4 0 0
user4 -- 16K 0K 0K 4 0 0
user5 -- 16K 0K 0K 4 0 0
测试
[user1@atopos ~]$ dd if=/dev/zero of=bigfile bs=10M count=50
sdb1: warning, user block quota exceeded.
sdb1: write failed, user block limit reached.
dd: 写入"bigfile" 出错: 超出磁盘限额
记录了30+0 的读入
记录了29+0 的写出
307183616字节(307 MB)已复制,1.96853 秒,156 MB/秒
[user1@atopos ~]$ du -sh *
293M bigfile
[user1@atopos ~]$
quota 命令
Linux quota命令用于显示磁盘已使用的空间与限制。
执行quota指令,可查询磁盘空间的限制,并得知已使用多少空间
选项:
- -g 列出群组的磁盘空间限制。
- -q 简明列表,只列出超过限制的部分。
- -u 列出用户的磁盘空间限制。
- -v 显示该用户或群组,在所有挂入系统的存储设备的空间限制。
- -V 显示版本信息。
ln 链接
[root@atopos ~]# ln [选项] 源文件 目标文件
选项
- -s:创建“符号链接”(如果不带-s参数,则默认创建硬链接)
- -f:强制创建文件或目录的链接
- -i:覆盖前先询问
- -v:显示创建链接的过程
链接方式
在Linux系统中存在硬链接和软连接两种文件
- 硬链接(hard link):
- 可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所 以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文 件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。 换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以 通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。
- 软链接(也称为符号链接[symbolic link]):
- 仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是, 当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具 有一样的性质
软链接和硬链接的区别
硬链接的特点
- 不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的 数据都会发生改变。
- 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问。
- 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
- 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode号是重新计算的 硬链接不能连接目录
软链接的特点
- 不论是修改源文件(check),还是修改软链接文件(check-soft),另一个文件中的数据都会 发生改变。
- 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显 示文件不存在。
- 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是 源文件的文件 名及 inode 号。
- 软链接可以链接目录。 软链接可以跨分区
实例
软链接
[root@localhost ~]# echo "hello" > test
[root@localhost ~]# ln -s test test123
[root@localhost ~]# cat test123
hello
[root@localhost ~]# ls -l test
-rw-r--r--. 1 root root 6 Apr 12 06:10 test
[root@localhost ~]# rm -f test
[root@localhost ~]# cat test123
cat: test123: No such file or directory
硬链接
[root@localhost ~]# echo "hello" > test
[root@localhost ~]# ln test test123
[root@localhost ~]# cat test123
hello
[root@localhost ~]# ls -l test
-rw-r--r--. 2 root root 6 Apr 12 06:12 test
[root@localhost ~]# rm -f test
[root@localhost ~]# cat test123
hello
RAID(独立冗余磁盘阵列)
LVM(逻辑卷管理器)
储物戒——软件包管理
软件包的类型
- 源码包
- 需要自己编译
- 二进制包
- 已编译
常见的二进制包
- RedHat/Centos
- RPM
- 工具
- rpm
- yum:(自动安装,自动解决依赖关系)
- Ubuntu/Debain
- DPKG
- 工具
- dpkg
- apt:(自动安装,自动解决依赖关系)
rpm 包管理
- rpm工具使用分为安装、查询、验证、更新、删除等操作
- rpm包的格式说明:
[root@atopos ~]# rpm -ivh httpd-2.4.6-93.el7.centos.x86_64.rpm
- httpd:包名
- 2:主版本号
- 4:次版本号
- 6:修订次数,指的是第几次修改bug
- 93:release(第几次发布,指的是简单的修改参数)
- e17:操作系统版本
- x86_64:64位操作系统
- 命令格式:
[root@atopos ~]# rpm [选项] 软件包
选项
安装:
- -i:install的意思,安装软件包
- -v:显示附加信息,提供更多详细信息
- -V:校验,对已安装的软件进行校验
- -h --hash:安装时输出###标记
查询:
- -q:查询,一般跟下面的参数配合使用
- -a:查询所有已安装的软件包
- -f:系统文件名(查询系统文件属于哪个安装包)
- -i:显示已安装的rpm软件包信息
- -l:查询软件包文件的安装位置
- -p:查询未安装软件包的相关信息
- -R:查询软件包的依赖性
卸载:
- -e:erase
- --nodeps:忽略依赖
升级:
- -U:一般配合vh使用
实例:安装
[root@atopos ~]# rpm -ivh
http://centos.ustc.edu.cn/centos/7/os/x86_64/Packages/httpd-2.4.6-
93.el7.centos.x86_64.rpm
[root@localhost ~]# rpm -ivh vim-enhanced-7.4.629-6.el7.x86_64.rpm
警告:vim-enhanced-7.4.629-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID
f4a80eb5: NOKEY
错误:依赖检测失败:
libgpm.so.2()(64bit) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
libperl.so()(64bit) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
perl(:MODULE_COMPAT_5.16.3) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
vim-common = 2:7.4.629-6.el7 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
# 需要自己手动解决依赖关系
# 额外安装选项
# --nosignature 不检验软件包的签名
# --force 强制安装软件包
# --nodeps 忽略依赖关系
实例:查询
[root@atopos ~]# rpm -q vim-enhanced
vim-enhanced-7.4.629-8.el7_9.x86_64
[root@atopos ~]# rpm -qa |grep vim-enhanced
vim-enhanced-7.4.629-8.el7_9.x86_64
[root@atopos ~]# rpm -ql vim-enhanced
/etc/profile.d/vim.csh
/etc/profile.d/vim.sh
/usr/bin/rvim
/usr/bin/vim
/usr/bin/vimdiff
/usr/bin/vimtutor
[root@atopos ~]# rpm -qc openssh-server
/etc/pam.d/sshd
/etc/ssh/sshd_config
/etc/sysconfig/sshd
[root@atopos ~]#
实例:卸载
[root@atopos ~]# rpm -e tree
源码包管理
源码包安装三绝招
./configure
#可以指定安装路径,启用或者禁用功能等,最终生成makefile
make
#按Makefile文件编译
make install
#按Makefile定义的文件路径安装
make clean
#清除上一次make命令所产生的object文件,要重新执行
configure时,需要执行make clean。
实例
- 炫酷代码雨编译安装
[root@localhost ~]# yum -y install ncurses* gcc gcc-c++
[root@localhost ~]# tar xf cmatrix-1.2a.tar.gz
[root@localhost ~]# cd cmatrix-1.2a
[root@localhost cmatrix-1.2a]# ./configure
[root@localhost cmatrix-1.2a]# make
[root@localhost cmatrix-1.2a]# make install
[root@localhost cmatrix-1.2a]# cmatrix
yum 包管理
yum 介绍
- yum是一个前端软件包管理器。基于rpm包管理,能够从指定的服务器自动下载rpm包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包,无需繁琐的一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简介而又好记。
- yum可以自己解决依赖关系
本地源文件解释
# 路径
[root@atopos ~]# ls /etc/yum.repos.d/
name=centos #源的描述信息
baseurl=https://xxxx.xxx.xxx/xx # 仓库地址
enabled=1 #启动yum,0为不启用
gpgcheck=0 #不使用使用公钥检验rpm的正确性,1为使用。
yum 换源
下载阿里云
[root@localhost ~]# wget -O /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum 常用命令
yum install -y httpd #安装软件包
yum update httpd #升级软件包,改变软件设置和系统设置,系统版本内核都升级
yum install upgrade #升级软件包,不改变软件设置和系统设置,系统版本内核都升级
yum info httpd #查询包
yum provides /usr/bin/find #查询命令属于哪一个包
yum remove -y httpd #卸载
yum search httpd #按关键字搜索包
yum clan all #清除缓存
yum makecache #生成缓存
yum repolist #查看可用的yum源
yum grouplist #列出可用组
Linux网络设置
配置网络服务
nmtui 图形化配置工具
[root@atopos ~]# nmtui
通过网卡配置文件修改
[root@atopos ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=7cb2fd3e-61dd-4856-87fa-c6db7ec0169b
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.91.128
PREFIX=24
GATEWAY=192.168.91.2
DNS1=114.114.114.114
DNS2=114.114.115.115
解释 | 参数 |
---|---|
设备类型 | TYPE=Ethernet |
地址分配模式 | BOOTPROTO=static(静态)/dhcp |
网卡名称 | NAME=ens33 |
是否开机自动启动 | ONBOOT=yes |
IP地址 | IPADDR=192.168.91.128 |
子网掩码 | NETMASK=255.255.255.0 |
前缀长度 | PREFIX=24 |
网关地址 | GATEWAY=192.168.91.2 |
DNS地址 | DNS1=114.114.114.114 |
- 配置完成以后,需要重启网卡才可以生效
[root@atopos ~]# systemctl restart network
nmcli 工具详解
nmcli命令是redhat7或者centos7之后的命令,该命令可以完成网卡上所有的配置工作,并且可以写入 配置文件,永久生效
- 查看接口状态
[root@atopos ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
ens33 ethernet connected ens33
ens37 ethernet connected Wired connection 1
docker0 bridge connected docker0
lo loopback unmanaged --
- 查看链接信息
[root@atopos ~]# nmcli connection show
NAME UUID TYPE DEVICE
docker0 ca6db5d5-a1a1-478d-8592-112d5283069d bridge docker0
ens33 122f2554-8762-40c0-8fb7-f92275a6b358 ethernet ens33
Wired connection 1 1099d5fd-29be-3f24-92d3-5f47c981fbae ethernet ens37
- 启动/停止接口
[root@atopos ~]# nmcli connection up ens33
[root@atopos ~]# nmcli connection down ens33
- 创建链接
[root@atopos ~]# nmcli connection add type ethernet con-name dhcp_ens33
ifname ens33
- 删除链接
[root@atopos ~]# nmcli connection delete dhcp_ens33
成功删除连接 'dhcp_ens33'(37adadf4-419d-47f0-a0f6-af849160a4f7)。
net-tools
- 默认路由
默认路由:
route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.2
防火墙
计划任务及日志管理
计划任务
计划任务主要是做一些周期性的任务,目前主要用途是定期备份数据
at 一次调度执行
at <TIMESPEC>
now +5min # 5分钟
teatime tomorrow (teatime is 16:00)
noon +4 days # 四天
5pm august 3 2021 # 具体日期
实例
[root@atopos ~]# yum install -y at
[root@atopos ~]# systemctl start atd
[root@atopos ~]# at now +1min
at> echo hello
at> <EOT> # exit/ctrl+D退出
job 1 at Mon Jan 17 05:44:00 2022
[root@atopos ~]# atq # 查看设定的任务
1 Mon Jan 17 05:44:00 2022 a root
- 通过重定向的方式将事先写好的任务重定向加入到计划任务中
[root@atopos ~]# vim at.jobs
touch /root/`date +%F`.txt
You have mail in /var/spool/mail/root
[root@atopos ~]# at now +1min < at.jobs
job 2 at Mon Jan 17 05:47:00 2022
[root@atopos ~]# atq
2 Mon Jan 17 05:47:00 2022 a root
cron 循环调度执行 用户级
- 使用之前先通过systemctl启动守护进程
[root@atopos ~]# systemctl start crond
[root@atopos ~]# systemctl enable crond
[root@atopos ~]# ps aux|grep crond
root 6242 0.3 0.0 126380 1656 ? Ss 16:27 0:00
/usr/sbin/crond -n
- crond每分钟会处理一次计划任务
- 存储位置
[root@atopos ~]# ls /var/spool/cron/
常用管理命令
[root@atopos ~]# crontab -l # 列出当前用户所有计划任务
[root@atopos ~]# crontab -r # 删除当前用户计划任务
[root@atopos ~]# crontab -e # 编辑当前用户计划任务
管理员可以使用 -u username,去管理其他用户的计划任务
[root@atopos ~]# vim /etc/cron.deny # 这个文件中加入的用户名无法使用cron
语法格式
# 五个*分别代表
分 时 日 月 星期 命令
* 表示任何数字都符合
0 2 * * * /run.sh # 每天的2点
0 2 14 * * /run.sh # 每月14号2点
0 2 14 2 * /run.sh # 每年2月14号2点
0 2 * * 5 /run.sh # 每个星期5的2点
0 2 * 6 5 /run.sh # 每年6月份的星期5的2点
0 2 2 * 5 /run.sh # 每月2号或者星期5的2点 星期和日同时存在,那么就是或的关系
0 2 2 6 5 /run.sh # 每年6月2号或者星期5的2点
*/5 * * * * /run.sh # 每隔5分钟执行一次
0 2 1,4,6 * * /run.sh # 每月1号,4号,6号的2点
0 2 5-9 * * /run.sh # 每月5-9号的2点
* * * * * /run.sh # 每分钟
0 * * * * /run.sh # 每整点
* * 2 * * /run.sh # 每月2号的每分钟
cron 循环调度执行 系统级
- 文件的位置
[root@atopos ~]# vim /etc/crontab
[root@atopos ~]# ls /etc/cron.d # 定义的计划任务每个小时会执行
0hourly
[root@atopos ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly # 每小时01分以root身份执行/etc/cron.hourly/目录下的所有脚本
- crond仅仅会执行每小时定义的脚本
[root@atopos ~]# ls /etc/cron.hourly/
[root@atopos ~]# cat /etc/cron.hourly/0anacron
/usr/sbin/anacron -s # anacron是用来检查是否有错过的计划任务需要被执行
[root@atopos ~]# vi /etc/anacrontab
1 5 cron.daily nice run-parts /etc/cron.daily
#每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那
就执行
7 25 cron.weekly nice run-parts /etc/cron.weekly
#每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被
执行,就会执行
©monthly 45 cron.monthly nice run-parts /etc/cron.monthly
#每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没
有被执行,那就执行
日志管理
常见的日志文件(系统,进程,应用程序)
日志文件 | 作用描述 |
---|---|
tail /var/log/messages | 系统主日志文件 |
tail -20 /var/log/messages | |
tail -f /var/log/messages | 动态查看日志文件的尾部 |
tailf /var/log/secure | 认证、安全 |
tail /var/log/maillog | 和邮件postfix相关 |
tail /var/log/cron | crond、at进程产生的日志 |
tail /var/log/dmesg | 和系统启动相关 |
tail /var/log/audit/audit.log | 系统审计日志 |
tail /var/log/yum.log | yum |
tail /var/log/mysqld.log | MySQL |
tail /var/log/xferlog | 访问FTP服务器相关 |
w | 当前登录的用户 /var/log/wtmp |
ast | 最近登录的用户 /var/log/btmp |
lastlog | 所有用户的登录情况 /var/log/lastlog |
实例
- 统计登录失败
[root@atopos ~]# grep 'Fail' /var/log/secure |awk '{print $11}' |sort |uniq -c |sort -k1 -n -r |head -5
- 统计登录成功
[root@atopos ~]# grep 'Accepted' /var/log/secure |awk '{print $(NF-3)}'|sort |uniq -c
- 查看网卡是否已被驱动
[root@atopos ~]# grep -i eth /var/log/dmesg
[ 5.204426] e1000 0000:02:01.0 eth0: (PCI:66MHz:32-bit) 00:0c:29:2b:aa:29
[ 5.204432] e1000 0000:02:01.0 eth0: Intel(R) PRO/1000 Network Connection
rsyslogd 子系统-日志管理
- rsyslogd:绝大部分日志记录,和系统操作有关,安全,认证 sshd,su ,计划任务 at,cron httpd/nginx/mysql 等等应用可以以自己的方式记录日志
[root@atopos ~]# ps aux |grep rsyslogd
root 16826 0.0 0.3 389172 5916 ? Ssl Jan16 0:08 /usr/sbin/rsyslogd -n
root 20777 0.0 0.0 112816 976 pts/1 S+ 06:02 0:00 grep --color=auto rsyslogd
日志可以放在本地,也可以放在服务器上
- 查询rsyslog相关配置文件
[root@atopos ~]# rpm -qc rsyslog
/etc/logrotate.d/syslog
/etc/rsyslog.conf
/etc/sysconfig/rsyslog
[root@localhost ~]# vim /etc/rsyslog.conf
# 告诉rsyslogd进程 哪个设备(facility),关于哪个级别的信息,以及如何处理
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
authpriv.* * #
所有终端
authpriv.* @192.168.1.123 #
UDP
authpriv.* @@192.168.1.123 #
TCP
设备facility相关内容,查看man手册https://man7.org/linux/man-pages/man3/syslog.3.html
设备类型及日记级别
设备类型(表示日志类型) | 解释 |
---|---|
LOG_AUTHPRIV | 安全认证 |
LOG_CRON | cron和at |
LOG_DAEMON | 后台进程 |
LOG_FTP | frp进程 |
LOG_KERN | 内核信息 |
LOG_LOCAL0 through LOG_LOCAL7 | 用户自定义设备 |
LOG_LPR | 打印机子系统 |
LOG_MAIL | 邮件系统 |
LOG_NEWS | 新闻子系统 |
LOG_SYSLOG | syslogd自身产生的日志 |
- 日志级别
级别(日志的重要级别) | 解释 |
---|---|
LOG_EMERG | 紧急,致命,服务无法继续运行,如配置文件丢失 |
LOG_ALERT | 报警,需要立即处理,如磁盘空间使用95% |
LOG_CRIT | 致命行为 |
LOG_ERR | 错误行为 |
LOG_WARNING | 警告信息 |
LOG_NOTICE | 普通 |
LOG_INFO | 标准信息 |
LOG_DEBUG | 调试信息,排错才开,一般不建议使用 |
- 配置文件
[root@atopos ~]# vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
实例
rsyslog远程管理日志
- 修改server1的rsyslog.conf配置文件,打开tcp、udp监听端口
[root@server1 httpd]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
- 重启rsyslog,检查端口是否在监听
[root@server1 ~]# yum install net-tools -y
[root@server1 ~]# netstat -nltup |grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
1342/rsyslogd
tcp6 0 0 :::514 :::* LISTEN
1342/rsyslogd
udp 0 0 0.0.0.0:514 0.0.0.0:*
1342/rsyslogd
udp6 0 0 :::514 :::*
1342/rsyslogd
- 修改server2的ssh配置文件,将日志发送到local0中
[root@server2 ~]# vim /etc/ssh/sshd_config
SyslogFacility LOCAL0
[root@server2 ~]# systemctl restart sshd
- 修改server2的rsyslog.conf
[root@server2 ~]# vim /etc/rsyslog.conf
local0.* @192.168.80.193
[root@server2 ~]# systemctl restart rsyslog.service
参考博客:Rsyslog系统日志管理 - 谁与问倚楼人瘦 - 博客园 (cnblogs.com)
logrotate 日志轮转(日志切割)
针对任何日志文件(rsyslog日志、Nginx访问或错误日志)
- 随着时间增长,日志文件会越来越大,所以需要进行日志轮转,切割
- 丢弃系统中过期的旧日志,节省空间
- logrotate本身不是系统守护进程,它是通过计划任务crond每天执行
[root@atopos ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
[root@localhost ~]# ls /etc/logrotate.conf /etc/logrotate.d/
/etc/logrotate.conf
/etc/logrotate.d/:
bootlog chrony syslog wpa_supplicant yum
主配置文件
[root@atopos ~]# vim /etc/logrotate.conf
weekly # 一周轮转一次
rotate 4 # 保留四份日志
create # 主动创建新的日志文件
dateext # 使用日期来作为文件名的后缀
include /etc/logrotate.d
# 导入其他应用的日志轮转规则
/var/log/wtmp { # 对该日志文件设置轮转方法
monthly # 一个月轮转一次
create 0664 root utmp # 轮转后创建新文件,并设置权限
minsize 1M # 最小达到1M才会轮转
rotate 1
}
/var/log/btmp {
missingok # 丢失不提醒
monthly
create 0600 root utmp
rotate 1
}
远程控制服务
配置sshd服务
sshd是基于SSH协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验证的方法:
-
基于口令的验证—用账户和密码来验证登录;
-
基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的 公钥进行比较;该方式相较来说更安全。
sshd服务的配置信息保存在 /etc/ssh/sshd_config 文件中。运维人员一般会把保存着最主要配置信息 的文件称为主配置文件,而配置文件中有许多以井号开头的注释行,要想让这些配置参数生效,需要在 修改参数后再去掉前面的#号。
sshd服务的配置文件
[root@atopos ~]# cat /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/bin:/usr/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes
# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
# problems.
UsePAM yes
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation sandbox
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
- 各个字段的解释
字段 | 作用 |
---|---|
Port 22 | 默认的sshd服务端口 |
ListenAddress 0.0.0.0 | 设定sshd服务器监听的IP地址 |
Protocol 2 | SSH协议的版本号 |
HostKey /etc/ssh/ssh_host_key | SSH协议版本为1时,DES私钥存放的位置 |
HostKey /etc/ssh/ssh_host_rsa_key | SSH协议版本为2时,RSA私钥存放的位置 |
HostKey /etc/ssh/ssh_host_dsa_key | SSH协议版本为2时,DSA私钥存放的位置 |
PermitRootLogin yes | 设定是否允许root管理员直接登录 |
StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 |
MaxAuthTries 6 | 最大密码尝试次数 |
MaxSessions 10 | 最大终端数 |
PasswordAuthentication yes | 是否允许密码验证 |
PermitEmptyPasswords no | 是否允许空密码登录(很不安全) |
安全密钥验证
- 在客户端主机中生成
密钥对
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # 密钥对的名字,不输入就默认id_rsa
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): # 私钥密码
Enter same passphrase again: # 确认密码
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:9+KE/GYBG6wjbCQ4o9j139nD9kkrL29bdAYd49kTvLo
root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| .+ |
| .o* |
| . . .++ |
|+ . o + o. |
|o+ = . .S+. . +|
|o . + +..o.. . o.|
| . . oo.o=. o .|
| .+=.BE.+ |
| oo. OB. |
+----[SHA256]-----+
- 把客户端主机中的公钥文件发送给服务端
[root@atopos ~]# ssh-copy-id 192.168.2.128
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed:
"/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.128 (192.168.2.128)' can't be
established.
ECDSA key fingerprint is SHA256:PWPGI+gebAxdFtOfQe66cO/RnTBEV/Qw5AEoZv6w5lM.
ECDSA key fingerprint is
MD5:61:3d:ae:39:43:65:70:f4:9a:10:ff:48:67:6f:ef:54.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to
filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are
prompted now it is to install the new keys
root@192.168.91.128's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.2.128'"
and check to make sure that only the key(s) you wanted were added.
- 对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存 并重启sshd服务程序
[root@atopos ~]# vim /etc/ssh/sshd_config
..................
65 PasswordAuthentication no
...................
[root@atopos ~]# systemctl restart sshd
screen 不间断会话服务
当与远程主机的会话被关闭时,在远程主机上运行的命令也随之被中断。
screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同 时控制多个远程终端窗口而设计的程序。用户还可以使用screen服务程序同时在多个远程会话中自由切 换,能够做到实现如下功能。
- 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
- 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
- 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出 信息共享。
下载screen工具
[root@atopos ~]# yum install -y screen
管理远程会话
screen的命令:
- 用 -S 参数创建会话窗口
- 用 -d 参数将指定会话进行离线处理
- 用 -x 参数一次性恢复所有的会话
- 用 -ls 参数显示当前已有的会话
- 用 -wipe 参数把目前无法使用的会话删除
# 创建新的窗口
[root@atopos ~]# screen -S window
- 可以看到我们创建的新的会话正在运行中
[root@atopos ~]# screen -ls
There is a screen on:
17126.window (Attached)
1 Socket in /var/run/screen/S-root.
在日常的生产环境中,其实并不是必须先创建会话,然后再开始工作。可以直接使用screen命令执行要 运行的命令,这样在命令中的一切操作也都会被记录下来,当命令执行结束后screen会话也会自动结束
[root@atopos ~]# screen ping -c 4 baidu.com
[screen is terminating]
了解堡垒机
概述
当今的时代是一个信息化社会,信息系统已成为各企事业单位业务运营的基础,由于信息系统运维人员 掌握着信息系统的最高权限,一旦运维操作出现安全问题将会给[企业]或单位带来巨大的损失。因此,加 强对运维人员操作行为的监管与审计是[信息安全]发展的必然趋势。在此背景之下,针对运维操作管理与 审计的堡垒机应运而生。堡垒机提供了一套多维度的运维操作控管控与审计解决方案,使得管理人员可以全面对各种资源(如[网络]设备、[服务器]、安全设备和[数据库]等)进行集中账号管理、细粒度的权限管 理和访问审计,帮助企业提升内部风险控制水平。
堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏, 而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操 作行为,以便集中报警、及时处理及审计定责。
目前国内外有很多厂商生产堡垒机,堡垒机目前有两种最主流的形式。 硬件堡垒机:厂商定制硬件设备,并且将软件系统封装在其中,比较封闭,安全系数较高
软件堡垒机:厂商仅仅维护软件堡垒机系统,需要客户自己部署堡垒机,可以虚拟化形式,部署自由 程度高
核心功能
- 登录功能
- 账号管理
- 身份认证
- 资源授权
- 访问控制
- 操作审计
文件服务
FTP(文件传输协议)
FTP协议:文件传输协议(File Transfer Protocol)
- 协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的一个标准
- FTP运行在OSI模型的应用层,并利用传输协议TCP在不同的主机之间提供可靠的数据传输
- FTP 在文件传输中还支持断点续传功能,可以大幅度减少CPU网络带宽的开销
FTP 模型
-
用户接口:提供一个用户接口并使用客户端协议解释器的服务
-
客户端协议解释器:向远程服务器发送命令 并建立客户数据传输过程
-
服务端协议解释器:响应客户协议机发出的命令并驱动服务端数据传输过程
-
客户端数据传输协议:负责完成和服务器数据传输过程及客户端本地文件系统的通信
-
服务端数据传输协议:负责完成和客户数据过程及服务器端文件系统的通信
通信接口
21端口:控制连接
- FTP服务端监听21端口等待建立连接,只有身份验证通过,才可以顺利建立连接
- 在FTP连接期间,控制连接始终保持通常的连接状态。在数据连接存在期间,控制连接必须存 在;一旦控制连接断开,数据连接会自动关闭
20端口:数据连接
- FTP服务端监听20端口来等待数据连接
- 数据连接依赖于控制连接
两种连接方式
FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放 N+1号端口进行监听,并向服务器发出PORT N+1命令。服务器接收到命令后,会用其本地的FTP数据端 口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
在被动模式下,FTP库户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开 启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开 放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到 命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
主动连接
- 通过三次握手,建立控制连接;客户端的源端口是高位随机端口,目标端口是21端口
- 控制连接建立后,客户端进行份验证,协商数据连接采用主动模式;随后客户端会 向FTP服务器发送Port报 文,表明自己监听的IP+端口,并等待FTP服务器(20端 口)向自己监听的IP+端口发起数据连接请求。
- 服务端发起数据连接请求,建立数据连接
被动连接
- 通过三次握手,建立控制连接;客户端的源端口是高位随机端口,目标端口是21端口;
- 控制连接建立后,客户端进行身份验证,协商数据连接采用被动模式;随后客户端 会向服务器发送PASV报文,表示我们用被动模式
- 服务端收到PASV报文,于是向客户端发送Port报文,表明自己监听的IP+端口
- 客户端发起数据连接请求,建立数据连接
vsftpd 服务
安装
[root@atopos ~]# yum install -y vsftpd
配置文件
# 主配置文件
/etc/vsftpd/vsftpd.conf
# 用户访问控制文件
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
# 日志文件
/etc/logrotate.d/vsftpd
配置文件参数:
参数 | 作用 |
---|---|
listen=NO | 是否以独立运行的方式监听服务 |
listen_address=ip地址 | 设置要监听的IP地址 |
listen_port=21 | 设置FTP服务的监听端口 |
download_enable=YES | 是否允许下载文件 |
userlist_enable=YES | 设置用户列表为"允许" |
userlist_deny=YES | 设置用户列表为"禁止" |
max_clients=0 | 最大客户端连接数,0为不限制 |
max_per_ip=0 | 同一IP地址的最大连接数,0为不限制 |
anonymous_enable=YES | 是否允许匿名用户访问 |
anon_upload_enable=YES | 是否允许匿名用户上传文件 |
anon_umask | 匿名用户上传文件的umask |
anon_root=/var/ftp | 匿名用户的ftp根目录 |
anon_mkdir_write_enable=YES | 是否允许匿名用户创建目录 |
anon_other_write_enable=YES | 是否开放匿名用户的其他写入权限(重命名、删除等) |
anon_max_rate=0 | 匿名用户的最大传输速率,0为不限制 |
local_enable=yes | 是否允许本地用户登录 |
local_umask=022 | 本地用户上传文件的umask值 |
local_root=/vat/ftp | 本地用户的ftp根目录 |
chroot_local_user=YES | 是否将用户权限禁锢在ftp目录,以确保安全 |
local_max_rate=0 | 本地用户的最大传输速率,0为不限制 |
客户端工具
- ftp
[root@atopos ~]#yum install ftp -y
[root@atopos ~]#ftp <IP地址>
- lftp
[root@atopos ~]#yum install lftp -y
[root@atopos ~]#lftp <IP地址>
- 区别:
- ftp 工具是一定要输入用户名称和密码的,登录成功或者失败会给出提示。lftp不会直接给出登 录成功或者失败的
- lftp 需要输入ls工具才可以发现是否连接成功,优点在于连接更加方便
实例
匿名用户访问(默认开启)
[root@atopos ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=Yes
anon_mkdir_write_enable=Yes
anon_other_write_enable=Yes
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@atopos ~]# systemctl restart vsftpd
本地用户访问
[root@atopos ~]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@atopos ~]# systemctl restart vsftpd
[root@atopos ~]# systemctl enable vsftpd
注意:出现在/etc/vsftpd/ftpuser /etc/vsftpd/user_list这两个文件
中的内容将会被定义为黑名单
虚拟用户访问
- 创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码
[root@atopos ~]# cd /etc/vsftpd/
[root@atopos vsftpd]# vi vuser.list
eagle
centos
cisco
centos
huawei
centos
- 使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件
- 降低数据库文件的权限(避免其他人看到数据库文件的内容)
- 把原始的明文信息文件删除。
[root@atopos vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@atopos vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@atopos vsftpd]# chmod 600 vuser.db
[root@atopos vsftpd]# rm -f vuser.list
- 创建一个本地用户,用来做虚拟用户在本地的代理,为了安全起见,禁止这个本 地用户登录
[root@atopos vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@atopos vsftpd]# ls -ld /var/ftproot/
drwx------. 2 virtual virtual 59 8月 10 23:04 /var/ftproot/
[root@atopos vsftpd]# chmod -Rf 777 /var/ftproot/
- 新建一个用于虚拟用户认证的PAM文件vsftpd.vu
[root@atopos vsftpd]# vi /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
- 配置文件
[root@atopos vsftpd]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
- 如果想要针对不同的用户设置不同的权限
[root@atopos vsftpd]# mkdir /etc/vsftpd/vusers_dir/
[root@atopos vsftpd]# cd /etc/vsftpd/vusers_dir/
[root@atopos vusers_dir]# touch huawei
[root@atopos vusers_dir]# vi eagle
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@atopos vusers_dir]#
[root@atopos vusers_dir]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers_dir
[root@atopos vusers_dir]# systemctl restart vsftpd
NFS(网络文件系统)
NFS,Network File System。顾名思义,网络文件系统,即通过网络,对在不同主机上的文件进行共享。
NFS包括两部分:服务端(servlet)及客户端(client)
由于NFS服务功能很多,会有很多端口,这些端口还有可能不固定,(pc -ef | egrep nfs 我们可以看到nfs 不同的端口号)那么客户端就无法与服务器进行通信,因为程序间通信必须通过端口(tcp/udp都是端到端通信),那么就需要一个中间的桥接机制,RPC进程即充当这样一个角色,RPC的端口是一定的(111),当NFS启动时,会向RPC进行注册, (rpc 一定是在nfs启动前,就已经启动了,)那么客户端PRC就能与服务器RPC进行通信, 从而进行文件的传输。
NFS服务端
安装
# centos7 安装NFS 服务端
[root@atopos ~]# yum install -y nfs-utils
# 注意关闭selinux和firewalld
[root@atopos ~]# systemctl stop firewalld
[root@atopos ~]# setenforce 0
服务端相关配置文件
配置文件定义
NFS的配置文件为 /etc/exports
内容格式,如:<共享目录> [客户端1(选项)] [客户端2(选项) ...]
-
共享目录:NFS共享给客户机的目录
-
客户端:网络中可以访问此目录的主机。多个客户端以空格分隔。
-
选项:设置目录的访问权限、用户映射等,多个选项以逗号分隔。
-
例如:
/data 192.168.1.0/24(rw,insecure,sync,all_squash,anonuid= 65534,anongid=65534)
配置文件路径
/etc/exports
:NFS服务主配置文件,配置NFS具体共享服务的地点,默认内容是空的
[root@atopos ~]# cat /etc/exports
/data 192.168.2.0/24(rw,insecure,sync,all_squash,anonuid= 65534,anongid=65534)
/usr/sbin/exports
:
NFS服务的管理命令
exportfs
不重启nfs服务应用更新,相关选项如下:
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v 在export的时候,将详细的信息输出到屏幕上。
nfsstat
查看NFS的运行状态。
rpcinfo
查看rpc服务注册情况。
相关选项:
-p 显示所有的端口与程序信息。
示例:
rpcinfo -p localhost #列出本机的RPC注册状况。
showmount
查询nfs共享目录信息,相关选项如下:
-a 显示已经于客户端连接上的目录信息
-e IP或者hostname 显示此IP地址分享出来的目录
示例:
showmount -e localhost #查询本机nfs共享目录情况
showmount -a localhost #查询本机共享目录连接情况
NFS配置权限配置参数
-
rw:表示可读写权限。
-
sync:请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。
-
async:写入数据时会先写到内存缓冲区,直到硬盘有空档才会在写入磁盘,这样可以提升写入效率。风险是若服务器宕机或不正常关机,会损失缓冲区中未写入硬盘的数据(解决办法:服务器主板电池或UPS不间断电源)。
-
all_squash:不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份,在生产环境中配置NFS的重要技巧:
(1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限,all_squash把所有客户端都压缩成匿名用户(UID相同),就是anonuid,anongid指定的UID和GID相同
(2)所有的客户端和服务器端都需要有一个相同的UID和GID的用户,nfsnodoby(UID必须相同)
-
anonuid:参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。一般默认就好
-
anongid:同anonuid,区别是把uid(用户id)换成gid(组id)
-
ro:表示只有只读权限
sync是synchronized的缩写,意为同步,async是asynchonous的缩写意为异步,怎么理解同步和异步:
比如:你女朋买了一张票等你下班一起看电影,她会亲自给你电影票然后一起看电影,在比如生产者跟消费者,我们常常加同步锁synchronized,这样就是生产一个,消费一个(Linux分为实时同步和定时同步)。异步,在比如生产者跟消费者,生产100个产品,消费者只能消费50个,那么就会把生产者的产品放在超市,消费者就会去超市买东西,
NFS 客户端
安装
[root@atopos ~]# yum install -y nfs-utils
常用命令
pass
实例一
基于NFS搭建web后端NAS存储
- 关闭防火墙和selinux
[root@atopos ~]# systemctl stop firewalld
[root@atopos ~]# setenforce 0
- 准备NFS共享文件
# 安装nfs服务
[root@atopos ~]# yum install -y nfs-utils
# 准备共享目录
[root@atopos ~]# mkdir /webdata
# 准备共享文件
[root@atopos ~]# echo "<h1>today i study but you sleep i good you bad</h1>" > /webdata/index.html
# 配置nfs服务
[root@atopos webdata]# vim /etc/exports
[root@atopos webdata]# cat /etc/exports
/webdata 192.168.2.0/24(rw)
[root@atopos ~]# systemctl start nfs-server.service
[root@atopos ~]# systemctl enable nfs-server.service
- 客户端查看服务端的共享文件
[root@node1 ~]# yum install -y nfs-utils
[root@node1 ~]# showmount -e 192.168.2.128
/webdata 192.168.2.0/24
- 挂载nas共享文件到网站根目录
[root@node1 ~]# mount -t nfs 192.168.2.128:/webdata /var/www/html/
[root@node1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17811456 1153376 16658080 7% /
devtmpfs 922468 0 922468 0% /dev
tmpfs 933524 0 933524 0% /dev/shm
tmpfs 933524 8804 924720 1% /run
tmpfs 933524 0 933524 0% /sys/fs/cgroup
/dev/sda1 1038336 145756 892580 15% /boot
tmpfs 186708 0 186708 0% /run/user/0
192.168.2.128:/webdata 17811456 1082880 16728576 7% /var/www/html
- 最后浏览器访问测试
autofs 自动挂载
可使用autofs服务按需要挂载外围设备,NFS共享等,并在空闲5分钟后后自动卸载
相关包和文件
[root@atopos ~]# yum install -y autofs
配置文件:/etc/auto.master
服务文件: /usr/lib/systemd/system/autofs.service
配置文件格式
查看帮助: man 5 autofs
所有导出到网络中的NFS启用特殊匹配-host至"browse"
实例:
cat /etc/auto.master
/net -hosts
cd /net/192.168.175.147
- 自动挂载资源有两种格式:
- 相对路径法:将mount point路径分成dirname和basename分别配置,可能会影响现有的目录结构
- 绝对路径法:直接匹配全部绝对路径名称,不会影响本地目录结构
实例二
将NFS的共享目录,通过autofs 发布出来,做为远程主机用户的家目录
环境准备
将server中的用户家目录共享出来,node1在登陆这个用户的到时候,看到家目录下的文件是一致的
步骤
- NFS服务器创建用户和相应的目录,将用户user的家目录共享
[root@atopos ~]# systemctl stop firewalld
[root@atopos ~]# setenforce 0
# 关闭防火墙和selinux
[root@atopos ~]# yum install -y nfs-utils
[root@atopos ~]# systemctl start nfs
[root@atopos ~]# mkdir /data
[root@atopos ~]# useradd -d /data/user user
[root@atopos ~]# id user
uid=1000(user) gid=1000(user) 组=1000(user)
[root@atopos ~]# vim /etc/exports.d/test.exports
/data/user *(rw,anonuid=1000,anongid=1000,all_squash)
[root@atopos ~]# systemctl restart nfs
- 在node1客户端上实现autofs
[root@atopos ~]# systemctl stop firewalld
[root@atopos ~]# setenforce 0
# 关闭防火墙和selinux
[root@node1 ~]# yum install -y autofs
[root@node1 ~]# systemctl start autofs
[root@node1 ~]# vim /etc/auto.master
/data /etc/auto.home
[root@node1 ~]# vim /etc/auto.home
* -fstype=nfs,vers=3 192.168.175.144:/data/user&
[root@node1 ~]# systemctl restart autofs
- 在node1客户端上创建用户user
[root@node1 ~]# mkdir /data
[root@node1 ~]# useradd -d /data/user -u 1000 user
- 测试node1上是否存在来自server共享的目录
[root@atopos ~]# su - user
[user@atopos ~]$ touch file
# 在NSF服务器上登录user用户,创建文件在家目录中
[root@node1 /]# su - user
[user@node1 ~]$ ll
总用量 0
-rw-rw-r--. 1 user user 0 1月 16 10:13 file
# 在NSF客户机上登录user用户,发现文件已经被共享了
samba
简介
-
历史:
-
1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block,服务器消息块) 协议,旨在解 决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享 文件变得越来越简单。到了1991年, 当时还在读大学的Tridgwell为了解决Linux系统与 Windows系统之间的文件共享问题,基于SMB协议开发出了 SMBServer服务程序。这是一款 开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的 文件共享 工作。当时,Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB 是没有意义的 字符而拒绝了申请。后来Tridgwell不断翻看词典,突然看到一个拉丁舞蹈的名 字—Samba,而且这个热情洋溢的 舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的 名字由此诞生。Samba服务程序现在已经成为在Linux系 统与Windows系统之间共享文件的 最佳选择
-
SMB协议:
- SMB(服务信息模块)协议是一个高层协议、它提供了在网络上的不同计算机之间共享文 件,打印机和不同通 信资料的手段
- SMB使用NetBIOS API实现面向连接的协议,该协议为Window是客户程序和服务提供了一个 通过虚链路按照 请求——响应方式进行通信的机制
- SMB的工作原理就是让NetBIOS与SMB协议运行在TCP/IP上,并且使用NetBIOS的名字解释 器让Linux机器可 以在Windows的网络邻居中被看到,从而在Windows的网络邻居中被看 到,从而和Windows9x/NT/200X进 行相互沟通,共享文件和打印机
-
CIFS协议:
- 通用网际文件系统是微软服务器消息块协议(SMB)的增强版
- 提供计算机用户在企业内部网和因特网上共享文件的标准方法
- CIFS在TCP/IP运行,利用英特网上的全球域名服务系统(DNS)增强其可扩展性,同时为因 特网上普遍存在 的慢速拨号连接优化
-
应用环境:
- 文件和打印机共享:文件和打印机共享是samba的主要功能,SMB进程实现资源共享,将文 件和打印机发布到网络之中,以供用户可以访问
- 身份验证和权限设置:samba服务支持user mode和domain mode 等身份验证和权限设置模 式,通过加密方式可以保护共享的文件和打印机
- 名称解析:samba通过NMB服务可以搭建NBNS服务器,提供域名解析,将计算机的 NetBIOS名称解析为ip地址
- 名称解析:samba通过NMB服务可以搭建NBNS服务器,提供域名解析,将计算机的 NetBIOS名称解析为ip地址
-
端口号:139和445:
- 在早期,SMB运行于NBT协议上,使用udp协议的137和138以及TCP协议的139端口
cat /etc/services
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp
netbios-dgm 138/tcp # NETBIOS Datagram
# Service
netbios-dgm 138/udp
netbios-ssn 139/tcp # NETBIOS session service
netbios-ssn 139/udp
- NetBIOS协议:
- NetBIOS是Network Basic Input/Output System的简称,网络基本输入输出协议。协议,一 般指能用于局域网通信的一套API,是由IBM公司开发的。主要作用,通过NetBIOS协议获得计算机名称,然后把计算机名称解析为对应的IP地址
服务配置与使用
安装
[root@atopos ~]# yum install samba -y
相关配置文件
/etc/sysconfig/samba:用于设置守护进程的启动参数。
/etc/samba/smb.conf:主配置文件。
/etc/samba/smbusers:用于映射Linux用户和Windows用户。
/etc/samba/lmhosts:用于设置NetBIOS名字与IP地址的对应关系表。
/etc/pam.d/samba:Samba的PAM配置文件
/etc/rc.d/init.d/smb:Samba的INIT启动脚本
相关工具命令
# 服务端工具:
/usr/bin/smbpasswd:用于设置Samba用户账号及口令
/usr/bin/testparm:用于检测配置文件的正确性
/usr/bin/smbstatus:用于查找网络中的Samba服务器
# 客户端工具:
/usr/bin/findsmb:用于查找网络中的Samba服务器
/usr/bin/smbclient:Linux下的Samba客户端
/usr/bin/smbget:基于SMB/CIFS的类似于wget的下载工具
/usr/bin/smbtar:类似于tar的归档工具,用于将SMB/CIFS的共享打包备份到Linux主机
主配置文件详解
[root@atopos ~]# cat /etc/samba/smb.conf
# 默认主配置文件:
[global] #全局参数。
workgroup = MYGROUP #工作组名称
server string = Samba Server Version %v #服务器介绍信息,参数%v为显示SMB版本
号
log file = /var/log/samba/log.%m #定义日志文件的存放位置与名称,参数%m为来访的
主机名
max log size = 50 #定义日志文件的最大容量为50KB
security = user #安全验证的方式,总共有4种
#share:来访主机无需验证口令;比较方便,但安全性很差
#user:需验证来访主机提供的口令后才可以访问;提升了安全性
#server:使用独立的远程主机验证来访主机提供的口令(集中管理账户)
#domain:使用域控制器进行身份验证
passdb backend = tdbsam #定义用户后台的类型,共有3种
#smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码
#tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户
#ldapsam:基于LDAP服务进行账户验证
load printers = yes #设置在Samba服务启动时是否共享打印机设备
cups options = raw #打印机的选项
[homes] #共享参数
comment = Home Directories #描述信息
browseable = no #指定共享信息是否在“网上邻居”中可见
writable = yes #定义是否可以执行写入操作,与“read only”相反
[printers] #打印机共享参数
comment = All Printers
path = /var/spool/samba #共享文件的实际路径(重要)。
browseable = no
guest ok = no #是否所有人可见,等同于"public"参数。
writable = no
printable = ye
安全等级
Samba安全等级:
User:由本地Samba服务器负责账户验证
使用smbpasswd 设置账号(默认的安全等级)
Domain:账户验证账户及口令的工作由其他的Windows 或Samba域控制器负责
需要使用“password server”指令指定验证服务器
Ads:验证账户及口令的工作由支持Kerberos验证的Windows活动目录服务器负责。
需要使用“realm”指令指定Kerberos领域
Share:匿名共享
Samba账户及口令数据库
1.Samba使用的账户文件/数据库是与系统账户文件分离的
2.当设置了user的安全等级后(默认),将由本地系统对问Samba共享资源的用户进行认证
3.用.tdb格式的口令数据库,初始情况下口令数据库文件并不存在
4.为了创建Samba的口令数据库文件,管理员可以在添加Samba账户的同时创建它
5.管理员可以使用smbpasswd命令配置Samba账号并设置其口令
配置一个共享资源(具体步骤)
- 设置共享名称
- 共享资源发布后,必须为每个共享目录或打印机设置不同的共享名称,给网络用户访问时使 用,并且共享名可以与原目录名不同。例如,samba服务器上有个目录为/share,需要发布 该目录为共享目录,定义共享名为public
- 共享资源描述
- 格式:
comment = 备注信息
- 备注信息通常是用来进行解释说明的
- 格式:
- 共享路径
- 共享资源的原始完整路径
- 格式:
path = 绝对路径
- 设置匿名访问
- 共享资源如果对匿名访问进行设置,可以更改public字段
- 格式:
public = yes | no (yes代表允许匿名访问,no代表不允许)
- 设置访问用户
- 如果共享资源存在重要数据的话,需要访问用户审核,可以使用valid users字段进行设置
- 格式:
valid users = 用户
valid users = @组名
- 设置目录只读
- 共享目录如果限制用户的读写操作,可以通过readonly实现
- 格式:
readonly = yes | no
- 设置目录可写
- 如果目录允许用户写操作,可以使用writable或write list两个字段进行设置
- 格式:
writable = yes
读写writable = no
只读write list = 用户名
write list = @ 组名
实例一:通过用户名共享文件
共享销售部 /xsb 这个目录,只有知道用户名和密码的同事可以看这个共享,在/xsb目录中存放销售部重 要的数据。需要将security设置为user级别,这样可以启用samba身份验证机制,然后在共享目录 /xsb 下设置valid user 字段,配置只允许销售部员工能访问这个共享目录
- 修改主配置文件安全相关设置
[root@atopos ~]# vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
security = user
# passdb backend = tdbsam
passdb backend = smbpasswd
smb passwd file = /etc/samba/smbpasswd
printing = cups
printcap name = cups
load printers = yes
cups options = raw
# 重启smb服务之后,会自动生成/etc/samba/smbpasswd该文件
- 添加销售部用户和组
[root@atopos ~]# groupadd xsb
[root@atopos ~]# useradd -g xsb -M -s /sbin/nologin xsb01
[root@atopos ~]# useradd -g xsb -M -s /sbin/nologin xsb02
[root@atopos ~]# useradd jsb01
- 添加相应的samba账户
[root@atopos ~]# smbpasswd -a xsb01
New SMB password:
Retype new SMB password:
Added user xsb01.
[root@atopos ~]# smbpasswd -a xsb02
New SMB password:
Retype new SMB password:
Added user xsb02.
- 指定共享目录
[root@atopos ~]# mkdir /xsb
[root@atopos ~]# cp /etc/hosts /xsb
[root@atopos ~]# vim /etc/samba/smb.conf
[xsb]
comment = Xsb Data
path = /xsb
valid user = xsb01,xsb02
- 重启服务
[root@atopos ~]# systemctl restart smb.service
[root@atopos ~]# systemctl restart nmb.service
- 检查139和445端口号
[root@atopos ~]# ss -tanl
State Recv-Q Send-Q Local Address:Port Peer
Address:Port
LISTEN 0 50 *:139 *:*
LISTEN 0 50 *:445 *:*
LISTEN 0 50 :::139 :::*
LISTEN 0 50 :::445
- 客户端验证
# linux上验证
[root@node1 ~]# yum install samba-client -y
[root@node1 ~]# smbclient -L //192.168.80.151/xsb -U xsb01
Enter SAMBA\xsb02's password:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
xsb Disk Xsb Data
IPC$ IPC IPC Service (Samba 4.10.16)
xsb02 Disk Home Directories
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
SAMBA SERVER1
# 在windows上进行验证
windows验证:
在Window运行输入地址:\\192.168.10.10
用户名:******
密码:******
可以在DOS窗口中使用命令net use * /delete 清空用户缓存信息
- 在Linux上进行挂载
[root@node1 ~]# mkdir /xsbdata
[root@node1 ~]# yum install cifs-utils -y
[root@node1 ~]# vim auth.smb
username=xsb01
password=1
[root@node1 ~]# vim /etc/fstab
//192.168.80.151/xsb /xsbdata cifs defaults,credentials=/root/auth.smb
0 0
[root@node1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17811456 1099604 16711852 7% /
devtmpfs 922468 0 922468 0% /dev
tmpfs 933524 0 933524 0% /dev/shm
tmpfs 933524 8852 924672 1% /run
tmpfs 933524 0 933524 0% /sys/fs/cgroup
/dev/sda1 1038336 145756 892580 15% /boot
tmpfs 186708 0 186708 0% /run/user/0
//192.168.80.151/xsb 17811456 1108900 16702556 7% /xsbdata
[root@node1 ~]# ls /xsbdata/
hosts
案例二:不同账户访问不同目录
- 服务端:
#创建三个samba用户,并指定密码为centos
useradd -s /sbin/nologin -r smb1 #加选项-r 不创建家目录
useradd -s /sbin/nologin -r smb2
useradd -s /sbin/nologin -r smb3
smbpasswd –a smb1 #创建对应账号的口令 ,不加-a表示修改已经存在的账号的口令
smbpasswd –a smb2
smbpasswd –a smb3
[root@atopos ~]#pdbedit -L #查看samba账号
smb1:995:
smb3:993:
smb2:994:
#修改samba配置文件
vim /etc/samba/smb.conf
#在workgroup下加一行
config file= /etc/samba/conf.d/%U 说明:%U表示用户名 #这个步骤为关键步骤
[share] #共享文件夹在最后添加
Path=/data/dir #指定分享文件夹的路径
Read only= NO #不仅仅是只读
Guest ok = yes
write list=@admin
[root@atopos ~]#mkdir /data/dir
[root@atopos ~]#mkdir /data/dir1
[root@atopos ~]#mkdir /data/dir2
[root@atopos ~]#touch /data/dir/share.txt #新建共享文件
[root@atopos ~]#touch /data/dir1/smb1.txt #新建给smb1用户访问特定文件
[root@atopos ~]#touch /data/dir2/smb2.txt #新建给smb2用户访问特定文件
[root@atopos ~]#tree /data/
/data/
├── dir
│ └── share.txt
├── dir1
│ └── smb1.txt
└── dir2
└── smb2.txt
3 directories, 3 files
#针对smb1和smb2用户创建单独的配置文件
[root@atopos ~]#mkdir /etc/samba/conf/smb1 -pv
[root@atopos ~]# vim /etc/samba/conf.d/smb1
[share]
Path=/data/dir1
Read only= NO 等价于writable = yes
Create mask=0644
#说明:默认为744
[root@atopos ~]#mkdir /etc/samba/conf/smb2 -pv
[root@atopos ~]# vim /etc/samba/conf.d/smb2
[share]
path=/data/dir2
systemctl restart smb nmb #重启对应的服务
#用户smb1,smb2,smb3访问share共享目录,看到目录是不同目录,smb3访问的是默认的share目录
- 客户端上验证:
[root@client ~]#smbclient //192.168.32.18/share -U smb1%centos
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Fri Dec 20 13:11:40 2019
.. D 0 Fri Dec 20 13:10:56 2019
smb1.txt N 0 Fri Dec 20 13:11:40 2019
52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
[root@client ~]#smbclient //192.168.32.18/share -U smb2%centos
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Fri Dec 20 13:12:53 2019
.. D 0 Fri Dec 20 13:10:56 2019
smb2.txt N 0 Fri Dec 20 13:12:53 2019
52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
[root@client ~]#smbclient //192.168.32.18/share -U smb3%centos
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Fri Dec 20 13:13:12 2019
.. D 0 Fri Dec 20 13:10:56 2019
share.txt N 0 Fri Dec 20 13:11:26 2019
52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
网站服务
访问网站的基本流程
会单独写博客详谈这个问题
我们每天都会使用web客户端上网浏览网页,最常见的web客户端就是web浏览器,如通用的微软IE, 以及技术人员偏爱的火狐浏览器、谷歌浏览器等。当我们在web浏览器输入网站地址时(例如 www.baidu.com
),很快就会看到网站的内容。这一切似乎看起来很神奇,那么在其背后到底时怎样的 实现流程呢?也许普通的上网者无需关注,但作为一个IT技术人员,特别时合格的Linux运维人员,就需要清晰的掌握了。
访问网址的流程:
- 客户端,浏览器输入网址信息点击回车
- 客户端,完成域名解析过程DNS
- 浏览器缓存
- 系统缓存
- 路由器缓存————————以上均为DNS客户端的缓存!!
- ISP DNS缓存
- 根域名服务器
- 顶级域名服务器
- 主机名服务器
- 保存结果至缓存
- 客户端,直接访问响应网址服务器,建立tcp三次握手过程
- 客户端,访问网址服务器,发送HTTP请求报文(多次)
- 服务端,响应客户端请求,回复HTTP响应报文(多次)
- 客户端,浏览器查看到网址页面,浏览器完成html解析
- 客户端,结束网站访问
HTTP 协议
简介
- HTTP协议,全称HyperText Transfer Protocol,中文名为超文本传输协议,是互联网中最常用的 一种网络协议。HTTP重要应用之一是www服务。涉及HTTP协议最初的目的就是提供一种发布和接 受HTML页面的方法。HTTP协议是互联网上最常用的通信协议之一,它有很多的应用,但最流行的 就是用于web浏览器和web服务器之间的通信,即www应用或称web应用
- HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件, 查询结果等)的应用层协议
- HTTP协议工作于C/S或B/S架构。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发 送所有请求。 Web服务器根据接收到的请求后,向客户端发送响应信息。
URI和URL
URI
URI:是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的URI一般由三部组成:①访问资源的命名机制②存放资源的主机名③资源自身的名称,由路径表示,着重强调于资源。
URL
URL:是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
URL:是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:①协议(或称为服务方式)②存有该资源的主机IP地址(有时也包括端口号)③主机资源的具体地址。如目录和文件名等