10 个拿来就用的 Shell 脚本实例!

脚本 1:该脚本用于读取Linux系统/etc/passwd文件中的所有/bin/bash作为登录默认Shell的用户列表,并提取每个用户的用户名。对于这些用户名进行检查,是否不等于roottidb。如果用户名不等于roottidb,则使用usermod命令对该用户的默认Shell修改为:/sbin/nologin,它通常用于禁止用户远程登录系统。

#!/bin/bash
for user in $(cat /etc/passwd | grep /bin/bash | cut -d ":" -f 1)
doif [ $user != "root" ] && [ $user != "tidb" ]; thenusermod -s /sbin/nologin $userfi
done

脚本 2:该脚本首先自定义了md5_listmd5_no_hash.txt两个文件,然后循环读取md5_list文件中每一行的哈希值,判断是否在md5_no_hash.txt文件中存在。

如果检查出哈希值在md5_no_hash.txt中存在,则打印信息:MD5值 xxx 在 md5_no_hash.txt 中存在

如果检查出哈希值在md5_no_hash.txt中不存在,则打印信息:MD5值 xxx 在 md5_no_hash.txt 中不存在

#!/bin/bash  # 指定md5_list文件和md5_no_hash.txt文件的路径  
md5_list_file="md5_list"
md5_no_hash_file="md5_no_hash.txt"# 循环读取md5_list文件中的每一行  
while IFS= read -r md5; do# 检查md5是否在md5_no_hash.txt中  if grep -q "$md5" "$md5_no_hash_file"; thenecho "MD5值 $md5 在 $md5_no_hash_file 中存在"  elseecho "MD5值 $md5 在 $md5_no_hash_file 中不存在"  fi
done < "$md5_list_file"

 脚本 3:该脚本的主要功能是:遍历读取一个包含IP地址的文件,如该文件名为:mmyd,然后对该文件里的每行IP地址执行ping操作,并检查丢包率。如果ping的丢包率为:100%,则输出该IP不可达的日志;如果ping不存在丢包率,则输出该IP可达的日志。

#!/bin/bash  
# author:JackTian
# 获取当前系统时间  
current_time=$(date +"%Y-%m-%d-%H:%M:%S")
# 获取开始时间戳  
start_time=$(date +%s)for i in `cat mmyd`  # 这个是逐个读取该文件里的全部所列出的 IP 地址
doping=`ping -c 10 $i | grep loss | awk '{print $6}' | awk -F "%" '{print $1}'`# 上面一行是对读出来的ip ping一次,看是否ping通。并取出loss的百分比的值 也就是丢包的值,看是否丢包Packet_Loss_Rate=`ping -c 10 $i | grep loss | awk '{print $6}'`if [ $ping -eq 100 ];then# 比较一下,看丢包的值是不是100,如果是100就是全部丢包,那就是没ping通,那就显示 IP ping 失败了,如果不等于100的话,就ping通了,就显示 IP ping 成功了。echo "$current_time 某某移动-活跃 IP 地址:$i ping 失败了,丢包率为:$Packet_Loss_Rate" >>/opt/jacktian/mmyd_ping.logelseecho "$current_time 某某移动-活跃 IP 地址:$i ping 成功了!" >>/opt/jacktian/mmyd_ping.logfi
done# 获取结束时间戳  
end_time=$(date +%s)# 计算执行时间(秒)  
execution_time_seconds=$((end_time - start_time))# 将执行时间转换为分钟和秒  
minutes=$((execution_time_seconds / 60))
seconds=$((execution_time_seconds % 60))echo "执行完毕!该脚本执行时间共: $minutes 分钟 $seconds 秒"

脚本 4:该脚本用于在Linux系统中创建新用户,并为该用户设置密码、省份代码、目录权限以及vsftpd服务的配置。

