0%

2024.6.18,23周岁了

有时候时间过得真的好快,大抵还是两年前的六月我才刚毕业,一晃就过去两年了。

回想起从第一份工作的不辞而别,到这份工作也已经快俩个年头了,时常性的告诉自己不应该摆烂,却又沉溺于那温柔乡。

好在近来遇到因事有所觉悟,稍加以告诫,亦有所收获。

23岁的生日,自己都没有意识到,就这样子如期而来,近来几天在工厂车间支援,偶然闲暇之余思绪飞散,想来若是如这般日夜不停,恐怕也难以进行自我提升,多是进入此般循环。

最近很喜欢看影视飓风,里面有一段很有感觉

如果你把视野拉长,你把时间尺度、观察距离拉长,你会发现人生怎么这么苦,全是很多很难解决的问题,不管是这个家庭关系,还是工作,然后人生的下半场诸如此类的,你会感觉到很强的焦虑感,或者会觉得不适,未来好没有希望啊特别难受。

但是如果你把视野不往长了看,你往短了看,要短到一个极限的看,这种感觉还是挺值得期待的,当你把你对未来的期待,收缩到一天之内,或者说几个小时之内,那可能你的感觉会更好一些

23岁啊,这样的一个年龄,既不是《陀飞轮》里的过去18岁,又还没到所谓的

霎眼27岁。已经消磨了那么多年,余下已所剩无几了,愿今日执笔于此,忘加以勉励!

行则将至,道阻且行!

在RHEL7后,原先的守护进程替换为了systemd,用systemctl命令替换了很多管理命令。

使用nmtui配置网卡参数、手工将多块网卡做绑定

使用nmcli命令查看网卡信息

使用ss命令查看网络及端口状态

阅读全文 »

iptables与firewalld防火墙

了解防火墙管理工具

防火墙虽有软件或硬件之分但主要功能还是依据策略对外部请求进行过滤,成为公网与内网之间的保护屏障,防火墙会监控每一个数据包并判断是否有相应的匹配策略规则,直到满足其中一条策略规则为止,而防火墙规则策略可以是基于来源地址,请求动作或协议来定制的,最终仅让合法的用户请求流入到内网中,其余的均被丢弃

在红帽RHEL7系统中firewalld服务取代了iptables服务,但依然可以使用iptables命令来管理内核的netfilter。

但其实iptables服务与firewalld服务都不是真正的防火墙,它们都只是用来定义防火墙规则功能额度”防火墙管理工具”,将定义好的规则交由内核中的netfilter即网络过滤器来读取,从而真正实现防火墙功能,所以其实在配置规则的思路上是完全一致的。

阅读全文 »

存储结构与磁盘划分

目录结构

主要常见的目录定义:

目录名称 应放置文件的内容
/boot 开机所需文件——内核,开机菜单及所需配置文件等
/dev 任何设备与接口都以文件形式存放在此目录
/etc 配置文件
/home 用户主目录
/bin 单用户维护模式下还能够被操作的命令
/lib 开机时用到的函数库及/bin与/sbin下面命令要调用的函数
/sbin 开机过程中需要的
/media 一般挂载或删除的设备
/opt 放置第三方的软件
/root 系统管理员的主文件夹
/srv 一些网络服务的数据目录
/tmp 任何人均可使用的”共享”临时目录
/proc 虚拟文件系统,例如系统内核,进程,外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin 非系统开机时需要的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变换的文件,如日志
/lost+found 当文件系统发生错误事,将一些丢失的文件片段存放在这里

绝对路径(absolute):由根目录(/)开始写起的目录或文件名

相对路径(relative):相对于当前路径的写法

阅读全文 »

用户身份与文件权限

用户身份与能力

UID值

(User IDentification的缩写)每个用户都有对应的UID值,就像身份证号码

超级用户UID:root用户默认为0

系统用户UID1-999:系统中系统服务由不同用户运行,更加安全,默认被限制登录系统

普通用户UID1000-:即管理员创建的用于日常工作而不能管理系统的普通用户

(注意UID一定是不能冲突的,管理员创建的普通用户UID从1000开始,即便前面有闲置的号码)

账户名称与UID保存在/etc/passwd文件中,而账户密码则保存在/etc/shadow文件中

GID

(Group IDentification的缩写):可将多个用户加入某个组,方便指派任务或工作

每个用户在被创建时均会创建一个默认组(其GID与UID相同,俗称基本组)而后加入的则叫拓展组,一定要分清楚。

用户组名称与GID保存在/etc/group文件中

文件权限与归属

linux中一切都是文件,文件和目录的所属与权限——来分别规定所有者、所有者、其余人的读、写、执行权限

读(read)、写(write)、执行(excute),简写(r,w,x),也可用数字(4,2,1)表示


第一位代表文件类型:

- 普通文件
d 目录文件
l 链接文件
b 块设备文件
c 字符设备文件
p 管道文件

普通文件即实际保存数据的地方,其并不具备删除自身的权限:

    r:可读取文件的实际内容

    w:可编辑/新增/修改该文件的实际内容

    x:可被执行

目录文件即保存有目录结构和文件权限:

    r:可读取目录结构和权限

    w:可更爱目录结构列表,新建/删除/重命名/、转移子文件/目录

    x:表示用户可进入到该目录中

文件的特殊权限

单纯对文件位置的rwx权限肯定不能满足我们对于安全、便捷工作的需求,所有便有了SUID和SGID的特殊权限机制

SUID

让执行者临时拥有主的权限(仅对有执行权限的二进制程序有效)

比如所有用户都可以执行用于修改用户密码的passwd命令,单用户密码保存在/etc/shadown文件中,默认权限是000即除了root外所有用户都没有查看或编辑该文件的权限,所以对passwd命令加上SUID权限位,则可让普通用户临时获得程序所有者的身份,即以root用户的身份将变更的密码信息写入到shadow文件中。

SGID

功能一:让执行者临时拥有属组的权限(对拥有执行权限的二进制程序设置)


文件的隐藏属性

文件权限除了读写执行与SUID、SGID、SBIT外还有一种隐藏权限,例如明明有权限删除某个文件却报错了,或者仅能为某个文件追加内容而不能减少内容,遇到这种很”奇怪”的文件,就要怀疑是文件被设置隐藏权限了

主要命令:

chattr

lsattr

文件访问控制列表

rwx权限、特殊权限、隐藏权限都是对某一类用户设置的,如果对某个制定的用户进行单独的权限设置,那么就需要用文件的访问控制列表来实现啦。

我们可以基于普通文件或目录设置进行设置ACL,通俗来说ACL就是设置指定的特定用户或用户组队某个文件的操作权限。并且如果对某个目录设置了访问控制策略,那么子文件则继承其访问策略,而若对文件设置了访问控制策略则不再继承上级目录的控制策略。

有点类似于Windows系统的安全策略

主要命令:

setfacl

getfacl

管道符、重定向与环境变量

管道命令符”|”

管道命令符“|”的作用是将前一个命令的标准输出当做后一个命令的标准输入,格式为”命令A|命令B“。

例如前面学习的grep命令匹配关键词(/sbin/login)找出所有被限制登录系统的用户,如果我们希望统计所有不允许登录系统的用户个数,该怎么做呢:

首先理清思路:

找出被限制登录用户的命令:grep “/sbin/nologin” /etc/passwd

统计文本行数的命令则是:wc -l

现在要做的事就是将搜索命令的输出值传递给统计命令,其实只要把管道符夹在中间就可以了。

因此结果即为:grep “/sbin.nologin/” /etc/passwd | wc -l

以下为部分管道符使用例子:

1、用翻页的形式查看/etc目录中又哪些文件

ls -l /etc | more

2、向linuxprobe用户发送一封邮件

echo “content” | mail -s “Subject” linuxprobe

3、使用非交互式设置用户密码,将root的密码修改为linuxprobe

echo “linuxprobe” | passwd -stdin root

输入输出重定向

先做一个简单的演示

查看linuxprobe目录的信息:

ls linuxprobe/

(……文件信息)

ls xxxxx/

ls: cannot access xxxxx:no such file or directory

[前者执行后返回的是标准输出,后者执行失败返回的是错误输出]

