一、Vim 文本编辑器
在 Linux 系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数
1. Vim 编辑器模式
vim 编辑器模式 | 说明 |
---|---|
命令模式默认
|
控制光标移动,可对文本进行复制、粘贴、删除和查找等工作 |
编辑模式 | 正常的文本录入 |
末行模式 | 保存或退出文档,以及设置编辑环境 |
Vim 编辑器模式的切换方法
提示:
- 在每次运行 Vim 编辑器时,默认进入命令模式,此时需要先切换到输入模式后再进行文档编写工作,而每次在编写完文档后需要先返回命令模式,然后再进入末行模式,执行文档的保存或退出操作
- 在 Vim 中,无法直接从输入模式切换到末行模式
末行模式中可用的命令
- 末行模式主要用于保存或退出文件,以及设置 Vim 编辑器的工作环境,还可以让用户执行外部的 Linux 命令或跳转到所编写文档的特定行数
命令 | 作用 |
---|---|
:w |
保存 |
:q |
退出 |
:q! |
强制退出(放弃对文档的修改) |
:wq! |
强制保存退出 |
:set nu |
显示行号 |
:set nonu |
不显示行号 |
:命令 |
执行该命令 |
:整数 |
跳转到该行 |
:s/one/two |
将当前光标所在行的第一个 one 替换成 two |
:s/one/two/g |
将当前光标所在行的所有 one 替换成 two |
:%s/one/two/g |
将全文中的所有 one 替换成 two |
?字符串 |
在文本中从下至上搜索该字符串 |
/字符串 |
在文本中从上至下搜索该字符串 |
Vim 编辑器
a、 i、 o 三个键从命令模式切换到输入模式
- a 键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式
- o 键则是在光标的下面再创建一个空行,此时可敲击 a 键进入到编辑器的输入模式
2. Vim 中常用的命令
命令 | 作用 |
---|---|
dd |
删除(剪切)光标所在整行 |
5dd |
删除(剪切)从光标处开始的 5 行 |
yy |
复制光标所在整行 |
5yy |
复制从光标处开始的 5 行 |
n |
显示搜索命令定位到的下一个字符串 |
N |
显示搜索命令定位到的上一个字符串 |
u |
撤销上一步的操作 |
p |
将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 |
二、配置主机名称
为了便于在局域网中查找某台特定的主机,或者对主机进行区分,除了要有 IP 地址外,还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问
- 修改主机名称文件
vim /etc/hostname
- 查看主机名
hostname
三、配置网卡
网卡 IP 地址配置的是否正确是两台服务器是否可以相互通信的前提
在 Linux 系统中,一切都是文件,因此配置网络服务的工作其实就是在编辑网卡配置文件
提示:
- 在 RHEL 5、 RHEL 6 中,网卡配置文件的前缀为 eth,第 1 块网卡为eth0,第 2 块网卡为 eth1,以此类推
- 在 RHEL 7 中,网卡配置文件的前缀则以 ifcfg开始,加上网卡名称共同组成了网卡配置文件的名字,例如 ifcfg-eno16777736;好在除了文件名变化外也没有其他大的区别
cd /etc/sysconfig/network-scripts
ls
vim ifcfg-ens33
默认
提示:
- 配置为开机自启动,并且 IP地址、子网、网关等信息由人工指定
参数 说明 设备类型 TYPE=Ethernet 地址分配模式 BOOTPROTO=static 网卡名称 NAME=ens3 是否启动 ONBOOT=yes IP 地址 IPADDR=192.168.10.10 子网掩码 NETMASK=255.255.255.0 网关地址 GATEWAY=192.168.10.1 DNS 地址 DNS1=192.168.10.1
- 重启网卡设备
systemctl restart network
四、配置 Yum 软件仓库
Yum 软件仓库的作用是为了进一步简化 RPM 管理软件的难度以及自动分析所需软件包及其依赖关系的技术
- 进入yum配置文件夹
cd /etc/yum.repos.d/
ls
- 新建rhel7.repo
vim rhel7.repo
五、编写 Shell 脚本
工作方式 | 英文 | 说明 |
---|---|---|
交互式 | Interactive | 用户每输入一条命令就立即执行 |
批处理 | Batch | 由用户事先编写好一个完整的 Shell 脚本, Shell 会一次性执行脚本中诸多的命令 |
1. 编写简单的脚本
- 查看当前命令行终端解释器
echo $SHELL
- 查看当前所在工作路径并列出当前目录下所有的文件及属性信息
vim test.sh
#!/bin/bash
#For Example BY Ricsy
pwd
ls -al
提示:
- 第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本
- 第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息
- 第三、四行的可执行语句也就是我们平时执行的 Linux 命令了
- 执行
sh test.sh
或
chmod +x test.sh
./test.sh
2. 接收用户的参数
Shell 脚本程序中的参数位置变量
提示:
- $0 对应的是当前 Shell 脚本程序的名称
- $#对应的是总共有几个参数
- $*对应的是所有位置的参数值
- $?对应的是显示上一次命令的执行返回值
- $1、$2、$3……则分别对应着第 N 个位置的参数值
如:
vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。 "
echo "第 1 个参数为$1,第 5 个为$5。 "
sh example.sh one two three four five six
3. 判断用户的参数
按照测试对象来划分,条件测试语句可以分为 4 种:
1. 文件测试语句
文件测试所用的参数
运算符 | 作用 |
---|---|
-d |
测试文件是否为目录类型 |
-e |
测试文件是否存在 |
-f |
判断是否为一般文件 |
-r |
测试当前用户是否有权限读取 |
-w |
测试当前用户是否有权限写入 |
-x |
测试当前用户是否有权限执行 |
如:
- 判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为 0,则目录存在;如果返回值为非零的值,则意味着目录不存在
[ -d /etc/fstab ]
echo $?
- 判断/etc/fstab 是否为一般文件,如果返回值为 0,则代表文件存
在,且为一般文件
[ -f /etc/fstab ]
echo $?
2. 逻辑测试语句
-
&&
表示当前面的命令执行成功后才会执行它后面的命令 -
||
表示当前面的命令执行失败后才会执行它后面的命令 -
!
表示把条件测试中的判断结果取相反值
如:
- 判断当前登录的用户是否为非管理员用户
[ ! $USER = root ] && echo "user" || echo "root"
3. 整数值比较语句
可用的整数比较运算符
运算符 | 作用 |
---|---|
-eq |
是否等于 |
-ne |
是否不等于 |
-gt |
是否大于 |
-lt |
是否小于 |
-le |
是否等于或小于 |
-ge |
是否大于或等于 |
如:
- 10 是否大于 10
[ 10 -gt 10 ]
echo $?
- 获取内存可用量
free -m
free -m | grep Mem:
free -m | grep Mem: | awk '{print $4}'
FreeMem=`free -m | grep Mem: | awk '{print $4}'`
echo $FreeMem
使用整数运算符来判断内存可用量的值是否小于 1024,若小
于则会提示“Insufficient Memory”(内存不足)的字样
[ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
4. 字符串比较语句
- 判断测试字符串是否为空值,或两个字符串是否相同
- 用来判断某个变量是否未被定义(即内容为空值)
常见的字符串比较运算符
运算符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
如:
- 判断 String 变量是否为空值,进而判断是否定义了这个变量
[ -z $String]
echo $?
- 环境变量值 LANG 不是英语(en.US)时,则会满足逻辑测试条件并输出“Not en.US”(非英语)的字样
[ $LANG!="en.US" ] && echo "Not en.US"
六、流程控制语句
1. if 条件测试语句
单分支的 if 语句
if 条件语句的单分支结构由 if、 then、 fi 关键词组成,而且只在条件成立后才执行预设的命令,相当于口语的“如果……那么……”
如:
- 单分支的 if 条件语句来判断/media/cdrom 文件是否存在,若存在就结束条件判断和整个 Shell 脚本,反之则去创建这个目录
vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
双分支的 if 语句
if 条件语句的双分支结构由 if、 then、 else、 fi 关键词组成,它进行一次条件匹配判断,如果与条件匹配,则去执行相应的预设命令;反之则去执行不匹配时的预设命令,相当于口语的“如果……那么……或者……那么……”
如:
- 验证某台主机是否在线
vim chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
sh chkhost.sh 192.168.10.10
多分支的 if 语句
if 条件语句的多分支结构由 if、 then、 else、 elif、 fi 关键词组成,它进行多次条件匹配判断,这多次判断中的任何一项在匹配成功后都会执行相应的预设命令,相当于口语的“如果……那么……如果……那么……”
如:
多分支的 if 条件语句来判断用户输入的分数在哪个成绩区间内,然后输出如Error、Excellent、 Pass、 Fail 等提示信息
vim chkscore.sh
#!/bin/bash
read -p "Enter your score(0-100): " GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ] ; then
echo "$GRADE is Error"
else
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
fi
sh chkscore.sh
提示:
- 在 Linux 系统中, read 是用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量, -p 参数用于向用户显示一定的提示信息
2. for 条件循环语句
for 循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用 for 循环语句再适合不过了
如:
1.使用 for 循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码
- 用户列表
vim users.txt
andy
barry
carl
duke
eric
george
- 脚本
vim Example.sh
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.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 "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
提示:
- 执行批量创建用户的 Shell 脚本 Example.sh,在输入为账户设定的密码后将由脚本自动检查并创建这些账户。由于已经将多余的信息通过输出重定向符转移到了/dev/null 黑洞文件中,因此在正常情况下屏幕窗口除了“用户账户创建成功”(Create success)的提示后不会有其他内容
- 在 Linux 系统中, /etc/passwd 是用来保存用户账户信息的文件。如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建用户信息
- 从文本中自动读取主机列表,然后自动逐个测试这些主机是否在线
vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12
vim CheckHosts.sh
#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /d
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done
3. while 条件循环语句
while 条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于 for 循环语句中有目标、有范围的使用场景。 while 循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环
如:
- 猜测数值大小
vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为 0-999 之间,猜猜看是多少? "
while true
do
read -p "请输入您猜测的价格数目: " INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜 g $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了! "
else
echo "太低了! "
fi
done
4. case 条件测试语句
case 语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令
vim Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按 Enter 键确认: " KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。 "
;;
[0-9])
echo "您输入的是 数字。 "
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。 "
esac
七、计划任务服务程序
计划任务分为一次性计划任务与长期性计划任务
一次性计划任务-at
- 一次性计划任务只执行一次,一般用于满足临时的工作需求
提示:
- 可以用 at命令实现这种功能
at [时间]
- 如果想要查看已设置好但还未执行的一次性计划任务
at -l
- 要想将其删除
atrm [任务序号]
- 在使用 at 命令来设置一次性计划任务时,默认采用的是交互式方法
- Ctrl + D组合键来结束编写计划任务
at 23:30
systemctl restart httpd
at -l
atrm 1
at -l
或
echo "systemctl restart httpd" | at 23:30
at -l
atrm 1
at -l
长期性计划任务-crondtab
提示:
- 创建、编辑计划任务的命令为
crontab -e
- 查看当前计划任务的命令为
crontab -l
- 删除某条计划任务的命令为
crontab -r
- 如果您是以管理员的身份登录的系统
crontab -u
来编辑他人的计划任务
分、时、日、月、星期
字段 | 说明 |
---|---|
分 | 取值为 0~59 的整数 |
时 | 取值为 0~23 的任意整数 |
日 | 取值为 1~31 的任意整数 |
月 | 取值为 1~12 的任意整数 |
星期 | 取值为 0~7 的任意整数,其中 0 与 7 均为星期日 |
命令 | 要执行的命令或程序脚本 |
如:
- 在每周一、三、五的凌晨 3 点 25 分,都需要使用 tar 命令把某个网站的数据目录进行打包处理,使其作为一个备份文件
crontab -e
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
crontab -l
- 每周一至周五的凌晨 1 点钟自动清空/tmp 目录内的所有文件
crontab -e
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
crontab -l
说明:
- 除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、 9 月
和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的 12~15 日)。以及用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔2 分钟执行一次任务)- 在 crond 服务的配置参数中,可以像 Shell 脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等要信息
- 计划任务中的“分”字段必须有数值,绝对不能为空或是号,而“日”和“星期”字段不能同时使用,否则就会发生冲突
- 在 crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,可以用type或whereis查看
更新中......