#!/bin/shread -p "user:" user
read -p "passd:" pass
read -p "province:" provinceuseradd $user -d /bigdata/sftp/province/$province/#passwd $user
echo $pass | passwd --stdin $userchown $user /bigdata/sftp/province/$province/ -Rchmod 750 /bigdata/sftp/province/$province/ -Recho $user>>/etc/vsftpd/chroot_listecho $user>>/etc/vsftpd/user_listsystemctl restart vsftpd.service
  • read -p "user:" user:提示用户输入一个用户名,并将输入的值存储在变量user

  • read -p "passd:" pass:提示用户输入一个密码,并将输入的值存储在变量pass中。注意:在输入密码时,不会显示任何字符

  • read -p "province:" province:提示用户输入一个省份代码,并将输入的值存储在变量province

  • useradd $user -d /bigdata/sftp/province/$province/:该命令将创建一个新用户,其用户名为之前输入的user,其家目录为:/bigdata/sftp/province/$province/

  • echo $pass | passwd --stdin $user:该命令会将之前输入的密码通过标准输入传给passwd命令,为新创建的用户设置密码

  • chown $user /bigdata/sftp/province/$province/ -R:该命令将更改新创建用户成为/bigdata/sftp/province/$province/目录及其子目录的所有者

  • chmod 750 /bigdata/sftp/province/$province/ -R:该命令会设置/bigdata/sftp/province/$province/目录及其子目录的权限为:750,也就是指:用户有读、写、执行的权限,而用户组只有读和执行的权限

  • echo $user>>/etc/vsftpd/chroot_list:该命令会将新创建的用户添加到vsftpd服务的chroot列表中。这表示当vsftpd服务在运行时,该用户会被限制在其自己的目录中,不能访问系统的其他目录

  • echo $user>>/etc/vsftpd/user_list:该命令会将新创建的用户添加到vsftpd服务的用户列表中。这表示当vsftpd服务在运行时,这个用户可以登录并访问系统。

  • systemctl restart vsftpd.service:重启vsftpd服务,使之前的所有配置生效

脚本 5:该脚本用于在Linux系统中创建新用户,并为该用户设置密码、省份代码、idcid、目录权限以及vsftpd服务的配置。跟如上脚本 4 略有差异。

#!/bin/shread -p "user:" user
read -p "passd:" pass
read -p "province:" province
read -p "idcid:" idcidmkdir -p /bigdata/sftp/province/$province/$idciduseradd $user -d /bigdata/sftp/province/$province/$idcid#passwd $user
echo $pass | passwd --stdin $userchown $user /bigdata/sftp/province/$province/$idcid/ -Rchmod 750 /bigdata/sftp/province/$province/$idcid -Recho $user>>/etc/vsftpd/chroot_listecho $user>>/etc/vsftpd/user_listsystemctl restart vsftpd.service

脚本 6:该脚本首先自定义了省份编码列表为多个目录路径,循环遍历自定义的省份编码列表。对于每一个省份编码,脚本将其分割为三个部分:省份编码、运营商和数据上报类型。然后进入对应的省份目录。

执行du -sh 2023-10-* 命令,查询所有以2023-10-开头目录的大小,并将结果输出到一个名为$province_code_file_size.txt的文件中。

执行for循环,循环遍历所有子目录并查询每个子目录中的文件数量,然后将结果输出到一个名为$province_code_file_count.txt的文件中。

最后,脚本会返回到上级目录,以便对下一个省份编码下的文件大小及文件数量进行查询。所有的查询结果将保存在/opt/目录下的以省份编码命名的文件中。

#!/bin/bash  
# @Time    : 2023/10/30  
# @Author  : jacktian  
# @Desc    : 这是一个适用于某台服务器循环查询特定省份、特定运营商、特定数据上报类型的文件大小及文件个数的脚本。  # 定义省份编码列表  
provinces=("110000/dianxin/1024" "120000/liantong/1024" "130000/yidong/1024")  # 遍历省份编码列表  
for province in "${provinces[@]}"; do  # 分割省份编码、运营商和数据上报类型province_code=$(echo $province | cut -d'/' -f1)  operator=$(echo $province | cut -d'/' -f2)  category=$(echo $province | cut -d'/' -f3)  # 进入省份目录  cd /bigdata/sftp/province/$province_code/$operator/$category  # 执行du命令查询文件大小,并将结果输出到对应的省份编码txt文件  du -sh 2023-10-* >> /opt/"$province_code"_file_size.txt  # 执行for命令查询日期文件个数,并将结果输出到对应的省份编码txt文件  for date in $(ls -d */ | cut -d'/' -f1);  do  echo $date $(ls -1 $date | wc -l) >> /opt/"$province_code"_file_count.txt  done  # 返回上级目录  cd ..  done