标准输入(STDIN,文件描述符为0:默认从键盘输入,为0时表示是从其它文件或命令的输出
标准输出(STDOUT,文件描述符为1):默认输出到屏幕,为1时表示是文件
错误输出(STDERR,文件描述符为2):默认输出到屏幕,为2时表示是文件

对于输出重定向符有这些情况:

符号 作用
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误标准输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>$1 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

对于输入重定向有这些情况:

符号 作用
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符 从标准输入中读入,知道遇见“分界符”才停止
命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2

那么来做几个输出和输入重定向的实验:

1、将man命令的帮助文档写入到/root/man.txt中:

man bash > /root/man.txt

2、向readme.txt追加一行文字

echo ”test” >> readme.txt

3、将readme.txt文件作为输入重定向给 wc -l 命令来计算行数

wl -l < readme.txt

命令行通配符

通配符 含义
* 匹配零个或多个字符
匹配任意单个字符
[0-9] 匹配范围内的数字
[abc] 匹配已出额度任意字符

bash解释器还支持很多的特殊字符拓展:

字符 作用
\ (反斜杠) 转义后面单个字符,例如$是变量定一个符号会报错,可以通过\来进行转义
‘’(单引号) 转义所有的字符
“”(双引号) 变量依然生效
“(反引号) 执行命令语句

1、定义一个变量

Price=5

2、输出Price is 5

echo “Price is $Price”

3、但如果想要输出Price is 5,就会因为是变量定义而报错,这时候可以使用转义字符\

echo “Price is $$Price”

4、使用单引号,变量将不再被取代

echo ‘Price is $$Price’

Price is $$Price

5、执行uname -a 后可以查看到本机内核的版本与架构 (反引号里面的命令会被执行):

echo ’uname -a’

PATH变量

在linux中一切都是文件,命令文件也不例外,在用户执行一条’ls’命令后发生了什么:

1、如果是以绝对/相对路径输入的命令则直接执行(如执行/bin/ls)

2、检查是否为alias别名命令

3、有bash判断其是’内部命令’还是’外部命令’

内部命令:属于解释器内部的

外部命令:独立于解释器外的命令文件

4、通过$PATH变量中定义的路径进行命令查找

查看PATH变量的方法:echo PATH

使用 ‘type 命令名字’来得知是内部命令还是外部命令

在$PATH中目录之间用 : 间隔开了

为变量增加新的值:PATH=$PATH:[路径]

环境变量

变量名称 作用
HOME 用户的主目录”家”
SHELL 当前的shell是哪个程序
HISTSIZE 历史命令记录条数
MAIL 右键信箱文件
LANG 语系数据
RANDOM 随机数字
PS1 bash提示符
HISTFILESIZE history命令存储数量
PATH 在路径中得目录查找执行文件
EDITOR 默认文本编辑器
HOME 用户主目录

创建变量:[变量名]=[提供的值]

用户创建的变量只是局部变量,若要别的用户也能使用可以通过export提升至全局变量

了解vim编辑器

命令 作用
dd 删除(剪切)光标所在的整行
5dd 删除(剪切)从光标处开始的5行
yy 复制光标所在整行
5yy 复制从光标处开始的5行
p 将之前删除(dd)或符直(yy)过的数据贴到光标后
/字符串 在文本中从上至下搜索该字符串
?字符串 在文本中从下至上搜索该字符串
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步的操作

vim编辑器的末行模式中的常用命令:

命令 作用
:w 保存
:q 推出
:q! 强制退出(放弃对文本的修改内容)
:wq! 强制保存退出
:set nu 显示行号
:命令 执行该命令
:整数 跳转到该行

配置网卡信息

网卡配置文件的前缀为 “eth”,第一块为eth0,第二块为eht1,以此类推……

在RHEL7系统中网卡配置文件的前缀则为ifcfg-eno

网卡的配置文件存放在 /etc/sysconfig/network-scripts目录中

网卡配置文件关键词术语:

网卡类型:TYPE=Ethernet

地址分配模式:BOOTPROTO=static

网卡名称:NAME=eno…..
是否启动:onboot=yes

IP地址:IPADDR=X.X.X.X

子网掩码:NETMASK=X.X.X.X

网卡地址:GATEWAY=192.168.10.1

DNS地址:DNS1=192.168.10.1

配置网卡信息简单思路:

1、切换到 /etc/sysconfig/network-scripts 目录中

2、使用vim命令修改网卡配置文件 ifcfg-eno…

3、逐项写入配置参数,并保存退出

4、重新启动网卡命令 systemctl restart network

5、通过ping命令测试网卡信息是否生效

配置yum仓库

配置光盘yum源挂载:

1、切换到 /etc/yum.repos.d 目录(该目录存放yum仓库配置文件)

2、使用vim编辑器创建并打开一个名为 xxx.repo的新文件,名称自定义,后缀为repo

3、逐项写入配置参数,并保存退出

4、按配置参数的路径将光盘挂在

5、架构光盘挂载信息写入到/etc/fstab文件中

6、使用yum install https -y 命令检查是否配置正确

简单的repo文件配置:

1
2
3
4
5
[test]
name=test
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0

创建光盘的挂载目录:

mkdir -p /media/cdrom

挂载光盘:

mount /dev/cdrom /media/cdrom

设置开机自动挂载:

vim /etc/fstab

/dev/cdrom /media/cdrom iso9660 defaults 0 0

了解shell脚本

查看系统中所有可用的shell解释器:

cat /etc/shells

查看当前的shell解释器:

echo $SHELL

编译简单的脚本

shell脚本的编写要使用到vim文本编辑器,按照命令的执行顺序一次编写,每行写一条linux命令。并且一个完整的shell脚本则应该包括”脚本声明”、”注释信息”和”可执行语句”。

脚本声明(#!):告知系统用何种shell来解释

注释信息(#):对可执行语句或程序功能做介绍,可以不写

可执行语句:执行的具体命令

一个简单的shell脚本示例:

vim example.sh

1
2
3
4
#!/bin/bash
#显示当前的工作路径并列出当前目录下的所有文件与属性
pwd
ls -al

执行脚本有三种方法:

1、脚本文件路径:/example.sh

2、sh脚本文件路径:sh example.sh

3、source脚本文件路径:source example.sh

(只要脚本文件路径没有写错,sh或source命令都可以直接执行改脚本,但一般来说可能会出现权限不足的错误,所以需要使用chmod来赋予权限)

chmod u+x example.sh

接收用户的参数

shell脚本能够让用户更灵活的完成工作需求,应该有办法接受用户输入的参数,像上面的脚本的写法真的很不灵活

在可执行文件中已经内设:命令名 参数1 参数2 参数3

$0 当前执行的shell脚本的程序名
$1-9,{10},{11}… 参数的位置变量
$# 一共有多少个变量
$** 所有位置变量的值
$? 判断上一条命令是否执行成功,0为成功,非0为失败

一个可以接收用户参数的shell脚本:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$!,第五个为$5"


[root@zhou tmp]# sh example.sh 1 2 3 4 5
当前脚本名称为example.sh
总共有5个参数,分别是1 2 3 4 5
第一个参数为,第五个为5

判断用户的参数

shell脚本有时还要判断用户输入的参数,例如像mkdir命令一眼,当目录不存在则创建,若已存在则报错,条件测试语句能够测试特定的表达式是否成立,当条件成立时返回值0,否则返回其他数值

测试语句格式:[ 条件表达式 ] (需要注意的是两边均应有一个空格)

细分测试语句有:文件测试、逻辑测试、整数值比较、字符串比较

文件测试:[ 操作符 文件或目录名 ]

操作符 作用
-d 测试是否为目录
-e 测试文件或目录是否存在
-f 判断是否为文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
1
2
3
4
5
6
7
8
[root@zhou tmp]# [ -d /etc/fstab ]
[root@zhou tmp]# echo $?
1


[root@zhou tmp]# [ -f /etc/fstab ]
[root@zhou tmp]# echo $?
0

符号&&代表逻辑上的”与”,当前面的命令执行成功后才会执行后面的命令

判断/dev/stdin是否存在,若存在则输出exist

[root@zhou ~]# [ -e /dev/stdin ] && echo “exist”
exist

逻辑测试:[ 表达式1 ] 操作符 [ 表达式2 ]

操作符 作用
&& 逻辑的与,”而且”的意思
\
! 逻辑的否
1
2
3
4
5
6
7
8
9
USER变量是当前登录的用户名
[root@zhou ~]# echo $USER
root

若当前登录的用户不是root,输出user,是root则为空
[root@zhou ~]# [ $USER! = root ] && echo "user"

非root输出user,root输出root
[root@zhou ~]# [ $USER! = root ] && echo "user" || echo "root"

整数值比较:[ 整数1 操作符 整数2 ]

操作符 作用
-eq 判断是否等于
-ne 判断是否不等于
-gt 判断是否大于
-lt 判断是否小于
-le 哦安短是否等于或小于
-ge 判断是否大于或等于
1
2
3
4
5
6
7
8
9
10
比较10是否大于10
[root@zhou ~]# [ 10 -gt 10 ]
[root@zhou ~]# echo $?
1
#显示上一条命令执行失败,10不大于10

比较10是否等于10
[root@zhou ~]# [ 10 -eq 10 ]
[root@zhou ~]# echo $?
0
1
2
3
4
5
获取当前可用的内存量,并将此值赋值给变量freemem
首先用free-m查看以m为单位的内存使用情况
然后grep cache过滤出剩余内存的行
最后用awk '{print $3}'过滤只保留第三列
而freemen='语句'则表示执行里面的雨具后赋值给变量

字符串比较:[字符串 1 操作符 字符串2]

操作符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
1
2
3
4
#判断string变量是否为空
[root@zhou tmp]# [ -z $string ]
[root@zhou tmp]# echo $?
0

条件测试语句

if条件语句

if条件语句分为 单分支结构、双分支结构、多分支结构

单分支结构:仅用if、then、fi关键词组成,只在条件成立后执行

1
2
3
4
5
6
7
8
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi

#判断目录是否存在,若不存在则自动创建

双分支结构:由if、then、else、fi关键词组成,做条件成立或条件不成立的判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 is up"
else
echo "host $1 is down"
fi

#判断主机能否ping通,根据返回结果分别给予提示或警告
ping -c 代表发送的数据包额度个数
ping -i 代表每0.2秒发送一个数据包
ping -W 代表3秒即超时
$1为用户输入额度第一个参数
$?为上一条命令的执行结果,判断是否等于0(0为成功)

多分支结构:是有if、then、else、elif、fi关键词组成,根据多种条件成立的可能性执行不同的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
read -p "Enter your score (0-100): " GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ];then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ];then
echo "$GRADE is PASS"
else echo "$GRADE is Fail"
fi

#判断用户呼入的分数在哪个区间内,然后判定为优秀、合格或不合格
使用read命令让用户为GRADE变量赋值
大于85小于100输出excellent
大于70小于84输出pass
其余情况输出fail

for条件语句

for条件语句会先读取多个不同的变量值,然后逐一执行同一组命令

1
2
3
4
5
6
7
8
创建用户名文件
[root@zhou tmp]# vim test.txt
andy
barry
carl
duke
eric
george
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
read -p "Enter the password: " PASSWD
for UNAME in `cat test.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Create success"
else
echo "Create failure"
fi
fi
done

shell脚本提示用户输入要设置的密码并赋值给PASSWD变量
从test.txt文件中读入用户名并赋值给UNAME变量
而查看用户的信息都重定向到/dev/null文件,不显示屏幕

2、测试主机是否在线

1
2
3
4
5
首先创建主机地址列表:
[root@zhou tmp]# vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
HLIST=$(cat /tmp/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is up."
se
echo "Host $IP is down."
fi
done

从ipadds.txt中读取主机地址后赋值给HLIST变量
逐个ping列表中的主机IP地址测试主机是否在线

while条件语句

while条件语句用于测试重复测试某个条件,当小件成立时则继续重复执行

随机生成0-999的数字,猜数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "randow 0-999"
while true
do
read -p "input numbers: " INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "It's $PRICE"
echo "猜了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "so high"
else
echo "so low"
fi
done

let可以使变量进行运算,无需加$

case条件语句

case条件语句可以依据变量的不同数值,分别执行不同的命令动作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
read -p "输入一个字符: " KEY
case "$KEY" in
[a-z]|[A-Z])
echo "输入的是字母。"
;;
[0-9])
echo "输入的是数字。"
;;
*)
echo "输入的是其他。"
esac

提示用户输入一个字符,判断该字符是字母、数字或特殊字符
;;相当于break的效果,退出

man (查看命令的帮助信息)

格式:man [命令名]

man命令中常用按键及用途

按键 用途
空格键 向下翻一页
page down 向下翻一页
page up 向上翻一页
home 返回首页
end 返回尾页
/ 从上至下搜索某个关键词,如”/linux”
? 从下至上搜索某个关键词,如”?linux”
n 定位到下一个搜索到的关键词
N 定位到上一个搜索到的关键词
q 退出帮助文档

man命令的帮助信息的目录结构以及意义

结构名称 代表意义
NAME 命令的名称
SYNOPSIS 参数的大致使用办法
DESCRIPTION 介绍说明
EXAMPLES 演示(附带简单说明)
OVERVIEW 概述
DEFAULTS 默认的功能
OPTIONS 具体的可用选项(带介绍)
ENVIRONMENT 环境变量
FILES 用到的文件
SEE ALSO 相关的资料
HISTORY 维护历史与联系方式

PS (用于查看系统中的进程状态)

参数 作用
-a 显示所有进程(包括其它用户的进程)
-u 用户以及其它详细信息
-x 显示没有控制终端的进程

linux中5种常见的状态

R(运行):进程正在运行队列中等待

S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离状态

D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其终端

Z(僵死):进程已经终止,但进程描述符依然存在,直到父进程调用wait4()系统函数后将进程释放

T(体质):进程收到停止信号后停止运行

进程状态

参数 注释
USER 进程的所有者
PID 进程ID号
%CPU CPU占用率
%MEN 内存占用率
VSZ 虚拟内存使用量(单位KB)
RSS 占用的固定内存量(单位KB)
TTY 所在终端
STAT 进程状态
START 被启动的时间
TIME 实际使用CPU的时间
COMMAND 命令名称与参数

top (动态的监视进程活动与系统负载等信息)

top命令前五航为系统整体的统计信息

第一行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值、数值越小意味着负载越低)

第二行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数

第三行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等(均为CPU数据并以百分比格式显示)

第四行:物理内存总量,内存使用量,内存空闲两、作为内核缓存的内存量

第五行:虚拟内存总量,虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量

pidof (用于查询某个指定服务进程的PID值)

格式:pidof [参数] [服务名称]

kill (用于终止某个指定PID的服务进程)

格式:kill [参数] [进程PID]

killall (用于终止某个指定名称的服务所对应的全部进程)

格式:killall [参数] [进程名称]

类似于windows下的结束进程树

wget (使用命令下载网络文件)

格式:wget 【参数】 下载地址

-b 后台下载模式
-O 下载到指定目录
-t 最大尝试次数
-c 断电续传
-p 下载页面内所有资源,包括图片,视频等
-r 递归下载

free (查看当前系统中内存的使用量情况)

格式:free 【-m/-g】

who (查看当前登入主机用户的情况)

格式:who [参数]

last (查看系统的登入情况)

格式:last [参数]

history (显示历史执行过的命令)

格式:history [-c]

默认会保存1000条执行过的文件,若要修改可以直接编辑/etc/profile文件的HISTSIZE值

pwd (用于显示当前的工作目录)

格式:pwd [选项]

-p 显示真实路径(即非快捷链接的地址)

cd (用于切换工作路径)

格式:cd [目录名称]

参数 作用
- 切换到上一次的目录,如”cd -“
~ 切换到”家目录”,如”cd ~”
~username 切换到其他用户的home目录,如”cd ~teak”
.. 切换到上级目录,如”cd ..”

ls (用于查看当前目录下有哪些文件)

参数 作用
-a 查看全部文件(包括隐藏文件)
=d 仅查看目录本身
-h 易读的文件容量(如k,m,g )
-l 显示文件的详细信息

cat (用于查看纯文本文件(较短的))

格式:cat [选项] [文件]

参数 作用
-n 显示行号
-b 显示行号(不包括空行)
-A 显示”不可见”的符号,如tab,空格键等等

more (用于查看纯文本文件(较长的))

格式:more [选项] 文件

参数 格式
-数字 预先显示的行数(默认为一页)
-d 显示提示语句与报错信息

head (用于查看纯文本文档的前N行)

格式:head [选项] [文件]

参数 作用
-n 10 显示10行
-n -10 正常输出(如cat命令),但不显示最后的10行

tail (用于查看纯文本文档的后N行)

格式:tail [选项] [文件]

参数 作用
-n 10 显示后面的10行
-f 持续刷新显示的内容

od (查看特殊格式的文件)

格式:od [选项] [文件]

参数 作用
-t a 默认字符
-t c ASCII字符
-t o 八进制
-t d 十进制
-t x 十六进制
-t f 浮点数

tr (转换文本文件中得字符)

格式:tr [原始字符] [目标字符]

例:cat tr.txt [a-z] [A-Z]

wc (用于统计指定文本的行数、字数、字节数)

格式:wc [参数] 文本

参数 作用
-l 只显示行数
-w 只显示单词数
-c 只显示字节数

例:统计当前系统中的用户个数

wc -l /etc/passwd

cut (用于通过列来提取文本字符)

格式:cut [参数] 文本

参数 作用
-d 分隔符 指定分隔符,默认为tab
-f 指定显示的列数
-c 单位改为字符

例:

获取当前系统中所有用户的命长:

参数作用:-d以”:”来作为分隔符,-f参数代表只看第一列的内容

cut -d: -f1 /etc/passwd

获取root用户的默认SHELL解释器:

grep ^root /etc/passwd | cut -d: -f7

diff (用于比较多个文本文件的差异)

格式:diff [参数] 文件

参数 作用
-b 忽略空格引起的差异
-B 或略空行引起的差异
-brief或-q 仅报告是否存在差异
-c 使用上下文输出格式

touch (用于创建空白文件与修改文件时间)

格式:touch [选项] [文件]

参数 作用
-a 近修改’访问时间’(atime)
-m 近修改’更改时间’(mtime)
-d 同事修改atime和mtime
-t 要修改成的时间[YYMMDDhhmm]

mkdir (创建空白的文件夹)

格式:mkdir [选项] 目录

参数 作用
-m=MODE 默认的文件目录
-p 连续创建多层目录(若文件夹已存在泽忽略)
-v 显示创建的过程

cp (用于复制文件或目录)

格式:cp [选项] 源文件 目标文件

复制命令的三种情况:

    目标文件是一个目录,会将源文件复制到该目录中。

    目标文件是一个文件,会将源文件覆盖该文件。

    目标文件不存在,将会复制源文件并修改为目标文件的名称(重命名)。

参数 作用
-p 保留原始文件的属性
-d 若对象为’链接文件’,则保留该’链接文件’的属性
-r 递归持续复制(用于目录)
-i 若目标文件存在则询问是否覆盖
-a 相当于-pdr(p,d,r为上述的参数)

mv (mv命令用于移动文件或改名)

格式:mv [选项] 文件名 [目标路径|目标文件名]

rm (用于删除文件或目录)

格式:rm [选项] 文件

参数 作用
-f 忽略警告信息
-i 删除前先询问
-f 删除文件夹

dd (用于指定大小的拷贝的文件或指定转换文件)

格式:dd [参数]

参数 作用
if 输入的文件名称
of 输出的文件名称
bs 设置每个”块”的大小
count 设置要拷贝“块”的个数
conv=ucase 将字母从小写转换为大写
conv=lcase 把字母从大写转换为小写

将光驱设备拷贝成镜像文件:

dd if=dev/cdrom of=RHEL-SERVER-7.0-X86-LinuxProbe.Com.iso

生成一个560m的空白文件:

dd if=/dev/zero of=560_file count=1 bs=560M

将硬盘的MBR信息拷贝出来:

dd if=/dev/sda of=sda_image count-1 bs=512K

useradd (用于创建新的用户)

useradd [选项] 用户名

参数 作用
-d 指定用户的家目录(默认为/home/username)
-D 展示默认值
-e 账号有效截至日期,格式:YYYY-MM-DD
-g 指定一个初始用户组(必须已存在)
-G 指定一个或多个拓展用户组
-N 指定默认的shell
-s 指定默认的Shell
-u 指定用户的UID

创建名为linuxprobe的用户,并定义家目录路径,UID以及登录解释器(不允许登录):

useradd -d /gome/linux -u 8888 -s /sbin/nologin linuxprobe

passwd (用于修改用户的密码)

格式:passwd [选项] [用户名]

参数 作用
-l 锁定用户进制其登陆
-u 解除锁定,允许用户登陆
–stdin 允许从标准输入修改用户密码,如(echo “NewPassWord” \
-d 使账号无密码
-e 强制用户下次登陆时修改密码
-S 显示用户的密码状态

userdel (用于删除用户所有表格)

格式:userdel [选项] 用户名

参数 作用
-f 强制删除用户,家目录与相关条件
-r 同时删除用户,家目录与其相关条件

usermod (用于修改用户的属性)

格式:usermod [选项] 用户名

参数 作用
-c 填写账号的备注信息
-d -m -d与-m连用,可重新指定用户的家目录并自动旧的数据转移过去
-e 账户到期时间,格式“YYYY-MM-DD”“
-g 变更所属用户组
-G 变更拓展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的UID

groupadd (用于创建群组)

格式:groupadd [选项] 群组名

tar (用于对文件打包压缩或解压)

格式为:tar [选项] [文件]

参数 作用
-c 创建压缩文件
-x 解开压缩文件
-t 查看压缩包内有哪些文件
-z 用Gzip压缩或解压
-j 用bzip2压缩或解压
-v 显示压缩或解压的过程
-f 目标文件名
-p 保留原始的权限与属性
-P 使用绝对路径来压缩
-C 指定解压到的目录

grep (用于对文本进行搜索)

格式:[选项] [文件]

搜索某个关键词:grep (关键词) (文本文件)

参数 作用
-b 将可执行文件(binary)当做文本文件(text)来搜索
-c 仅显示找到的次数
-i 忽略大小写
-n 显示行号
-v 反向选择——仅列出没有“关键词”的行

find (用于查找文件)

格式:find [查找路径] (寻找条件) (操作)

参数 作用
-name 匹配名称
-perm 匹配权限,(mode为完全匹配,-mode为包含即可)
-user 匹配所有者
-group 匹配所有组
-mtime -n +n 匹配修改内容的时间(-n指n天以内,+n指n天以前)
-atime -n +n 匹配访问文件的时间(-n指n天以内,+n指n天以前)
-ctime -n+n 匹配修改权限的时间(-n指n天以内,+n指n天以前)
-nouser 匹配无所有者的文件
-nogroup 匹配无所有组的文件
-newerf1 !f2 匹配比文件f1新却比f2旧的文件
-type v/d/c/p/l/f 匹配文件类型(块设备、目录、字符设备、管道、链接文件、文件文件)
-size 匹配文件的大小(+50k查找超过50k的文件,而-50k则代表查找小鱼50k的文件)
-prune 忽略某个目录
-exec {} ; 后面可接对搜索到结果进一步处理的命令(下面会有演示)

例子:

1、搜索在/etc/自己拍卖行所有以host开头的文件

find /etc/ -name “host*” -print

2、

搜索整个系统中所有包含SUID的文件(因SUID的数字表示法是4,而减号表示只要包含)

find / -perm -4000 -print

3、

找出用户linuxprobe的文件并复制到/root/findresults目录

(重点是 “-exec {} :” 其中的{}代表find命令搜索出的文件,记住结尾必须是:)

find / -user linuxprobe -execcp -arf {} /root/findresults/ :

alias (用于设置命令的别名)

格式: alias 别名=命令

例如担心复制文件时误将文件覆盖,那么执行alias cp=”cp -i”

unalias (取消命令的别名)

格式:unalias 别名

env (查看环境变量)

格式:env(直接输入env回车)

export (将局部变量提升为全局变量)

格式:export 变量名

read(将用户的输入参数赋值给制定变量)

格式:” read -p [提示语句] 变量名”

chattr(用于设置文件的隐藏权限)

格式:chattr [参数] 文件

chattr +a linuxprobe

参数 作用
i 将无法对文件进行修改,若对目录设置后则仅能够修改子文件而不能新建或删除
a 仅允许补充(追加)内容无法覆盖/删除(append only)
S 文件内容变更后同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A 不再修改这个文件的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 当使用dump命令备份时忽略本文件/目录
c 默认将文件或进行压缩
u 当删除此文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
X 可以直接访问压缩文件的内容

lsattr(用于显示文件的隐藏权限)

格式:lsattr [参数] 文件

参数 作用
a 显示所有文件和目录
l 显示隐藏属性的全称(默认简写成一个字母)
R 地柜处理,将制定目录下的所有文件及子目录一并处理
d 若目标文件为目录,请加此参数

su(用于变更使用者的身份,切换登陆者)

格式:su [-] 用户名

root用户切换其他用户无需输入密码

普通用户切换用户需要输入密码

如果要将环境变量改变为新用户的,请加参数’-‘

sudo(用于给普通用户提供额外权利来完成原本超级用户才能完成的任务)

格式:sudo [参数] 命令名称

总结来说sudo的特色功能有:

1、限制用户执行指定的命令

2、记录用户执行的每一条命令

3、配置文件(/etc/sudoers)根据集中的管理用户、权限与主机等参数

4、验证过密码后5分钟(默认值)内无须再让用户验证密码,更加额度方便

sudo命令的常用参数包括有:

参数 作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或UID值 以指定的用户身份执行命令
-k 清空安全时间,下次执行sudo时需要再次密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语

setfacl(用于增加或者修改ACL规则)

格式:setfacl [参数] 文件

参数 作用
-R 递归(对目录使用)
-m 设置文件的acl规则
-b 删除acl规则

getfacl(用于显示文件的ACL规则)

格式:getfacl 文件

mount(用于挂载文件系统)

格式:mount 文件系统 挂载目录

参数 作用
-a 挂载所有在/etc/fstab中定义的文件系统
-t 指定文件系统的类型

umount(撤销已挂载的设备文件)

格式:umount [挂载点/设备文件]

fdisk(用于管理磁盘分区)

格式:fdsik [磁盘名称]

参数 作用
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区的类型
p 查看分区表信息
w 保存并退出
q 不保存直接退出

mkfs(用于格式化分区)

格式:mkfs.[分区格式] [硬盘分区名]

例:mkfs.xfs /dev/sdb1

df(查看挂载点信息与磁盘使用量)

格式:df [选项] [文件]

查看挂载信息与硬盘使用量:df -h

参数 作用
-a 显示所有的文件系统(包括虚拟的)
-total 展出出总体使用量
-h 更易读的容量格式如1K,234M,2G···
-i 展示出inode的信息(默认是磁盘使用信息)
-T 显示出文件系统的类型

du(查看磁盘的使用量)

格式:du [选项] [文件]

查看更目录中个文件夹所占空间:dh sh /

查看档案目录下个文件夹所占看就看“du -sh *

参数 作用
-a 评估每个文件而非目录整体占用量
-c 评估每个文件并计算出总占用量总和
-h 更易读的容量格式如1K,234M,2G···
-s 仅显示占用量总和

mdadm(管理系统软件RAID硬盘阵列)

格式:mdadm [模式] <RAID设备名称> [选项] [成员设备名称]

mdadm管理RAID阵列的动作:

名称 作用
Assemble 将设备加入到以前定义的阵列
Build 创建一个没有超级块的阵列
Create 创建一个新的阵列,每个设备具有超级块
Manage 管理阵列(如添加和删除)
Misc 允许单独对阵列的某个设备进行操作(如停止阵列)
Follow or Monitor 监控状态
Grow 改变阵列的容量或设备数目

mdadm管理RAID阵列的参数:

参数 作用
-a 检测设备名称
-n 指定设备数量
-l 指定raid级别
-C 创建
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-a 添加设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止阵列

ln(用于创建链接文件)

格式:ln [选项] 目标

创建硬链接:”ln 文件名 连接名”

创建软链接:”ln -s 文件名 连接名”

参数 作用
-s 创建”符号链接”(默认是硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程

iptables(用于管理防火墙的规则策略)

格式:iptables[-t 表名] 选项 [链名] [条件] [-j 控制类型]

参数 作用
-P 设置默认策略:iptables -P INPUT (DROP\
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号”!”表示除这个IP外
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,lcmp
-dport num 匹配目标端口号
-sport num 匹配来源端口号

常用命令

man (查看命令的帮助信息)

格式:man [命令名]

man命令中常用按键及用途

按键 用途
空格键 向下翻一页
page down 向下翻一页
page up 向上翻一页
home 返回首页
end 返回尾页
/ 从上至下搜索某个关键词,如”/linux”
? 从下至上搜索某个关键词,如”?linux”
n 定位到下一个搜索到的关键词
N 定位到上一个搜索到的关键词
q 退出帮助文档

man命令的帮助信息的目录结构以及意义

结构名称 代表意义
NAME 命令的名称
SYNOPSIS 参数的大致使用办法
DESCRIPTION 介绍说明
EXAMPLES 演示(附带简单说明)
OVERVIEW 概述
DEFAULTS 默认的功能
OPTIONS 具体的可用选项(带介绍)
ENVIRONMENT 环境变量
FILES 用到的文件
SEE ALSO 相关的资料
HISTORY 维护历史与联系方式

PS (用于查看系统中的进程状态)

参数 作用
-a 显示所有进程(包括其它用户的进程)
-u 用户以及其它详细信息
-x 显示没有控制终端的进程

linux中5种常见的状态

R(运行):进程正在运行队列中等待

S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离状态

D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其终端

Z(僵死):进程已经终止,但进程描述符依然存在,直到父进程调用wait4()系统函数后将进程释放

T(体质):进程收到停止信号后停止运行

进程状态

参数 注释
USER 进程的所有者
PID 进程ID号
%CPU CPU占用率
%MEN 内存占用率
VSZ 虚拟内存使用量(单位KB)
RSS 占用的固定内存量(单位KB)
TTY 所在终端
STAT 进程状态
START 被启动的时间
TIME 实际使用CPU的时间
COMMAND 命令名称与参数

top (动态的监视进程活动与系统负载等信息)

top命令前五航为系统整体的统计信息

第一行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值、数值越小意味着负载越低)

第二行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数

第三行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等(均为CPU数据并以百分比格式显示)

第四行:物理内存总量,内存使用量,内存空闲两、作为内核缓存的内存量

第五行:虚拟内存总量,虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量

pidof (用于查询某个指定服务进程的PID值)

格式:pidof [参数] [服务名称]

kill (用于终止某个指定PID的服务进程)

格式:kill [参数] [进程PID]

killall (用于终止某个指定名称的服务所对应的全部进程)

格式:killall [参数] [进程名称]

类似于windows下的结束进程树

wget (使用命令下载网络文件)

格式:wget 【参数】 下载地址

-b 后台下载模式
-O 下载到指定目录
-t 最大尝试次数
-c 断电续传
-p 下载页面内所有资源,包括图片,视频等
-r 递归下载

free (查看当前系统中内存的使用量情况)

格式:free 【-m/-g】

who (查看当前登入主机用户的情况)

格式:who [参数]

last (查看系统的登入情况)

格式:last [参数]

history (显示历史执行过的命令)

格式:history [-c]

默认会保存1000条执行过的文件,若要修改可以直接编辑/etc/profile文件的HISTSIZE值

pwd (用于显示当前的工作目录)

格式:pwd [选项]

-p 显示真实路径(即非快捷链接的地址)

cd (用于切换工作路径)

格式:cd [目录名称]

参数 作用
- 切换到上一次的目录,如”cd -“
~ 切换到”家目录”,如”cd ~”
~username 切换到其他用户的home目录,如”cd ~teak”
.. 切换到上级目录,如”cd ..”

ls (用于查看当前目录下有哪些文件)

参数 作用
-a 查看全部文件(包括隐藏文件)
=d 仅查看目录本身
-h 易读的文件容量(如k,m,g )
-l 显示文件的详细信息

cat (用于查看纯文本文件(较短的))

格式:cat [选项] [文件]

参数 作用
-n 显示行号
-b 显示行号(不包括空行)
-A 显示”不可见”的符号,如tab,空格键等等

more (用于查看纯文本文件(较长的))

格式:more [选项] 文件

参数 格式
-数字 预先显示的行数(默认为一页)
-d 显示提示语句与报错信息

head (用于查看纯文本文档的前N行)

格式:head [选项] [文件]

参数 作用
-n 10 显示10行
-n -10 正常输出(如cat命令),但不显示最后的10行

tail (用于查看纯文本文档的后N行)

格式:tail [选项] [文件]

参数 作用
-n 10 显示后面的10行
-f 持续刷新显示的内容

od (查看特殊格式的文件)

格式:od [选项] [文件]

参数 作用
-t a 默认字符
-t c ASCII字符
-t o 八进制
-t d 十进制
-t x 十六进制
-t f 浮点数

tr (转换文本文件中得字符)

格式:tr [原始字符] [目标字符]

例:cat tr.txt [a-z] [A-Z]

wc (用于统计指定文本的行数、字数、字节数)

格式:wc [参数] 文本

参数 作用
-l 只显示行数
-w 只显示单词数
-c 只显示字节数

例:统计当前系统中的用户个数

wc -l /etc/passwd

cut (用于通过列来提取文本字符)

格式:cut [参数] 文本

参数 作用
-d 分隔符 指定分隔符,默认为tab
-f 指定显示的列数
-c 单位改为字符

例:

获取当前系统中所有用户的命长:

参数作用:-d以”:”来作为分隔符,-f参数代表只看第一列的内容

cut -d: -f1 /etc/passwd

获取root用户的默认SHELL解释器:

grep ^root /etc/passwd | cut -d: -f7

diff (用于比较多个文本文件的差异)

格式:diff [参数] 文件

参数 作用
-b 忽略空格引起的差异
-B 或略空行引起的差异
-brief或-q 仅报告是否存在差异
-c 使用上下文输出格式

touch (用于创建空白文件与修改文件时间)

格式:touch [选项] [文件]

参数 作用
-a 近修改’访问时间’(atime)
-m 近修改’更改时间’(mtime)
-d 同事修改atime和mtime
-t 要修改成的时间[YYMMDDhhmm]

mkdir (创建空白的文件夹)

格式:mkdir [选项] 目录

参数 作用
-m=MODE 默认的文件目录
-p 连续创建多层目录(若文件夹已存在泽忽略)
-v 显示创建的过程

cp (用于复制文件或目录)

格式:cp [选项] 源文件 目标文件

复制命令的三种情况:

    目标文件是一个目录,会将源文件复制到该目录中。

    目标文件是一个文件,会将源文件覆盖该文件。

    目标文件不存在,将会复制源文件并修改为目标文件的名称(重命名)。

参数 作用
-p 保留原始文件的属性
-d 若对象为’链接文件’,则保留该’链接文件’的属性
-r 递归持续复制(用于目录)
-i 若目标文件存在则询问是否覆盖
-a 相当于-pdr(p,d,r为上述的参数)

mv (mv命令用于移动文件或改名)

格式:mv [选项] 文件名 [目标路径|目标文件名]

rm (用于删除文件或目录)

格式:rm [选项] 文件

参数 作用
-f 忽略警告信息
-i 删除前先询问
-f 删除文件夹

dd (用于指定大小的拷贝的文件或指定转换文件)

格式:dd [参数]

参数 作用
if 输入的文件名称
of 输出的文件名称
bs 设置每个”块”的大小
count 设置要拷贝“块”的个数
conv=ucase 将字母从小写转换为大写
conv=lcase 把字母从大写转换为小写

将光驱设备拷贝成镜像文件:

dd if=dev/cdrom of=RHEL-SERVER-7.0-X86-LinuxProbe.Com.iso

生成一个560m的空白文件:

dd if=/dev/zero of=560_file count=1 bs=560M

将硬盘的MBR信息拷贝出来:

dd if=/dev/sda of=sda_image count-1 bs=512K

useradd (用于创建新的用户)

useradd [选项] 用户名

参数 作用
-d 指定用户的家目录(默认为/home/username)
-D 展示默认值
-e 账号有效截至日期,格式:YYYY-MM-DD
-g 指定一个初始用户组(必须已存在)
-G 指定一个或多个拓展用户组
-N 指定默认的shell
-s 指定默认的Shell
-u 指定用户的UID

创建名为linuxprobe的用户,并定义家目录路径,UID以及登录解释器(不允许登录):

useradd -d /gome/linux -u 8888 -s /sbin/nologin linuxprobe

passwd (用于修改用户的密码)

格式:passwd [选项] [用户名]

参数 作用
-l 锁定用户进制其登陆
-u 解除锁定,允许用户登陆
–stdin 允许从标准输入修改用户密码,如(echo “NewPassWord” \
-d 使账号无密码
-e 强制用户下次登陆时修改密码
-S 显示用户的密码状态

userdel (用于删除用户所有表格)

格式:userdel [选项] 用户名

参数 作用
-f 强制删除用户,家目录与相关条件
-r 同时删除用户,家目录与其相关条件

usermod (用于修改用户的属性)

格式:usermod [选项] 用户名

参数 作用
-c 填写账号的备注信息
-d -m -d与-m连用,可重新指定用户的家目录并自动旧的数据转移过去
-e 账户到期时间,格式“YYYY-MM-DD”“
-g 变更所属用户组
-G 变更拓展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的UID

groupadd (用于创建群组)

格式:groupadd [选项] 群组名

tar (用于对文件打包压缩或解压)

格式为:tar [选项] [文件]

参数 作用
-c 创建压缩文件
-x 解开压缩文件
-t 查看压缩包内有哪些文件
-z 用Gzip压缩或解压
-j 用bzip2压缩或解压
-v 显示压缩或解压的过程
-f 目标文件名
-p 保留原始的权限与属性
-P 使用绝对路径来压缩
-C 指定解压到的目录

grep (用于对文本进行搜索)

格式:[选项] [文件]

搜索某个关键词:grep (关键词) (文本文件)

参数 作用
-b 将可执行文件(binary)当做文本文件(text)来搜索
-c 仅显示找到的次数
-i 忽略大小写
-n 显示行号
-v 反向选择——仅列出没有“关键词”的行

find (用于查找文件)

格式:find [查找路径] (寻找条件) (操作)

参数 作用
-name 匹配名称
-perm 匹配权限,(mode为完全匹配,-mode为包含即可)
-user 匹配所有者
-group 匹配所有组
-mtime -n +n 匹配修改内容的时间(-n指n天以内,+n指n天以前)
-atime -n +n 匹配访问文件的时间(-n指n天以内,+n指n天以前)
-ctime -n+n 匹配修改权限的时间(-n指n天以内,+n指n天以前)
-nouser 匹配无所有者的文件
-nogroup 匹配无所有组的文件
-newerf1 !f2 匹配比文件f1新却比f2旧的文件
-type v/d/c/p/l/f 匹配文件类型(块设备、目录、字符设备、管道、链接文件、文件文件)
-size 匹配文件的大小(+50k查找超过50k的文件,而-50k则代表查找小鱼50k的文件)
-prune 忽略某个目录
-exec {} ; 后面可接对搜索到结果进一步处理的命令(下面会有演示)

例子:

1、搜索在/etc/自己拍卖行所有以host开头的文件

find /etc/ -name “host*” -print

2、

搜索整个系统中所有包含SUID的文件(因SUID的数字表示法是4,而减号表示只要包含)

find / -perm -4000 -print

3、

找出用户linuxprobe的文件并复制到/root/findresults目录

(重点是 “-exec {} :” 其中的{}代表find命令搜索出的文件,记住结尾必须是:)

find / -user linuxprobe -execcp -arf {} /root/findresults/ :

alias (用于设置命令的别名)

格式: alias 别名=命令

例如担心复制文件时误将文件覆盖,那么执行alias cp=”cp -i”

unalias (取消命令的别名)

格式:unalias 别名

env (查看环境变量)

格式:env(直接输入env回车)

export (将局部变量提升为全局变量)

格式:export 变量名

read(将用户的输入参数赋值给制定变量)

格式:” read -p [提示语句] 变量名”

chattr(用于设置文件的隐藏权限)

格式:chattr [参数] 文件

chattr +a linuxprobe

参数 作用
i 将无法对文件进行修改,若对目录设置后则仅能够修改子文件而不能新建或删除
a 仅允许补充(追加)内容无法覆盖/删除(append only)
S 文件内容变更后同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A 不再修改这个文件的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 当使用dump命令备份时忽略本文件/目录
c 默认将文件或进行压缩
u 当删除此文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
X 可以直接访问压缩文件的内容

lsattr(用于显示文件的隐藏权限)

格式:lsattr [参数] 文件

参数 作用
a 显示所有文件和目录
l 显示隐藏属性的全称(默认简写成一个字母)
R 地柜处理,将制定目录下的所有文件及子目录一并处理
d 若目标文件为目录,请加此参数

su(用于变更使用者的身份,切换登陆者)

格式:su [-] 用户名

root用户切换其他用户无需输入密码

普通用户切换用户需要输入密码

如果要将环境变量改变为新用户的,请加参数’-‘

sudo(用于给普通用户提供额外权利来完成原本超级用户才能完成的任务)

格式:sudo [参数] 命令名称

总结来说sudo的特色功能有:

1、限制用户执行指定的命令

2、记录用户执行的每一条命令

3、配置文件(/etc/sudoers)根据集中的管理用户、权限与主机等参数

4、验证过密码后5分钟(默认值)内无须再让用户验证密码,更加额度方便

sudo命令的常用参数包括有:

参数 作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或UID值 以指定的用户身份执行命令
-k 清空安全时间,下次执行sudo时需要再次密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语

setfacl(用于增加或者修改ACL规则)

格式:setfacl [参数] 文件

参数 作用
-R 递归(对目录使用)
-m 设置文件的acl规则
-b 删除acl规则

getfacl(用于显示文件的ACL规则)

格式:getfacl 文件

mount(用于挂载文件系统)

格式:mount 文件系统 挂载目录

参数 作用
-a 挂载所有在/etc/fstab中定义的文件系统
-t 指定文件系统的类型

umount(撤销已挂载的设备文件)

格式:umount [挂载点/设备文件]

fdisk(用于管理磁盘分区)

格式:fdsik [磁盘名称]

参数 作用
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区的类型
p 查看分区表信息
w 保存并退出
q 不保存直接退出

mkfs(用于格式化分区)

格式:mkfs.[分区格式] [硬盘分区名]

例:mkfs.xfs /dev/sdb1

df(查看挂载点信息与磁盘使用量)

格式:df [选项] [文件]

查看挂载信息与硬盘使用量:df -h

参数 作用
-a 显示所有的文件系统(包括虚拟的)
-total 展出出总体使用量
-h 更易读的容量格式如1K,234M,2G···
-i 展示出inode的信息(默认是磁盘使用信息)
-T 显示出文件系统的类型

du(查看磁盘的使用量)

格式:du [选项] [文件]

查看更目录中个文件夹所占空间:dh sh /

查看档案目录下个文件夹所占看就看“du -sh *

参数 作用
-a 评估每个文件而非目录整体占用量
-c 评估每个文件并计算出总占用量总和
-h 更易读的容量格式如1K,234M,2G···
-s 仅显示占用量总和

mdadm(管理系统软件RAID硬盘阵列)

格式:mdadm [模式] <RAID设备名称> [选项] [成员设备名称]

mdadm管理RAID阵列的动作:

名称 作用
Assemble 将设备加入到以前定义的阵列
Build 创建一个没有超级块的阵列
Create 创建一个新的阵列,每个设备具有超级块
Manage 管理阵列(如添加和删除)
Misc 允许单独对阵列的某个设备进行操作(如停止阵列)
Follow or Monitor 监控状态
Grow 改变阵列的容量或设备数目

mdadm管理RAID阵列的参数:

参数 作用
-a 检测设备名称
-n 指定设备数量
-l 指定raid级别
-C 创建
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-a 添加设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止阵列

ln(用于创建链接文件)

格式:ln [选项] 目标

创建硬链接:”ln 文件名 连接名”

创建软链接:”ln -s 文件名 连接名”

参数 作用
-s 创建”符号链接”(默认是硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程

iptables(用于管理防火墙的规则策略)

格式:iptables[-t 表名] 选项 [链名] [条件] [-j 控制类型]

参数 作用
-P 设置默认策略:iptables -P INPUT (DROP\
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号”!”表示除这个IP外
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,lcmp
-dport num 匹配目标端口号
-sport num 匹配来源端口号

管道符、重定向与环境变量

管道命令符”|”

管道命令符“|”的作用是将前一个命令的标准输出当做后一个命令的标准输入,格式为”命令A|命令B“。

例如前面学习的grep命令匹配关键词(/sbin/login)找出所有被限制登录系统的用户,如果我们希望统计所有不允许登录系统的用户个数,该怎么做呢:

首先理清思路:

找出被限制登录用户的命令:grep “/sbin/nologin” /etc/passwd

统计文本行数的命令则是:wc -l

现在要做的事就是将搜索命令的输出值传递给统计命令,其实只要把管道符夹在中间就可以了。

因此结果即为:grep “/sbin.nologin/” /etc/passwd | wc -l

以下为部分管道符使用例子:

1、用翻页的形式查看/etc目录中又哪些文件

ls -l /etc | more

2、向linuxprobe用户发送一封邮件

echo “content” | mail -s “Subject” linuxprobe

3、使用非交互式设置用户密码,将root的密码修改为linuxprobe

echo “linuxprobe” | passwd -stdin root

输入输出重定向

先做一个简单的演示

查看linuxprobe目录的信息:

ls linuxprobe/

(……文件信息)

ls xxxxx/

ls: cannot access xxxxx:no such file or directory

[前者执行后返回的是标准输出,后者执行失败返回的是错误输出]

标准输入(STDIN,文件描述符为0:默认从键盘输入,为0时表示是从其它文件或命令的输出
标准输出(STDOUT,文件描述符为1):默认输出到屏幕,为1时表示是文件
错误输出(STDERR,文件描述符为2):默认输出到屏幕,为2时表示是文件

对于输出重定向符有这些情况:

符号 作用
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误标准输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>$1 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

对于输入重定向有这些情况:

符号 作用
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符 从标准输入中读入,知道遇见“分界符”才停止
命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2

那么来做几个输出和输入重定向的实验:

1、将man命令的帮助文档写入到/root/man.txt中:

man bash > /root/man.txt

2、向readme.txt追加一行文字

echo ”test” >> readme.txt

3、将readme.txt文件作为输入重定向给 wc -l 命令来计算行数

wl -l < readme.txt

命令行通配符

通配符 含义
* 匹配零个或多个字符
匹配任意单个字符
[0-9] 匹配范围内的数字
[abc] 匹配已出额度任意字符

bash解释器还支持很多的特殊字符拓展:

字符 作用
\ (反斜杠) 转义后面单个字符,例如$是变量定一个符号会报错,可以通过\来进行转义
‘’(单引号) 转义所有的字符
“”(双引号) 变量依然生效
“(反引号) 执行命令语句

1、定义一个变量

Price=5

2、输出Price is 5

echo “Price is $Price”

3、但如果想要输出Price is 5,就会因为是变量定义而报错,这时候可以使用转义字符\

echo “Price is $$Price”

4、使用单引号,变量将不再被取代

echo ‘Price is $$Price’

Price is $$Price

5、执行uname -a 后可以查看到本机内核的版本与架构 (反引号里面的命令会被执行):

echo ’uname -a’

PATH变量

在linux中一切都是文件,命令文件也不例外,在用户执行一条’ls’命令后发生了什么:

1、如果是以绝对/相对路径输入的命令则直接执行(如执行/bin/ls)

2、检查是否为alias别名命令

3、有bash判断其是’内部命令’还是’外部命令’

内部命令:属于解释器内部的

外部命令:独立于解释器外的命令文件

4、通过$PATH变量中定义的路径进行命令查找

查看PATH变量的方法:echo PATH

使用 ‘type 命令名字’来得知是内部命令还是外部命令

在$PATH中目录之间用 : 间隔开了

为变量增加新的值:PATH=$PATH:[路径]

环境变量

变量名称 作用
HOME 用户的主目录”家”
SHELL 当前的shell是哪个程序
HISTSIZE 历史命令记录条数
MAIL 右键信箱文件
LANG 语系数据
RANDOM 随机数字
PS1 bash提示符
HISTFILESIZE history命令存储数量
PATH 在路径中得目录查找执行文件
EDITOR 默认文本编辑器
HOME 用户主目录

创建变量:[变量名]=[提供的值]

用户创建的变量只是局部变量,若要别的用户也能使用可以通过export提升至全局变量

了解vim编辑器

命令 作用
dd 删除(剪切)光标所在的整行
5dd 删除(剪切)从光标处开始的5行
yy 复制光标所在整行
5yy 复制从光标处开始的5行
p 将之前删除(dd)或符直(yy)过的数据贴到光标后
/字符串 在文本中从上至下搜索该字符串
?字符串 在文本中从下至上搜索该字符串
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步的操作

vim编辑器的末行模式中的常用命令:

命令 作用
:w 保存
:q 推出
:q! 强制退出(放弃对文本的修改内容)
:wq! 强制保存退出
:set nu 显示行号
:命令 执行该命令
:整数 跳转到该行

配置网卡信息

网卡配置文件的前缀为 “eth”,第一块为eth0,第二块为eht1,以此类推……

在RHEL7系统中网卡配置文件的前缀则为ifcfg-eno

网卡的配置文件存放在 /etc/sysconfig/network-scripts目录中

网卡配置文件关键词术语:

网卡类型:TYPE=Ethernet

地址分配模式:BOOTPROTO=static

网卡名称:NAME=eno…..
是否启动:onboot=yes

IP地址:IPADDR=X.X.X.X

子网掩码:NETMASK=X.X.X.X

网卡地址:GATEWAY=192.168.10.1

DNS地址:DNS1=192.168.10.1

配置网卡信息简单思路:

1、切换到 /etc/sysconfig/network-scripts 目录中

2、使用vim命令修改网卡配置文件 ifcfg-eno…

3、逐项写入配置参数,并保存退出

4、重新启动网卡命令 systemctl restart network

5、通过ping命令测试网卡信息是否生效

配置yum仓库

配置光盘yum源挂载:

1、切换到 /etc/yum.repos.d 目录(该目录存放yum仓库配置文件)

2、使用vim编辑器创建并打开一个名为 xxx.repo的新文件,名称自定义,后缀为repo

3、逐项写入配置参数,并保存退出

4、按配置参数的路径将光盘挂在

5、架构光盘挂载信息写入到/etc/fstab文件中

6、使用yum install https -y 命令检查是否配置正确

简单的repo文件配置:

1
2
3
4
5
[test]
name=test
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0

创建光盘的挂载目录:

mkdir -p /media/cdrom

挂载光盘:

mount /dev/cdrom /media/cdrom

设置开机自动挂载:

vim /etc/fstab

/dev/cdrom /media/cdrom iso9660 defaults 0 0

了解shell脚本

查看系统中所有可用的shell解释器:

cat /etc/shells

查看当前的shell解释器:

echo $SHELL

编译简单的脚本

shell脚本的编写要使用到vim文本编辑器,按照命令的执行顺序一次编写,每行写一条linux命令。并且一个完整的shell脚本则应该包括”脚本声明”、”注释信息”和”可执行语句”。

脚本声明(#!):告知系统用何种shell来解释

注释信息(#):对可执行语句或程序功能做介绍,可以不写

可执行语句:执行的具体命令

一个简单的shell脚本示例:

vim example.sh

1
2
3
4
#!/bin/bash
#显示当前的工作路径并列出当前目录下的所有文件与属性
pwd
ls -al

执行脚本有三种方法:

1、脚本文件路径:/example.sh

2、sh脚本文件路径:sh example.sh

3、source脚本文件路径:source example.sh

(只要脚本文件路径没有写错,sh或source命令都可以直接执行改脚本,但一般来说可能会出现权限不足的错误,所以需要使用chmod来赋予权限)

chmod u+x example.sh

接收用户的参数

shell脚本能够让用户更灵活的完成工作需求,应该有办法接受用户输入的参数,像上面的脚本的写法真的很不灵活

在可执行文件中已经内设:命令名 参数1 参数2 参数3

$0 当前执行的shell脚本的程序名
$1-9,{10},{11}… 参数的位置变量
$# 一共有多少个变量
$** 所有位置变量的值
$? 判断上一条命令是否执行成功,0为成功,非0为失败

一个可以接收用户参数的shell脚本:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$!,第五个为$5"


[root@zhou tmp]# sh example.sh 1 2 3 4 5
当前脚本名称为example.sh
总共有5个参数,分别是1 2 3 4 5
第一个参数为,第五个为5

判断用户的参数

shell脚本有时还要判断用户输入的参数,例如像mkdir命令一眼,当目录不存在则创建,若已存在则报错,条件测试语句能够测试特定的表达式是否成立,当条件成立时返回值0,否则返回其他数值

测试语句格式:[ 条件表达式 ] (需要注意的是两边均应有一个空格)

细分测试语句有:文件测试、逻辑测试、整数值比较、字符串比较

文件测试:[ 操作符 文件或目录名 ]

操作符 作用
-d 测试是否为目录
-e 测试文件或目录是否存在
-f 判断是否为文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
1
2
3
4
5
6
7
8
[root@zhou tmp]# [ -d /etc/fstab ]
[root@zhou tmp]# echo $?
1


[root@zhou tmp]# [ -f /etc/fstab ]
[root@zhou tmp]# echo $?
0

符号&&代表逻辑上的”与”,当前面的命令执行成功后才会执行后面的命令

判断/dev/stdin是否存在,若存在则输出exist

[root@zhou ~]# [ -e /dev/stdin ] && echo “exist”
exist

逻辑测试:[ 表达式1 ] 操作符 [ 表达式2 ]

操作符 作用
&& 逻辑的与,”而且”的意思
\
! 逻辑的否
1
2
3
4
5
6
7
8
9
USER变量是当前登录的用户名
[root@zhou ~]# echo $USER
root

若当前登录的用户不是root,输出user,是root则为空
[root@zhou ~]# [ $USER! = root ] && echo "user"

非root输出user,root输出root
[root@zhou ~]# [ $USER! = root ] && echo "user" || echo "root"

整数值比较:[ 整数1 操作符 整数2 ]

操作符 作用
-eq 判断是否等于
-ne 判断是否不等于
-gt 判断是否大于
-lt 判断是否小于
-le 哦安短是否等于或小于
-ge 判断是否大于或等于
1
2
3
4
5
6
7
8
9
10
比较10是否大于10
[root@zhou ~]# [ 10 -gt 10 ]
[root@zhou ~]# echo $?
1
#显示上一条命令执行失败,10不大于10

比较10是否等于10
[root@zhou ~]# [ 10 -eq 10 ]
[root@zhou ~]# echo $?
0
1
2
3
4
5
获取当前可用的内存量,并将此值赋值给变量freemem
首先用free-m查看以m为单位的内存使用情况
然后grep cache过滤出剩余内存的行
最后用awk '{print $3}'过滤只保留第三列
而freemen='语句'则表示执行里面的雨具后赋值给变量

字符串比较:[字符串 1 操作符 字符串2]

操作符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
1
2
3
4
#判断string变量是否为空
[root@zhou tmp]# [ -z $string ]
[root@zhou tmp]# echo $?
0

条件测试语句

if条件语句

if条件语句分为 单分支结构、双分支结构、多分支结构

单分支结构:仅用if、then、fi关键词组成,只在条件成立后执行

1
2
3
4
5
6
7
8
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi

#判断目录是否存在,若不存在则自动创建

双分支结构:由if、then、else、fi关键词组成,做条件成立或条件不成立的判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 is up"
else
echo "host $1 is down"
fi

#判断主机能否ping通,根据返回结果分别给予提示或警告
ping -c 代表发送的数据包额度个数
ping -i 代表每0.2秒发送一个数据包
ping -W 代表3秒即超时
$1为用户输入额度第一个参数
$?为上一条命令的执行结果,判断是否等于0(0为成功)

多分支结构:是有if、then、else、elif、fi关键词组成,根据多种条件成立的可能性执行不同的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
read -p "Enter your score (0-100): " GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ];then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ];then
echo "$GRADE is PASS"
else echo "$GRADE is Fail"
fi

#判断用户呼入的分数在哪个区间内,然后判定为优秀、合格或不合格
使用read命令让用户为GRADE变量赋值
大于85小于100输出excellent
大于70小于84输出pass
其余情况输出fail

for条件语句

for条件语句会先读取多个不同的变量值,然后逐一执行同一组命令

1
2
3
4
5
6
7
8
创建用户名文件
[root@zhou tmp]# vim test.txt
andy
barry
carl
duke
eric
george
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
read -p "Enter the password: " PASSWD
for UNAME in `cat test.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Create success"
else
echo "Create failure"
fi
fi
done

shell脚本提示用户输入要设置的密码并赋值给PASSWD变量
从test.txt文件中读入用户名并赋值给UNAME变量
而查看用户的信息都重定向到/dev/null文件,不显示屏幕

2、测试主机是否在线

1
2
3
4
5
首先创建主机地址列表:
[root@zhou tmp]# vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
HLIST=$(cat /tmp/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is up."
se
echo "Host $IP is down."
fi
done

从ipadds.txt中读取主机地址后赋值给HLIST变量
逐个ping列表中的主机IP地址测试主机是否在线

while条件语句

while条件语句用于测试重复测试某个条件,当小件成立时则继续重复执行

随机生成0-999的数字,猜数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "randow 0-999"
while true
do
read -p "input numbers: " INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "It's $PRICE"
echo "猜了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "so high"
else
echo "so low"
fi
done

let可以使变量进行运算,无需加$

case条件语句

case条件语句可以依据变量的不同数值,分别执行不同的命令动作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
read -p "输入一个字符: " KEY
case "$KEY" in
[a-z]|[A-Z])
echo "输入的是字母。"
;;
[0-9])
echo "输入的是数字。"
;;
*)
echo "输入的是其他。"
esac

