Vim编辑器与Shell命令脚本

koke
2022-08-10 / 0 评论 / 189 阅读 / 正在检测是否收录...

vi/vim编辑器

vim编辑器有颜色,vi编辑器没有

默认打开:命令模式

编辑模式: i,a,o

末行模式:

命令作用
: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配置网卡信息

进入到网卡配置文件所在的目录,然后编辑网卡配置文件,在其中填入下面的信息:

[root@linuxprobe ~]# cd /etc/sysconfig/network-scripts/
[root@linuxprobe network-scripts]# vim ifcfg-ens160
TYPE=Ethernet
BOOTPROTO=static
NAME=ens160
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1

执行重启网卡设备的命令,然后通过ping命令测试网络能否连通。

systemctl restart network
nmcli connection reload ens160
ping 192.168.10.10

Shell命令脚本

1、 交互式(Interactive):用户每输入一条命令就立即执行。
2、批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。

脚本声明 #!/bin/bash

脚本注释 #txykoke.cn编写

脚本命令 ls pwd

 #!/bin/bash
 #txykoke.cn编写
 echo "$0" 脚本名称
 echo "$#" 总共接受了几个参数
 echo "$*"参数分别是什么
 echo "$1,$2,$5" 接收到第1个第3个第5个的参数
[root@txykoke koke]# bash haha.sh a b c d e f
haha.sh
6
a b c d e f
a,b,e
[root@txykoke koke]# 

测试语句格式:[ 条件表达式 ] (两边均有一个空格)

文件测试所用的参数

操作符作用
-d测试文件是否为目录类型
-e测试文件是否存在
-f判断是否为一般文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有权限执行

判断是否是目录

#如果返回值为0,则目录存在;如果返回值为非零的值,则意味着它不是目录,或这个目录不存在
[ -d /etc/koke ]
echo $?
#判断/dev/cdrom文件是否存在,若存在则输出Exist字样。
[ -e /dev/cdrom ] && echo "Exist"
#判断用户是否不是管理员账户,不是管理员账号账户则输出root
[ ! $USER = root ] || echo "root"
#先判断当前用户是否root,然后!取反,如果当前不是root用户,则输出user,反之输出root
[ ! $USER = root ] && echo "user" || echo "root"

Tips

&&是逻辑“与”,只有当前面的语句执行成功的时候才会执行后面的语句。
||是逻辑“或”,只有当前面的语句执行失败的时候才会执行后面的语句。
!是逻辑“非”,代表对逻辑测试结果取反值;之前若为正确则变成错误,若为错误则变成正确。

整数比较运算符

操作符作用
-eq是否等于
-ne是否不等于
-gt是否大于
-lt是否小于
-le是否等于或小于
-ge是否大于或等于
#创建一个变量num 如果10大于num成立 则输出0
num=100;
[ 10 -gt $num ]
echo $?
#判断当前服务器内存,并设置警告值
FreeMem=`free -m |grep Mem: |awk '{print$4}'`
[ $FreeMem -lt 300 ] && echo "内存告急:小于300m,请检查/升级配置"|| echo "内存余量正常"

常见的字符串比较运算符

操作符作用
=比较字符串内容是否相同
!=比较字符串内容是否不同
-z判断字符串内容是否为空
#接下来通过判断FreeMem变量是否为空值,进而判断是否定义了这个变量:
[ -z $FreeMem ]
echo $?
[ -z $LANG ]
echo $?

流程控制语句

if条件测试语句

#!/bin/bash
#测试主机是否在线
read -p "请输入您的ip地址:"  ip
ping -c 3 -i 0.2 -W 3 $ip &> /dev/null
if [ `echo $?` -eq 0 ];then
    echo "地址 $ip 是在线的"
else 
    echo "地址 $ip 是不在线的"
fi
#创建成绩表 a.txt
张三 40
李四 89
koke 60
亚男 59
#!/bin/bash
#判断学生学习成绩1
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

for条件循环语句