脚本 7:该脚本用于循环查询特定省份、特定数据上报类型的文件大小及文件个数。跟如上脚本 6 略有差异。

#!/bin/bash
# @Time    : 2023/10/30
# @Author  : jacktian
# @Desc    : 这是一个适用于某台服务器循环查询特定省份、特定数据上报类型的文件大小及文件个数的脚本。 # 定义省份编码列表  
provinces=("110000" "120000" "130000")  # 遍历省份编码列表  
for province in "${provinces[@]}"; do  # 进入省份目录  cd /bigdata/sftp/province/$province/1024# 执行du命令查询文件大小,并将结果输出到对应的省份编码txt文件  du -sh 2023-10-* >> /opt/"$province"_file_size.txt  # 执行for命令查询日期文件个数,并将结果输出到对应的省份编码txt文件  for date in $(ls -d */ | cut -d'/' -f1);   do   echo $date $(ls -1 $date | wc -l) >> /opt/"$province"_file_count.txt  done  # 返回上级目录  cd ..  done

脚本 8:该脚本主要用于为某些特定的 XML 文件在特定时间段内的修改情况,并把结果保存在日志中。

#!/bin/bash  # 获取当前日期  
current_date=$(date +%Y-%m-%d)  # 第一条命令  
directory_path="/bigdata/sftp/province/110000/yidong/1024/$current_date"  
output_file="/opt/log_110000_yidong_$current_date.txt"  
cd "$directory_path" && ls -l *.xml | awk '{print $8,$9}' | grep -v '^$' | awk -F '[/:]' '{hour=substr($1,1,2); if ((hour >= "00" && hour < "08") || (hour >= "10" && hour < "12") || (hour >= "14" && hour <= "24")) print}' >> "$output_file" # 第二条命令  
directory_path="/bigdata/sftp/province/120000/dianxin/1024/$current_date"  
output_file="/opt/log_120000_dianxin_$current_date.txt"  
cd "$directory_path" && ls -l *.xml | awk '{print $8,$9}' | grep -v '^$' | awk -F '[/:]' '{hour=substr($1,1,2); if ((hour >= "00" && hour < "08") || (hour >= "10" && hour < "12") || (hour >= "14" && hour <= "24")) print}' >> "$output_file"  # 第三条命令  
directory_path="/bigdata/sftp/province/130000/liantong/1024/$current_date"  
output_file="/opt/log_130000_liantong_$current_date.txt"  
cd "$directory_path" && ls -l *.xml | awk '{print $8,$9}' | grep -v '^$' | awk -F '[/:]' '{hour=substr($1,1,2); if ((hour >= "00" && hour < "08") || (hour >= "10" && hour < "12") || (hour >= "14" && hour <= "24")) print}' >> "$output_file"# 退出进程  
exit

首先使用date命令获取当前日期,格式为:YYYY-MM-DD,并自定义current_date变量。

然后,自定义了一个目录路径directory_path和输出文件output_file

使用ls -l *.xml列出所有以.xml结尾的文件,通过awk '{print $8,$9}'提取文件的修改时间和大小信息,grep -v '^$'过滤掉空行,awk -F '[/:]' '{hour=substr($1,1,2); if ((hour >= "00" && hour < "08") || (hour >= "10" && hour < "12") || (hour >= "14" && hour <= "24")) print}'筛选出每天的00:00-07:59、10:00-11:59、14:00-23:59时间段内修改的文件,并输出它们的修改时间和大小信息,将结果追加到指定的输出文件中。

脚本 9:该脚本主要用于监控系统资源使用情况,获取并记录了磁盘使用情况、CPU空闲情况、内存空闲情况和进程总数,并将这些打印信息输出到某个日志文件中。