提示用户输入一个字符,判断该字符是字母、数字或特殊字符
;;相当于break的效果,退出

用户身份与文件权限

用户身份与能力

UID值

(User IDentification的缩写)每个用户都有对应的UID值,就像身份证号码

超级用户UID:root用户默认为0

系统用户UID1-999:系统中系统服务由不同用户运行,更加安全,默认被限制登录系统

普通用户UID1000-:即管理员创建的用于日常工作而不能管理系统的普通用户

(注意UID一定是不能冲突的,管理员创建的普通用户UID从1000开始,即便前面有闲置的号码)

账户名称与UID保存在/etc/passwd文件中,而账户密码则保存在/etc/shadow文件中

GID

(Group IDentification的缩写):可将多个用户加入某个组,方便指派任务或工作

每个用户在被创建时均会创建一个默认组(其GID与UID相同,俗称基本组)而后加入的则叫拓展组,一定要分清楚。

用户组名称与GID保存在/etc/group文件中

文件权限与归属

linux中一切都是文件,文件和目录的所属与权限——来分别规定所有者、所有者、其余人的读、写、执行权限

读(read)、写(write)、执行(excute),简写(r,w,x),也可用数字(4,2,1)表示


第一位代表文件类型:

- 普通文件
d 目录文件
l 链接文件
b 块设备文件
c 字符设备文件
p 管道文件