#!/bin/bash
#判断学生学习成绩2
read -p "请输入您的姓名:" Result
echo "请稍等,正在查询您的成绩"
sleep 1
#备份旧的IFS变量
OLDIFS="IFS"  
#修改分隔符为换行符
IFS=$'\n'  
#文件行数
n=`wc -l a.txt|awk '{print$1}'`
#循环次数
s=0
for name in `cat a.txt`
do
    s=`expr $s + 1`
    if [ `echo $name |awk '{print$1}'` = `echo $Result` ]
    then
        echo "您的成绩是:"`echo $name |awk '{print$2}'`"分"
        #记录分数到num
        num=`echo $name |awk '{print$2}'`
        sleep 1
        if [ $num -ge 85 ]&& [ $num -le 100 ];then
            echo "您的评级:优秀"
            break
        elif [ $num -ge 70 ] && [ $num -le 84 ];then
            echo "您的评级:良好"
            break
        elif [ $num -ge 60 ] && [ $num -le 69 ];then
            echo "您的评级:合格"
            break
        elif [ $num -lt 60 ] && [ $num -ge 0 ];then
            echo "您的评级:不合格"
            break
        else
            echo "查询到成绩不合法"
            break
        fi
    elif [ $s -eq $n ]&&[ `echo $name |awk '{print$1}'` != `echo $Result` ];then
        echo "未匹配到您输入的姓名,请检查"
    fi
     
done
#还原IFS变量
IFS="$OLDIFS"
#创建用户名表
vim users.txt
andy
barry
carl
duke
eric
george
#!/bin/bash
#批量创建用户
read -p "请输入你的密码:" PASSWD
for UNAME in `cat user.txt`
do
    id $UNAME $> /dev/null
    if [ $? -eq 0 ];then
        echo "$UNAME ,用户已经存在"
    else
        useradd $UNAME
        echo "$PASSWD"|PASSWD ==stdin $UNAME &>/dev/null
        echo "$UNAME,用户创建成功"
    fi
done
#!/bin/bash
#批量检测IP地址是否在线
#创建ip地址文件:ipaddr.txt
Host=`cat ipaddr.txt`
touch online.txt &> /dev/null
for IP in $Host
do
    ping -c 1 $IP &> /dev/null
    if [ $? -eq 0 ];then
        echo $IP >> online.txt
    else
        echo "$IP 不在线"
    fi
done
echo "在线IP:"
cat online.txt

自己做的一个小脚本

#!/bin/bash
#经过一些if语句和for循环查询学习,做了这个将疑似DDOS攻击的ip地址加入黑名单,
#只需要简单设置自己服务器IP以及IP的访问量,就可以一键运行并自动拉黑。
# 判断是否安装了nload
if ! type nload >/dev/null 2>&1
then
    echo "nload 未安装"
    yum install nload -y
    echo "nload 已经安装完成"
else
    echo 'nload 已安装'
fi

#判断文件是否存在
file="file.txt"
if [ ! -e $file ]
then

 echo "文件不存在"
 touch file.txt
sleep 2
echo "文件已创建"

else

 echo "文件已经存在"

fi
#备份旧的IFS变量
OLDIFS="IFS"  
#修改分隔符为换行符
IFS=$'\n'  
touch blacklist.txt >> /dev/null
touch black.txt >> /dev/null
#将ip信息存入file.txt
netstat -ntu|awk '{print $5}'|cut -d: -f1 -s|sort|uniq -c|sort -nk1 -r|sed 's/[\t ]\+/ /g' |sed '/81.68.172.160/'d |sed '/127.0.0.1/'d>file.txt 
#遍历文件ip
for ip in `cat file.txt`
do
#将取出的ip占有量 临时存放给变量num
num=`echo $ip | awk '{print $1}'`
#如果ip占有量超过20
if [ $num -gt 20 ] 
then
#则将ip进行显示
echo $ip | awk '{print $2}' 
#将ip加入黑名单
blacklist=`echo $ip | awk '{print $2}' `
iptables -I INPUT -s $blacklist -j DROP
echo $blacklist >> blacklist.txt
echo $blacklist >> black.txt
fi
done
#cat blacklist.txt|sed -e '/^$/d' > blacklist.txt
#cat black.txt|sed -e '/^$/d' > black.txt
if [ -s blacklist.txt ];then

  echo "黑名单列表:"
  cat blacklist.txt
  echo "可疑ip已加入黑名单"
  echo "本脚本加入的黑名单可查看black.txt文件"