#!/bin/bashdate=$(date +%Y-%m-%d-%H:%M:%S)#1、打印磁盘使用情况
DISK_1=$(df -h | awk '{printf $NF} {printf "使用率:"} {print $5} '| grep appslog | grep -v 'Filesystem')
DISK_2=$(df -h | awk '{printf $NF} {printf "使用率:"} {print $5} '| grep bigdata | grep -v 'Filesystem')
DISK_3=$(df -h / | awk '{printf $NF} {printf "使用率:"} {print $5} '| grep / | grep -v 'Filesystem')#2、打印 CPU 空闲情况
CPU=$(top -n 1 | grep Cpu | awk 'BEGIN {printf"CPU 空闲使用率:"} {print $8}')#3、打印内存空闲情况
MEMORY=$(free -h | awk 'BEGIN {printf"内存空闲使用率:"} NR==2 {print $4}')#4、打印进程总数
JINCHENG=$(ps aux | wc -l | awk 'BEGIN {printf"进程总数:"} {print $1}')echo -e "\n $date\n\n $DISK_1\n\n $DISK_3\n\n $CPU\n\n $MEMORY\n\n $JINCHENG\n" >> /opt/jacktian/inspection.logexitdone
  • date=$(date +%Y-%m-%d-%H:%M:%S):获取当前日期和时间,格式为:年-月-日-时:分:秒

  • DISK_1、DISK_2、DISK_3:该变量用于获取磁盘的使用情况。使用df -h命令获取磁盘信息,然后使用awk提取出使用率和文件系统名称。grep用于筛选出特定名称的磁盘(如:appslog 和 bigdata)

  • CPU:该变量获取CPU的空闲使用率。使用top -n 1命令获取系统状态,然后使用grepawk提取出CPU的空闲使用率

  • MEMORY:该变量获取了内存的空闲使用率。使用free -h命令获取内存信息,然后使用awk提取出空闲内存的使用率

  • JINCHENG:该变量获取了系统的进程总数。使用ps aux命令获取进程信息,然后使用wc -l命令统计行数,即进程总数

  • echo -e "\n $date\n\n $DISK_1\n\n $DISK_3\n\n $CPU\n\n $MEMORY\n\n $JINCHENG\n":这部分将上述所有的打印信息拼接在一起,并输出到日志文件中

脚本 10:该脚本主要用于定期循环连接 FTP 服务器的访问情况,当异常时通过企业微信机器人发送告警信息。

#!/bin/bash# FTP IP 列表
FTP_IPS=("IP_1" "IP_2" "IP_3")#企业微信机器人地址(需要根据实际机器人地址配置)
WEBHOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXX#循环执行检测方法while :
dodate=$(date +%Y-%m-%d-%H:%M:%S)# 循环遍历 FTP IP 列表
for ip in "${FTP_IPS[@]}"
do# 连接 FTP 服务器ftp -n $ip <<EOF# 退出 FTP 服务器exitEOF# 检查上一条命令的退出状态码if [ $? -ne 0 ];then# 如果退出状态码不为 0,则表示命令执行失败,发送异常的告警到企业微信机器人curl --location --request POST ${WEBHOOK_URL} \
--header 'Content-Type: application/json' \
-d '{"msgtype": "markdown", "markdown": {"content": "'$date' FTP 访问异常:$ip"}}'echo "$date FTP 访问异常:$ip" >>/opt/ftp_check/ftp_check.logelse# 如果退出状态码为 0,则表示命令执行成功,不发送正常的告警到企业微信机器人echo "$date FTP 访问正常:$ip" >>/opt/ftp_check/ftp_check.logfi
done
exit
done
  • FTP_IPS:该变量中包含了多个FTP服务器的IP地址

  • WEBHOOK_URL:该变量为企业微信机器人的地址,需要将 XXX 部分替换为实际的企业微信机器人的key

  • 使用了while循环来定期执行检测。在每次循环中,将获取当前日期和时间,遍历FTP_IPS列表。对于列表中的每个IP地址,脚本会尝试连接到FTP服务器

  • 如果连接命令ftp -n $ip执行失败,则退出状态码不为:0,则表示FTP访问异常。在这种情况下,脚本会发送一个异常告警到企业微信机器人,并将相关信息写入日志文件

  • 如果连接命令执行成功,退出状态码为:0,则表示FTP访问正常,脚本将不发送告警信息,只是在日志中记录正常访问的信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs之 crypto-js模块,浏览器端加解密算法库