普通文件即实际保存数据的地方,其并不具备删除自身的权限:

    r:可读取文件的实际内容

    w:可编辑/新增/修改该文件的实际内容

    x:可被执行

目录文件即保存有目录结构和文件权限:

    r:可读取目录结构和权限

    w:可更爱目录结构列表,新建/删除/重命名/、转移子文件/目录

    x:表示用户可进入到该目录中

文件的特殊权限

单纯对文件位置的rwx权限肯定不能满足我们对于安全、便捷工作的需求,所有便有了SUID和SGID的特殊权限机制

SUID

让执行者临时拥有主的权限(仅对有执行权限的二进制程序有效)

比如所有用户都可以执行用于修改用户密码的passwd命令,单用户密码保存在/etc/shadown文件中,默认权限是000即除了root外所有用户都没有查看或编辑该文件的权限,所以对passwd命令加上SUID权限位,则可让普通用户临时获得程序所有者的身份,即以root用户的身份将变更的密码信息写入到shadow文件中。

SGID

功能一:让执行者临时拥有属组的权限(对拥有执行权限的二进制程序设置)


文件的隐藏属性

文件权限除了读写执行与SUID、SGID、SBIT外还有一种隐藏权限,例如明明有权限删除某个文件却报错了,或者仅能为某个文件追加内容而不能减少内容,遇到这种很”奇怪”的文件,就要怀疑是文件被设置隐藏权限了

