10 個拿來就用的 Shell 腳本實例!

作者:JackTian
文章首發(fā)于公眾號:【杰哥的IT之旅】

腳本 1:該腳本用于讀取Linux系統(tǒng)/etc/passwd文件中的所有/bin/bash作為登錄默認Shell的用戶列表,并提取每個用戶的用戶名。對于這些用戶名進行檢查,是否不等于roottidb。如果用戶名不等于roottidb,則使用usermod命令對該用戶的默認Shell修改為:/sbin/nologin,它通常用于禁止用戶遠程登錄系統(tǒng)。

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

腳本 2:該腳本首先自定義了md5_listmd5_no_hash.txt兩個文件,然后循環(huán)讀取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"

# 循環(huán)讀取md5_list文件中的每一行  
while IFS= read -r md5; do
    # 檢查md5是否在md5_no_hash.txt中  
    if grep -q "$md5" "$md5_no_hash_file"; then
        echo "MD5值 $md5 在 $md5_no_hash_file 中存在"  
    else
        echo "MD5值 $md5 在 $md5_no_hash_file 中不存在"  
    fi
done < "$md5_list_file"

腳本 3:該腳本的主要功能是:遍歷讀取一個包含IP地址的文件,如該文件名為:mmyd,然后對該文件里的每行IP地址執(zhí)行ping操作,并檢查丟包率。如果ping的丟包率為:100%,則輸出該IP不可達的日志;如果ping不存在丟包率,則輸出該IP可達的日志。

#!/bin/bash  
# author:JackTian
# 獲取當前系統(tǒng)時間  
current_time=$(date +"%Y-%m-%d-%H:%M:%S")
# 獲取開始時間戳  
start_time=$(date +%s)