一、简介 CryptoJS是一个JavaScript加密算法库&#xff0c;用于实现各种加密算法和哈希函数。它提供了一种简单而强大的方式来执行加密操作&#xff0c;包括对称加密算法、非对称加密算法和哈希函数等。 CryptoJS支持的主要功能包括&#xff1a; 1.对称加密&#xff1a;Crypto…

async/await

异步的终极解决方案&#xff1a;async/await 1. 背景 在深入讨论 async/await 之前&#xff0c;我们需要了解一下 JavaScript 的单线程和非阻塞的特性。JavaScript 是单线程的&#xff0c;也就是说在任何给定的时间点&#xff0c;只能执行一个操作。然而&#xff0c;对于需要…

Unity 使用INI文件存储数据或配置参数预设

法1&#xff1a;调用外部Capi库 具体使用&#xff1a; public class Ini{//读取INI文件需要调用C的APP[System.Runtime.InteropServices.DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, st…

强大好用的shell:shell命令

命令名称&#xff1a;就是语法中的“动词”&#xff0c;表达的是想要做的事情&#xff0c;例如创建用户、查看文件、重启系统等操作。 命令参数&#xff1a;用于对命令进行调整让“修&#xff0c;改”过的命令能更好地贴合工作需求&#xff0c;达到事半功倍的效果。 命令对象&a…

Linux各种版本安装详细步骤和root密码破解

文章目录 VMware新建虚拟机硬件设置设置虚拟网络挂载ISO文件 root密码破解 VMware新建虚拟机 硬件设置 设置虚拟网络 编辑>虚拟网络编辑器>VMnet8(NAT模式) 挂载ISO文件 加电>开启次虚拟机 第二项可以检查挂载上来的iso文件是否完整没有破坏 磁盘分区 选自定义分…

k8s的Init Containers容器实现代码版本升级发布和deployment版本回退:实战操作版

Pod中的初始化容器&#xff1a;Init Containers initContainers实现理论前提:同一个Pod内的容器共享 网络、volume等资源 Init Containers 在Kubernetes中&#xff0c;init容器是在同一个Pod中的其他容器之前启动和执行的容器。它的目的是为Pod上托管的主应用程序执行初始化…

Linux yum,vim详解

yum是什么 yum是一个Linux系统预装的指令&#xff0c;yum的功能是可以对app进行搜索&#xff0c;下载&#xff0c;相当于Linux下的应用商店。 yum是读取Linux中镜像文件中的网页地址&#xff0c;下载用户所输入的命令。 如何使用yum下载软件 yum install -y(所有选项都yes) …

IntelliJ Idea 撤回git已经push的操作

最初的样子 现在的样子 解决方案 第一步&#xff0c;commit到本地撤回&#xff1a; 打开提交历史记录&#xff0c;选中回退的版本右键&#xff0c;点击“Reset Current Branch to Here…”,然后选中“Mixed”&#xff0c;点击Reset后&#xff0c;之前commit的代码会在本地显…

UnityAI——动物迁徙中的跟随实现实例

大家好&#xff0c;我是七七&#xff0c;今天来给大家介绍的是Unity中用操控行为实现的跟随领队行为。 看本文若是想了解和实现&#xff0c;只看本文即可&#xff0c;若是想彻底弄透&#xff0c;建议从七七的游戏AI专栏开始看。 废话不多说&#xff0c;先上视频&#xff1a; …

SpringBean生命周期

SpringBean的创建过程的生命周期可以分为 通过构造方法创建普通对象对普通对象属性进行依赖注入&#xff08;被Autowired注解修饰的变量&#xff09;执行初始化前的操作&#xff08;被PostConstruct注解修饰的方法&#xff09;执行初始化操作&#xff08;需要实现Initializing…

UDP网络编程