主要命令:

chattr

lsattr

文件访问控制列表

rwx权限、特殊权限、隐藏权限都是对某一类用户设置的,如果对某个制定的用户进行单独的权限设置,那么就需要用文件的访问控制列表来实现啦。

我们可以基于普通文件或目录设置进行设置ACL,通俗来说ACL就是设置指定的特定用户或用户组队某个文件的操作权限。并且如果对某个目录设置了访问控制策略,那么子文件则继承其访问策略,而若对文件设置了访问控制策略则不再继承上级目录的控制策略。

有点类似于Windows系统的安全策略

主要命令:

setfacl

getfacl

存储结构与磁盘划分

目录结构

主要常见的目录定义:

目录名称 应放置文件的内容
/boot 开机所需文件——内核,开机菜单及所需配置文件等
/dev 任何设备与接口都以文件形式存放在此目录
/etc 配置文件
/home 用户主目录
/bin 单用户维护模式下还能够被操作的命令
/lib 开机时用到的函数库及/bin与/sbin下面命令要调用的函数
/sbin 开机过程中需要的
/media 一般挂载或删除的设备
/opt 放置第三方的软件
/root 系统管理员的主文件夹
/srv 一些网络服务的数据目录
/tmp 任何人均可使用的”共享”临时目录
/proc 虚拟文件系统,例如系统内核,进程,外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin 非系统开机时需要的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变换的文件,如日志
/lost+found 当文件系统发生错误事,将一些丢失的文件片段存放在这里