else
  echo "机器目前状态良好"
fi
rm -rf  blacklist.txt
IFS="$OLDIFS" #还原IFS变量
#!/bin/bash
#判断用户,并且批量创建
read -p "请输入您要设置的用户名的密码:" PASSWD
for UNAME in `cat user.txt`
do
    id $UNAME &> /dec/null
    if [ $? -eq 0 ];then
        echo "用户$UNAME已经存在"
    else
        useradd $UNAME &> /dev/null
        echo "$PASSWD"|passwd --stdin $UNAME &> /dev/null
    fi
done
#!/bin/bash
#遍历局域网ip,并测试是否在线
str="10.10.1."
for ip in {200..220}
do
ping -c1 -w1 $str$ip &> /dev/null
        if [ $? -eq 0 ];then
                echo "$str$ip 是在线的"
        fi
done

while条件循环语句

#!/bin/bash
#while 语句编写猜数字
#取100以内的随机数
RDOM=$(expr $RANDOM % 1000)
#猜的数字的次数
sum=0
echo "------猜数字小游戏------"
while true
do
read -p "请输入一个1000以内的数字:" NUM
let TIMES++
expr $NUM + 1 &> /dev/null
if [ $? != 0 ];then
    echo "输入有误,请重新输入"
elif [ $NUM -gt 1000 ];then
    echo "请输入小等于1000的数字。"
elif [ $NUM -lt 0 ];then
    echo "请输入大于等于0的数字。"
elif [ $NUM -eq $RDOM ];then
    echo "恭喜你,猜对了!!"
    echo "你一共猜了 $TIMES次"
    exit 0
elif [ $NUM -gt $RDOM ];then
    echo "你猜大了!!"
elif [ $NUM -lt $RDOM ];then
    echo "你猜小了!!"
else "您的输入有误!!"
fi
done

case条件测试语句

#!/bin/bash
#case语句,判断
read -p "Enter:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "字母"
;;
[0-9])
echo "数字"
;;
*)
echo "错误"
;;
esac

计划任务服务程序

一次性的计划任务:at
at 时间 > reboot
保存:Ctrl+D
查看当前已有哪些计划任务 :at -l
查看命令:at -c 编码
删除计划任务:atrm 编码 或者 at -r

at命令的参数及其作用

参数作用
-f指定包含命令的任务文件
-q指定新任务名称
-l显示待执行任务列表
-d删除指定待执行任务
-m任务执行后给用户发邮件
#让at命令接收前面echo命令的输出信息
echo "systemctl restart httpd" | at 23:30

一般我们会使用“at now +2 MINUTE”的方式进行操作,这表示2分钟(MINUTE)后执行这个任务,也可以将其替代成小时(HOUR)、日(DAY)、月(MONTH)等词汇:

at now +2 MINUTE
at> systemctl restart httpd
Ctrl+D

周期性的计划任务:crond

crond 服务名称
crontab 配置工具
分 时 日 月 星期 命令

​ crontab命令的参数及其作用

参数作用
-e编辑计划任务
-u指定用户名称
-l列出任务列表
-r删除计划任务

​ 使用crond设置任务的参数字段说明

字段说明
分钟取值为0~59的整数
小时取值为0~23的任意整数
日期取值为1~31的任意整数
月份取值为1~12的任意整数
星期取值为0~7的任意整数,其中0与7均为星期日
命令要执行的命令或程序脚本
crontab -e
#分 时 日 月 星期 命令
#每周日的0:30分重启
30 0 * * 7 /usr/sbin/reboot
#每隔两小时重启
* */2 * * * /usr/sbin/reboot
#每月的3-5号的2:30分重启
30 2 3-5 * * /usr/sbin/reboot
#每月的3号5号7号的2:30分重启
30 2 3,5,7 * * /usr/sbin/reboot
0

评论 (0)

取消