一)熟悉TCP/IP五层协议: 1)封装:就是在数据中添加一些辅助传输的信息&#xff1b; 2)分用:就是解析这些信息 3)发送数据的时候&#xff0c;上层协议要把数据交给下层协议&#xff0c;由下层协议来添加一些信息 4)接收数据的时候&#xff0c;下层协议要把数据交给上层协议&#…

c语言-数据结构-栈和队列的实现和解析

目录 一、栈 1、栈的概念 1.2 栈的结构 2、栈的创建及初始化 3、压栈操作 4、出栈操作 5、显示栈顶元素 6、显示栈空间内元素的总个数 7、释放栈空间 8、测试栈 二、队列 1、队列的概念 1.2 队列的结构 2、队列的创建及初始化 3、入队 4、出队 5、显示队头、队…

番外 1 : Java 环境下的 selenium 搭建

Java 环境下的 selenium 搭建 一 . 下载谷歌浏览器二 . 下载谷歌浏览器驱动2.1 查看谷歌浏览器版本2.2 下载对应版本的谷歌驱动2.3 解压下载好的驱动压缩包 , 将下载好的 chromedriver.exe 放到java 系统环境变量下 三 . 下载 Edge 浏览器的驱动3.1 查看 Edge 浏览器的版本3.2 …

带有密码的Excel只读模式,如何取消?

Excel文件打开之后发现是只读模式&#xff0c;想要退出只读模式&#xff0c;但是只读模式是带有密码的&#xff0c;该如何取消带有密码的excel只读文件呢&#xff1f; 带有密码的只读模式&#xff0c;是设置了excel文件的修改权限&#xff0c;取消修改权限&#xff0c;我们需要…

Go,14周年[译]

国内的双十一购物狂欢已没有了当年的那种热闹与喧嚣&#xff0c;但大洋彼岸的Go团队却始终保持稳中有增的开发和语言演进节奏。今晨Go核心团队的Russ Cox[1]代表Go语言项目团队在Go官博上发表了《Fourteen Years of Go》[2]的博文&#xff0c;纪念Go语言开源14周年[3]&#xff…

FCOS难点记录

FCOS 中有计算 特征图&#xff08;Feature map中的每个特征点到gt_box的左、上、右、下的距离&#xff09; 1、特征点到gt_box框的 左、上、右、下距离计算 x coords[:, 0] # h*w&#xff0c;2 即 第一列y coords[:, 1] l_off x[None, :, None] - gt_boxes[..., 0][:, No…

XXE XML外部实体注入

XXE 外部实体注入 一, 简介 XXE&#xff08;XML External Entity Injection&#xff09;是一种 XML 注入攻击&#xff0c;它利用了 XML 解析器在处理 XML 文档时存在的漏洞。 攻击者通过在 XML 文档中插入外部实体的引用&#xff0c;可以引导 XML 解析器读取攻击者控制的外部…

编程艺术之源:深入了解设计模式和设计原则

深入了解设计模式和设计原则 一、认识设计模式1.1、设计模式是什么&#xff1f;1.2、设计模式是怎么来的&#xff1f;1.3、设计模式解决了什么问题&#xff1f; 二、设计模式的基础2.1、面向对象思想2.2、设计原则 三、如何学习设计模式3.1、明确目的3.2、学习步骤 总结 一、认…

Linux服务器从零开始训练 RT-DETR 改进项目 (Ultralytics) 教程,改进RTDETR算法(包括使用训练、验证、推理教程)

手把手从零开始训练 RT-DETR 改进项目 (Ultralytics版本) 教程,改进RTDETR算法 本文以Linux服务器为例:从零开始使用Linux训练 RT-DETR 算法项目 《芒果剑指 RT-DETR 目标检测算法 改进》 适用于芒果专栏改进RT-DETR算法 文章目录 百度 RT-DETR 算法介绍改进网络代码汇总第…

CAD Exchanger SDK 有什么新内容?

CAD 交换器 3.23.0&#xff0c;2023 年 11 月强调&#xff1a;- 添加了新版本格式的导入&#xff1a;Autodesk Inventor 2023 和 2024、NX 2306。- 文档经过重大修改&#xff0c;使其更易于导航。它也是现在包含有关 SDK、Web Toolkit 和 Manufacturing Toolkit 的全面信息&…