绝对路径(absolute):由根目录(/)开始写起的目录或文件名

相对路径(relative):相对于当前路径的写法

物理设备的命名规则

一般采用三个主分区加一个拓展分区的分发,拓展分区中能够创建无数个逻辑分区

主分区不能超过四个

系统内核的设备管理器(Udev)会自动将硬件名称规范起来,让我们可以通过设备名称猜出设备大致的属性以及分区信息等,Udev会一直以守护进程的形式运行并侦听来自内核发出的uevent来管理/dev目录下的设备文件

常见的硬件命名如下:

硬件设备 文件名称
IDE设备 /dev/hd[a-d]
SCSI/SATA/U盘 /dev/sd[a-p]
软驱 /dev/df[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0或者/dev/hr0(IDE设备)

文件系统与数据资料

每个文件的权限与属性都会记录在inode table中(每个文件都会占用一个独立的 inode 表格,默认为128bytes),记录着:

    该文件的访问权限(read,write,execute)

    该文件的所属主与组(owner,group)

    该文件的大小(size)

    该文件的创建或状态修改时间(ctime)

    该文件的最后一次访问时间(atime)

    该文件的修改时间(mtime)

    文件的特殊权限(SUID,SGID,SBIT)

    该文件的真实数据地址(point)

挂载硬件设备

挂载操作指的是当用户需要使用硬盘设备或分区数据时,需要先将一个已存在的目录文件做关联,而哲哥动作就叫挂载

主要命令:mount、umount

mount是临时挂载,重启后失效,如果想让重启后依然生效,必须修改配置文件/etc/fstab

“/etc/fstab”包含着文件系统与挂载信息等内容,因为过于重要,所以只有root用户才可以编辑它

填写格式如下:“设备文件 挂载目录 格式类型 权限选项 自检 优先级”

设备文件:一般为设备的路径+名称,也可以写UUID值等

挂载目录:指定要挂载的目录,需挂载钱创建好

格式类型:即指定文件系统的格式,比如有ext3/ext4/xfs/iso9660/swap等

权限选项:默认为defaults(rw,suid,dev,exec,auto,nouser,async),可指定acl或quota等

自检:若为1开机后进行磁盘自检,0为不自检

优先级:若“自检”为1,则可对多块硬盘进行优先级设置

例:

定义设备/dev/sdb2开机自动挂载到/backu目录,文件格式ext4,默认权限且无需开机自检

/dev/sdb2 /backup ext4 defaults 0 0

添加硬盘设备

主要命令:fdisk、mkfs

swap(交换分区)

SWAP即交换分区是一种类似于Windows系统虚拟内存的功能,将一部分硬盘空间虚拟成内存来使用,从而解决内存容量不足的情况,因为SWAP毕竟是用硬盘资源来虚拟的,所以速度上比真实物理内存要慢很多,一般只有当真实的物理内存耗尽时才会调用SWAP

磁盘冗余阵列

RAID:即杜丽硬盘组,作用是防止硬盘物理损坏以及增加存储设备的吞吐量,RAID常见的组合有0、1、5、10

RAID0

RAID0需要至少两块硬盘,可以有效的提高硬盘的性能和吞吐量,但没有数据的冗余和错误修复能力

多块硬盘串联在一起,数据一次写入各个硬盘,性能极大提升,但任意一块硬盘故障整个系统数据都会受到破坏

RAID1

需要至少两块硬盘,就可以有效的提高数据资料的安全性和可修复性,但成本却提高了

实现原来是在数据写入硬盘时也会在另外一块闲置的硬盘上生成镜像文件,在不影响性能的情况下最大限度保证数据资料的可靠性,只要在一对镜像盘中还有一块硬盘可以使用,那么数据也不会丢失,具有很好的硬盘冗余能力,虽然对数据来讲绝对的安全,但成本明显增加,磁盘利用率仅为50%

RAID5

至少需要三块硬盘,加固存储性能、数据安全和存储成本

如上图所示”parity”块中保存的是其他硬盘数据的奇偶校验信息(并非其他硬盘的数据),以数据的奇偶校验信息来保证数据的安全,RAID5不以单独的硬盘来存放数据的奇偶校验信息,而是保存在各个磁盘上

这样当任何一个硬盘损坏都可以根据其他硬盘上的奇偶校验信息来尝试重建损坏的数据,性能也很高,兼顾了存储性能,数据安全和存储成本,尅看作是RAID0与RAID1的这种方案

RAID10

需要至少四块硬盘,兼具速度和安全性,但成本很高

继承了RAID10的快速与RAID1的安全,RAID1在这里提供了冗余备份的阵列,而RAID0则负责数据的读写阵列

因这种结构的成本高,一般用于存放要求速度与差错控制的数据

逻辑卷管理器

当用户根据实际情况需要对分区增加、减小等调整时,经常会受到硬盘”灵活性”的限制,很不方便

逻辑卷管理器则是在磁盘分区与文件系统之间添加的逻辑层,提供一个抽象的卷组,使得管理者可以忽略底层磁盘布局,从而实现对分区的灵活动态调整,这毫不夸张,系统默认启用了LVM机制(Logical Volume Manager)

物理卷(PV,Physical Volume):整个硬盘设备或使用fdisk命令建立的硬盘分区

卷组(VG,Volume Group):由一个或多个物理卷(PV(组成的整体

逻辑卷(LV,Logical Volume):从卷组(VG)出切割出的空间来用于创建文件系统,大小由PE的个数决定

基本单元(PE,Physical Extent)默认为4MB的基本块

虚拟文件系统

软硬链接

在linux系统中ln命令能够让用户创建出俩中不同类型的文件快捷方式

可以理解为一个”指向原始文件inode的指针”,系统部位它分配独立的inode与文件,所以实际上来讲硬链接文件与原始文件其实是同一个文件,只是名字不同、

于是每添加一个硬链接,该文件的inode连接数就会增加1,直到该文件的inode连接数归0才是彻底删除。

概括来说因为硬链接实际就是指向原文件inode的指针,即使原始文件背删除依然可以通过链接文件访问,但是不能够跨文件系统也不能链接目录文件。

软链接(symbolic link)

即”仅仅包含它索要链接文件的路径名”,因此能做该目录链接也可以跨越文件系统,但原始文件背删除后链接文件也将失败,如同windows中的”快捷方式”

ln命令创建链接文件,格式为:ln [选项] 目标

创建硬链接:”ln 文件名 链接名”

创建软链接:”ln -s 文件名 链接名”

iptables与firewalld防火墙

了解防火墙管理工具

防火墙虽有软件或硬件之分但主要功能还是依据策略对外部请求进行过滤,成为公网与内网之间的保护屏障,防火墙会监控每一个数据包并判断是否有相应的匹配策略规则,直到满足其中一条策略规则为止,而防火墙规则策略可以是基于来源地址,请求动作或协议来定制的,最终仅让合法的用户请求流入到内网中,其余的均被丢弃

在红帽RHEL7系统中firewalld服务取代了iptables服务,但依然可以使用iptables命令来管理内核的netfilter。

但其实iptables服务与firewalld服务都不是真正的防火墙,它们都只是用来定义防火墙规则功能额度”防火墙管理工具”,将定义好的规则交由内核中的netfilter即网络过滤器来读取,从而真正实现防火墙功能,所以其实在配置规则的思路上是完全一致的。

规则链与策略

在iptables命令中设置数据过滤或处理数据包的策略叫规则,将多个规则合成一个链

对应到iptables命令中常见额度控制类型有:

ACCEPT:允许通过

LOG:记录日志信息,然后传给下一条规则继续匹配

REJECT:拒绝通过,必要时会给出提示

DROP:直接丢弃,不给出任何回应

其中REJECT和DROP的操作都是将数据包拒绝,但REJECT会再回复一条”您的信息我已受到,但被扔掉了”

而规则链则依据处理数据包的位置不同而进行分类:

PREROUTING:在进行路由选择前处理数据包

INPUT:处理出站的数据包

OUTPUT:处理转发的数据包

FORWARD:处理转发的数据包

POSTROUTING:在进行路由选择后处理数据包

iptables中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则

raw表:确定是否对该数据包进行状态跟踪

mangle表:为数据包设置标记

nat表:修改数据包中的源、目标IP地址或端口

filter表:确定是否放行该数据包(过滤)

规则表的先后顺序:raw > mangle > nat > filter

规则链的先后顺序:

入站顺序:PREROUTING > INPUT

出站顺序:OUTPUT > POSTOUTING

转发顺序:PREROUTING > FORWARD > POSTROUTING

还有三点注意事项:

1、没有指定规则表则默认指filter表

2、不指定规则链则指表内所有的规则链

3、在规则链中匹配规则时会依次检查,匹配即停止(LOG规则例外),若没匹配项则按链的默认状态处理

基本的命令参数

iptables命令用于管理防火墙的规则策略

格式为:iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]

SNAT与DNAT

SNAT即源地址转换技术,能够让多个内网用户通过一个外网地址上网

DNAT即目的地址转换技术,能够让往外IP用户访问局域网内不同的服务器

firewalld防火墙

firewalld服务是红帽RHEL7系统中默认的防火墙管理工具,特点是拥有运行配置与永久配置选项且能够支持动态更新以及“zone”的区域功能概念。

区域概念及作用

防火墙的网络区域定义了网络连接的可信等级,我们可以根据不同场景来调用不同的firewalld区域

区域 默认规则策略
trusted 允许所有的数据包
home 拒绝流入的数据包,除非与输出流量数据包相关或者是ssh,mdns,ipp-client,samba-client与dhcpv6-client服务则允许
internal 等同于home区域
work 拒绝流入的数据包,除非与输出流量数据包相关或是ssh,ipp-client与dhcpv6-client服务则允许
public 拒绝流入的数据包,除非与输出流量数据包相关或是ssh,dhcpv6-client服务则允许
external 拒绝流入的数据包,除非与输出流量数据包相关或是ssh服务则允许
dmz 拒绝流入的数据包,除非与输出流量数据包相关或是ssh服务则允许
block 拒绝流入的数据包,除非与输出流量数据包相关
drop 拒绝流入的数据包,除非与输出流量数据包相关

默认区域是public

字符管理工具

参数 作用
–get-default-zone 查询默认的区域名称
–set-default-zone=<区域名称> 设置默认的区域,永久生效
–get-zone 显示可用的区域
–get-services 显示预先定义的服务
–get-active-zones 显示当前正在使用的区域与网卡名称
–add-source= 将来源于此IP或子网的流量导向指定的区域
–remove-source= 不再将此IP或子网的流量导向某个指定区域
–add-interface=<网卡名称> 将来自于该网卡的所有流量都导向某个指定区域
–change-interface=<网卡名称> 将来自于该网卡的所有流量都导向某个指定区域
–list-all 显示当前区域的网卡配置参数,资源,端口以及服务等信息
–list-all-zone 显示所有区域的网卡配置参数,资源,端口以及服务等信息
–add-service=<服务名> 设置默认区域允许该服务的流量
–add-port=<端口号/协议> 允许默认区域允许该端口的流量
–remove-service=<服务名> 设置默认区域不再允许该服务的流量
–remove-port=<端口号/协议> 允许默认区域不再允许该端口的数量
–reload 让”永久生效”的配置规则立即生效,覆盖当前的

firewalld服务有两份规则策略配置记录:

    Runtime:当前正在生效额度

    Permanent:永久生效的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1、查看当前的区域:
firewall-cmd --get-default-zone

2、查看eno16777728网卡的区域:
firewall-cm --get-zone-of-interface=eno16777728

3、在public中分别查询ssh与http服务是否被允许:
firewall-cmd --zone=public --query-service=shh
firewall-cmd --zone=public --query-service=http

4、设置默认规则为dmz:
firewall-cmd --set-default-zone=dmz

5、让“永久生效”的配置文件立即生效:
firewall-cmd --reload

6、启动/关闭应急状况模式,阻断所有网络连接:
应急状况模式启动后会禁止所有的网络连接,一切的请求也都会拒绝,当心,请慎用
firewall-cmd --panic-on
firewall-cmd --panic-off

7、允许https服务流量通过public区域,要求立即生效且永久生效:
方法1:分别设置当前生效与永久有效的规则记录
firewall-cmd --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=https
方法2、设置永久生效的记录后读取记录
firewall-cmd --permanent --zone=puvlic --add-service=https
firewall-cmd --reload

8、不再允许http服务流量通过public区域,要求立即生效且永久生效:
firewall-cmd --permannent --zone=public --remove-service=http
firewall-cmd --reload

9、允许8080和8081端口流量通过public区域,立即生效且永久生效:
firewall-cmd --permanent --zone=public --add-port=8080-8081/tcp
firewall-cmd --reload

10、查看模拟9中端口操作是否成功
firewall-cmd --zone-public --list-ports
firewall-cmd --permannent --zone=public --list-ports

11、将eno16777728网卡的区域修改为external,重启后生效:
firewall-cmd permannent --zone=external --change-interface=eno16777728
firewall-cmd --get-zone-of-interface=eno16777728

12、设置富规则,拒绝192.168.10.0/25网段的用户访问ssh服务
firewall-cmd --permannent --zone=public --add-rich-rule="rule
family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"

服务的访问控制列表

Tcp_wrappers(即Transmission Control Protocol Wrappers)是一款基于IP层的ACL访问控制列表流量监控程序,它能够根据来访主机地址与本机目标服务程序做允许或拒绝规则,控制列表修改后会立即生效,系统将会检查允许规则,如果匹配允许则直接放行流量,若拒绝规则中匹配则直接拒绝,都不匹配默认也会放行

允许名单:/etc/hosts.allow

拒绝名单:/etc/hosts.deny

指定客户端的规则如下:

客户端类型 示例 满足示例的客户端列表
单一主机 192.168.10.10 IP地址为192.168.10.10.的主机
指定网段 192.168.10. IP段为192.168.10.0/24的主机
指定网段 192.168.10.0/255.255.255.0 IP段为192.168.10.0/24的主机
指定DNS后缀 .linux.com 所有DNS后缀为.linux.com的主机
指定主机名称 test.linux.com 主机名称为test.llinux.com的主机
指定所有客户端 ALL 所有主机全部包括在
1
2
3
4
5
6
7
1、限制只有192.168.10.0/24网段的主机可以访问本机的httpd服务:
编辑允许规则:
vim /etc/hosts.allow
httpd:192.168.10.
拒绝其他所有的主机:
vim /etc/hosts.deny
httpd:*

使用ssh服务管理远程主机

    24年六月五日,天气小雨。

    日记大抵是这么开头的吧,历经了一天多的时间,终于也是重新部署完了blog,遥想起上一次搞这个已经是三年前了,恍惚间时间线又开始闪烁,三年前似乎还意气风发,三年后已在泥潭中挣扎。

    自三月思潮澎湃以来,近况已趋近良好,若非那“旧疾”频发,想来也是能趋于平淡,纵是如此,也尝试许多新鲜事物,尝试了骑车、品书、看电影,都令我所着迷,纵观多年来,未养成一个长久所坚持的爱好,还忘在当下勉励自己,能够成功摆脱牢笼。

    今日计划安排看一部哈利波特,看一段时间红楼梦,每日坚持,加油!