for i in `cat mmyd`  # 這個是逐個讀取該文件里的全部所列出的 IP 地址
do
  ping=`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.log
  else
    echo "$current_time 某某移動-活躍 IP 地址:$i ping 成功了!" >>/opt/jacktian/mmyd_ping.log
  fi
done

# 獲取結束時間戳  
end_time=$(date +%s)

# 計算執(zhí)行時間(秒)  
execution_time_seconds=$((end_time - start_time))

# 將執(zhí)行時間轉換為分鐘和秒  
minutes=$((execution_time_seconds / 60))
seconds=$((execution_time_seconds % 60))

echo "執(zhí)行完畢!該腳本執(zhí)行時間共: $minutes 分鐘 $seconds 秒"

腳本 4:該腳本用于在Linux系統(tǒng)中創(chuàng)建新用戶,并為該用戶設置密碼、省份代碼、目錄權限以及vsftpd服務的配置。

#!/bin/sh

read -p "user:" user
read -p "passd:" pass
read -p "province:" province

useradd $user -d /bigdata/sftp/province/$province/

#passwd $user
echo $pass | passwd --stdin $user

chown $user /bigdata/sftp/province/$province/ -R

chmod 750 /bigdata/sftp/province/$province/ -R

echo $user>>/etc/vsftpd/chroot_list

echo $user>>/etc/vsftpd/user_list

systemctl 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/:該命令將創(chuàng)建一個新用戶,其用戶名為之前輸入的user,其家目錄為:/bigdata/sftp/province/$province/
  • echo $pass | passwd --stdin $user:該命令會將之前輸入的密碼通過標準輸入傳給passwd命令,為新創(chuàng)建的用戶設置密碼
  • chown $user /bigdata/sftp/province/$province/ -R:該命令將更改新創(chuàng)建用戶成為/bigdata/sftp/province/$province/目錄及其子目錄的所有者
  • chmod 750 /bigdata/sftp/province/$province/ -R:該命令會設置/bigdata/sftp/province/$province/目錄及其子目錄的權限為:750,也就是指:用戶有讀、寫、執(zhí)行的權限,而用戶組只有讀和執(zhí)行的權限
  • echo $user>>/etc/vsftpd/chroot_list:該命令會將新創(chuàng)建的用戶添加到vsftpd服務的chroot列表中。這表示當vsftpd服務在運行時,該用戶會被限制在其自己的目錄中,不能訪問系統(tǒng)的其他目錄
  • echo $user>>/etc/vsftpd/user_list:該命令會將新創(chuàng)建的用戶添加到vsftpd服務的用戶列表中。這表示當vsftpd服務在運行時,這個用戶可以登錄并訪問系統(tǒng)。
  • systemctl restart vsftpd.service:重啟vsftpd服務,使之前的所有配置生效

腳本 5:該腳本用于在Linux系統(tǒng)中創(chuàng)建新用戶,并為該用戶設置密碼、省份代碼、idcid、目錄權限以及vsftpd服務的配置。跟如上腳本 4 略有差異。

#!/bin/sh

read -p "user:" user
read -p "passd:" pass
read -p "province:" province
read -p "idcid:" idcid

mkdir -p /bigdata/sftp/province/$province/$idcid

useradd $user -d /bigdata/sftp/province/$province/$idcid

#passwd $user
echo $pass | passwd --stdin $user

chown $user /bigdata/sftp/province/$province/$idcid/ -R

chmod 750 /bigdata/sftp/province/$province/$idcid -R

echo $user>>/etc/vsftpd/chroot_list

echo $user>>/etc/vsftpd/user_list

systemctl restart vsftpd.service

腳本 6:該腳本首先自定義了省份編碼列表為多個目錄路徑,循環(huán)遍歷自定義的省份編碼列表。對于每一個省份編碼,腳本將其分割為三個部分:省份編碼、運營商和數(shù)據(jù)上報類型。然后進入對應的省份目錄。

執(zhí)行du -sh 2023-10-* 命令,查詢所有以2023-10-開頭目錄的大小,并將結果輸出到一個名為$province_code_file_size.txt的文件中。

執(zhí)行for循環(huán),循環(huán)遍歷所有子目錄并查詢每個子目錄中的文件數(shù)量,然后將結果輸出到一個名為$province_code_file_count.txt的文件中。

最后,腳本會返回到上級目錄,以便對下一個省份編碼下的文件大小及文件數(shù)量進行查詢。所有的查詢結果將保存在/opt/目錄下的以省份編碼命名的文件中。

#!/bin/bash  
# @Time    : 2023/10/30  
# @Author  : jacktian  
# @Desc    : 這是一個適用于某臺服務器循環(huán)查詢特定省份、特定運營商、特定數(shù)據(jù)上報類型的文件大小及文件個數(shù)的腳本。  
  
# 定義省份編碼列表  
provinces=("110000/dianxin/1024" "120000/liantong/1024" "130000/yidong/1024")  
  
# 遍歷省份編碼列表  
for province in "${provinces[@]}"; do  
  
    # 分割省份編碼、運營商和數(shù)據(jù)上報類型
    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  
  
    # 執(zhí)行du命令查詢文件大小,并將結果輸出到對應的省份編碼txt文件  
    du -sh 2023-10-* >> /opt/"$province_code"_file_size.txt  
  
    # 執(zhí)行for命令查詢?nèi)掌谖募€數(shù),并將結果輸出到對應的省份編碼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:該腳本用于循環(huán)查詢特定省份、特定數(shù)據(jù)上報類型的文件大小及文件個數(shù)。跟如上腳本 6 略有差異。

#!/bin/bash
# @Time    : 2023/10/30
# @Author  : jacktian
# @Desc    : 這是一個適用于某臺服務器循環(huán)查詢特定省份、特定數(shù)據(jù)上報類型的文件大小及文件個數(shù)的腳本。 
  
# 定義省份編碼列表  
provinces=("110000" "120000" "130000")  
  
# 遍歷省份編碼列表  
for province in "${provinces[@]}"; do  
  
    # 進入省份目錄  
    cd /bigdata/sftp/province/$province/1024
  
    # 執(zhí)行du命令查詢文件大小,并將結果輸出到對應的省份編碼txt文件  
    du -sh 2023-10-* >> /opt/"$province"_file_size.txt  
  
    # 執(zhí)行for命令查詢?nèi)掌谖募€數(shù),并將結果輸出到對應的省份編碼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 文件在特定時間段內(nèi)的修改情況,并把結果保存在日志中。

#!/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時間段內(nèi)修改的文件,并輸出它們的修改時間和大小信息,將結果追加到指定的輸出文件中。

腳本 9:該腳本主要用于監(jiān)控系統(tǒng)資源使用情況,獲取并記錄了磁盤使用情況、CPU空閑情況、內(nèi)存空閑情況和進程總數(shù),并將這些打印信息輸出到某個日志文件中。

#!/bin/bash

date=$(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、打印內(nèi)存空閑情況
MEMORY=$(free -h | awk 'BEGIN {printf"內(nèi)存空閑使用率:"} NR==2 {print $4}')

#4、打印進程總數(shù)
JINCHENG=$(ps aux | wc -l | awk 'BEGIN {printf"進程總數(shù):"} {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.log

exit

done
  • date=$(date +%Y-%m-%d-%H:%M:%S):獲取當前日期和時間,格式為:年-月-日-時:分:秒
  • DISK_1、DISK_2、DISK_3:該變量用于獲取磁盤的使用情況。使用df -h命令獲取磁盤信息,然后使用awk提取出使用率和文件系統(tǒng)名稱。grep用于篩選出特定名稱的磁盤(如:appslog 和 bigdata)
  • CPU:該變量獲取CPU的空閑使用率。使用top -n 1命令獲取系統(tǒng)狀態(tài),然后使用grepawk提取出CPU的空閑使用率
  • MEMORY:該變量獲取了內(nèi)存的空閑使用率。使用free -h命令獲取內(nèi)存信息,然后使用awk提取出空閑內(nèi)存的使用率
  • JINCHENG:該變量獲取了系統(tǒng)的進程總數(shù)。使用ps aux命令獲取進程信息,然后使用wc -l命令統(tǒng)計行數(shù),即進程總數(shù)
  • echo -e "\n $date\n\n $DISK_1\n\n $DISK_3\n\n $CPU\n\n $MEMORY\n\n $JINCHENG\n":這部分將上述所有的打印信息拼接在一起,并輸出到日志文件中

腳本 10:該腳本主要用于定期循環(huán)連接 FTP 服務器的訪問情況,當異常時通過企業(yè)微信機器人發(fā)送告警信息。

#!/bin/bash

# FTP IP 列表
FTP_IPS=("IP_1" "IP_2" "IP_3")

#企業(yè)微信機器人地址(需要根據(jù)實際機器人地址配置)
WEBHOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXX

#循環(huán)執(zhí)行檢測方法

while :
do

       date=$(date +%Y-%m-%d-%H:%M:%S)

# 循環(huán)遍歷 FTP IP 列表
for ip in "${FTP_IPS[@]}"
do
  # 連接 FTP 服務器
  ftp -n $ip <<EOF

  # 退出 FTP 服務器
  exit

EOF

  # 檢查上一條命令的退出狀態(tài)碼
  if [ $? -ne 0 ];
      then
  
  # 如果退出狀態(tài)碼不為 0,則表示命令執(zhí)行失敗,發(fā)送異常的告警到企業(yè)微信機器人
    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.log

    else
  # 如果退出狀態(tài)碼為 0,則表示命令執(zhí)行成功,不發(fā)送正常的告警到企業(yè)微信機器人
    echo "$date FTP 訪問正常:$ip" >>/opt/ftp_check/ftp_check.log
    fi
done
exit
done
  • FTP_IPS:該變量中包含了多個FTP服務器的IP地址
  • WEBHOOK_URL:該變量為企業(yè)微信機器人的地址,需要將 XXX 部分替換為實際的企業(yè)微信機器人的key
  • 使用了while循環(huán)來定期執(zhí)行檢測。在每次循環(huán)中,將獲取當前日期和時間,遍歷FTP_IPS列表。對于列表中的每個IP地址,腳本會嘗試連接到FTP服務器
  • 如果連接命令ftp -n $ip執(zhí)行失敗,則退出狀態(tài)碼不為:0,則表示FTP訪問異常。在這種情況下,腳本會發(fā)送一個異常告警到企業(yè)微信機器人,并將相關信息寫入日志文件
  • 如果連接命令執(zhí)行成功,退出狀態(tài)碼為:0,則表示FTP訪問正常,腳本將不發(fā)送告警信息,只是在日志中記錄正常訪問的信息

以上就是今天所要分享的全部內(nèi)容了。

如果你覺得這篇文章對你有點用的話,為本文點個贊 、留個言或者轉發(fā)一下,讓更多的朋友看到,因為這將是我持續(xù)輸出更多優(yōu)質文章的最強動力!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容