Linux 實用運維腳本分享

#查看殭屍進程
ps -al | gawk '{print $2,$4}' | grep Z
# 匹配電子郵件的地址
cat index.html | egrep -o "[A-Za-z0-9._]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}" > ans.txt
#匹配http URL
cat index.html | egrep -o "http://[A-Za-z0-9.]+\.[a-zA-Z]{2,3}" > ans.txt 
#純文本形式下載網頁
lynx -dump www.baidu.com > plain.txt
#只打印HTTP頭部信息,無須遠程下載文件
curl --head www.baidu.com
#使用POST提交數據
curl -d "param2=nickwolfe¶m2=12345" http://www.linuxidc.com/login.cgi
#顯示分組途經的網關
traceroute www.baidu.com
#列出系統中的開放端口以及運行在端口上的服務
lsof -i 
#nc命令建立socket連接
#設置監聽 nc -l 5555
#連接到套接字 nc 192.0.0.1 5555
#快速文件傳輸
#接收端 nc -l 5555 > destination_filename
#發送端 nc 192.0.0.1 5555 < source_filename
#找出指定目錄最大的n個文件
du -ak target_dir | sort -nrk 1 | head -n 4
# du中a爲遞歸,k爲kb;sort中n爲數字,r爲降序,k指定列
#向終端中的所有登陸用戶發送廣播信息
cat message.txt | wall
#創建新的screen窗口
screen
#打印所有的.txt和.pdf文件
find . \( -name "*.txt" -o -name "*.pdf" \) -print
# -exec command {} \;是連用的,所有符合的都會放置在{}中,去執行command 
#將文件分割成多個大小爲10kb的文件
split -b 10k data.file 
#打印兩個文件的交集
comm A.txt B.txt -3 | sed 's/^\t//'
#sed移除空白行
sed '/^$/d' file

mysql 備份

#!/bin/bash
set -e
USER="backup"
PASSWORD="backup"
# 數據庫數據目錄 #
DATA_DIR="/data/mysql"
BIN_INDEX=$DATA_DIR"/mysql-bin.index"
# 備份目錄 #
BACKUP_DIR="/data/backup/mysql"
BACKUP_LOG="/var/log/mysql/backup.log"
DATE=`date +"%Y%m%d"`
TIME=`date +"%Y%m%d%H"`
LOG_TIME=`date +"%Y-%m-%d %H:%M:%S"`
DELETE_BINLOG_TIME="7 day"
INCREMENT_INTERVAL="3 hour"
note() {
    printf "[$LOG_TIME] note: $*\n" >> $BACKUP_LOG;
}
warning() {
    printf "[$LOG_TIME] warning: $*\n" >> $BACKUP_LOG;
}
error() {
    printf "[$LOG_TIME] error: $*\n" >> $BACKUP_LOG;
    exit 1;
}
full_backup() {
    local dbs=`ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}'`
    for db in $dbs
    do
        local backup_dir=$BACKUP_DIR"/full/"$db
        local file$DATE
        local backup_file=$backup_dir"/"$filename".sql"
        if [ ! -d $backup_dir ]
        then
            mkdir -p $backup_dir || { error "創建數據庫 $db 全量備份目錄 $backup_dir 失敗"; continue; }
            note "數據庫 $db 全量備份目錄 $backup_dir  不存在,創建完成";
        fi
        note "full backup $db start ..."
        mysqldump --user=${USER} --password=${PASSWORD} --flush-logs --skip-lock-tables --quick $db > $backup_file || { warning "數據庫 $db 備份失敗"; continue; }
        cd $backup_dir
        tar -cPzf $filename".tar.gz" $filename".sql"
        rm -f $backup_file
        chown -fR mysql:mysql $backup_dir
        note "數據庫 $db 備份成功";
        note "full backup $db end."
    done
}
increment_backup() {
    local StartTime=`date "-d $INCREMENT_INTERVAL ago" +"%Y-%m-%d %H:%M:%S"`
    local DELETE_BINLOG_END_TIME=`date "-d $DELETE_BINLOG_TIME ago" +"%Y-%m-%d %H:%M:%S"`
    local dbs=`ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}'`
    mysql -u$USER -p$PASSWORD -e "purge master logs before '$DELETE_BINLOG_END_TIME'" && note "delete $DELETE_BINLOG_TIME days before log";
    filename=`cat $BIN_INDEX | awk -F "/" '{print $2}'`
    for i in $filename
    do
        for db in $dbs
        do
            local backup_dir=$BACKUP_DIR"/increment/"$db
            local file$TIME
            local backup_file=$backup_dir"/"$filename".sql"
            if [ ! -d $backup_dir ]
            then
                mkdir -p $backup_dir || { error "創建數據庫 $db 增量備份目錄 $backup_dir 失敗"; continue; }
                note "數據庫 $db 增量備份目錄 $backup_dir  不存在,創建完成";
            fi
            note "increment backup $db form time $StartTime start ..."
            mysqlbinlog -d $db --start-datetime="$StartTime" $DATA_DIR/$i >> $backup_file || { warning "數據庫 $db 備份失敗"; continue; }
            note "increment backup $db end."
        done
    done
    for db in $dbs
    do
        local backup_dir=$BACKUP_DIR"/increment/"$db
        local file$TIME
        local backup_file=$backup_dir"/"$filename".sql"
        cd $backup_dir
        tar -cPzf $filename".tar.gz" $filename".sql"
        rm -f $backup_file
        note "數據庫 $db 備份成功";
    done
}
case "$1" in
    full)
        full_backup
    ;;
    increment)
        increment_backup
    ;;
    *)
        exit 2
    ;;
esac
exit 1

目錄備份

#!/bin/bash
#
#
# 時間
DATE=$(date '+%Y-%m-%d_%H_%M_%S')
# 備份目錄 
BACKUPDIR="/home/backups"
# 需要備份的目錄
SORFILE=/opt
# 目標文件名
DESFILE=/home/backups/$SORFILE.$(date '+%Y-%m-%d_%H_%M_%S').zip
[ ! -d $BACKUPDIR ] && mkdir -p $BACKUPDIR
cd $BACKUPDIR
echo "start backup $SORFILE ..."
sleep 3
#echo "$DESFILE"
#tar cvf $DESFILE $SORFILE
#gzip -f .zip $DESFILE
zip -r $DESFILE $SORFILE &>/dev/null
if [ "$?" == "0" ]
then
   echo $(date +%Y-%m-%d)" zip sucess">>backup.log
else
   echo $(date +%Y-%m-%d)" zip failed">>backup.log
   exit 0
fi
# 刪除3天前的備份
find $BACKUPDIR -type f -ctime +3 | xargs rm -rf

PING 查詢

#!/bin/bash
#用途:根據網絡配置對網絡地址192.168.0進行修改,檢查是否是活動狀態
#{start..end}shell擴展生成一組地址
for ip in 192.168.0.{1..255}
do 
    (
    ping $ip -c 2 &> /dev/null 
    # > 標準輸出重定向,和1>一致
    # 2>&1 將標準錯誤輸出 重定向 到標準輸出
    # &>file 將標準輸出和標準錯誤輸出都重定向到文件filename中
    if [ $? -eq 0 ];then
        echo $ip is alive
    fi
    )&
done
wait
#並行ping,加速

磁盤 IO 檢查

##iostat是查看磁盤活動統計情況
##顯示所有設備負載情況 r/s:  每秒完成的讀 I/O 設備次數。即 rio/s;w/s:  每秒完成的寫 I/O 設備次數。即 wio/s等
iostat 
##每隔2秒刷新磁盤IO信息,並且每次顯示3次
iostat 2 3
#顯示某個磁盤的IO信息
iostat -d sda1
##顯示tty和cpu信息
iostat -t
##以M爲單位顯示磁盤IO信息
iostat -m
##查看TPS和吞吐量信息  kB_read/s:每秒從設備(drive expressed)讀取的數據量;kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;kB_read:讀取的總數據量;kB_wrtn:寫入的總數量數據量;
iostat -d -k 1 1
#查看設備使用率(%util)、響應時間(await)
iostat -d -x -k 1 1
#查看CPU狀態
iostat -c 1 3
#統計進程(pid)的stat,進程的stat自然包括進程的IO狀況
pidstat
#只顯示IO
pidstat -d  1 
#-d IO 信息,-r 缺頁及內存信息-u CPU使用率-t 以線程爲統計單位1  1秒統計一次
pidstat -u -r -d -t 1
#文件級IO分析,查看當前文件由哪些進程打開
lsof   
ls /proc/pid/fd
#利用 sar 報告磁盤 I/O 信息DEV 正在監視的塊設備 tps 每秒鐘物理設備的 I/O 傳輸總量 rd_sec/s 每秒從設備讀取的扇區數量 wr_sec/s 每秒向設備寫入的扇區數量 avgrq-sz I/O 請求的平均扇區數
#avgqu-sz I/O 請求的平均隊列長度 await I/O 請求的平均等待時間,單位爲毫秒 svctm I/O 請求的平均服務時間,單位爲毫秒 %util I/O 請求所佔用的時間的百分比,即設備利用率
sar -pd 10 3 
#iotop  top的io版
iotop
#查看頁面緩存信息 其中的Cached 指用於pagecache的內存大小(diskcache-SwapCache)。隨着寫入緩存頁,Dirty 的值會增加 一旦開始把緩存頁寫入硬盤,Writeback的值會增加直到寫入結束。
cat /proc/meminfo 
#查看有多少個pdflush進程 Linux 用pdflush進程把數據從緩存頁寫入硬盤
#pdflush的行爲受/proc/sys/vm中的參數的控制/proc/sys/vm/dirty_writeback_centisecs (default 500): 1/100秒, 多長時間喚醒pdflush將緩存頁數據寫入硬盤。默認5秒喚醒2個(更多個)線程。如果wrteback的時間長於dirty_writeback_centisecs的時間,可能會出問題
cat /proc/sys/vm/nr_pdflush_threads
#查看I/O 調度器
#調度算法
#noop anticipatory deadline [cfq] 
#deadline :    deadline 算法保證對既定的IO請求以最小的延遲時間。
#anticipatory:有個IO發生後,如果又有進程請求IO,則產生一個默認6ms猜測時間,猜測下一個進程請求IO是幹什麼。這對於隨機讀取會造成較大的延時。對數據庫應用很糟糕,而對於Web Server等則會表現不錯。
#cfq:        對每個進程維護一個IO隊列,各個進程發來的IO請求會被cfq以輪循方式處理,對每一個IO請求都是公平。適合離散讀的應用。
#noop:        對所有IO請求都用FIFO隊列形式處理。默認IO不會存在性能問題。
cat /sys/block/[disk]/queue/scheduler
#改變IO調度器
$ echo deadline > /sys/block/sdX/queue/scheduler
#提高調度器請求隊列的
$ echo 4096 > /sys/block/sdX/queue/nr_requests

性能相關

#查看當前系統load
uptime
#查看系統狀態和每個進程的系統資源使用狀況
top
#可視化顯示CPU的使用狀況
htop
#查看每個CPU的負載信息
mpstat -P ALL 1
#每隔1秒查看磁盤IO的統計信息
iostat -xkdz 1
#每隔一秒查看虛擬內存的使用信息
vmstat 1
#查看內存使用統計信息
free
#查看網絡使用信息
nicstat -z 1
#類似vmstat的顯示優化的工具
dstat 1
#查看系統活動狀態,比如系統分頁統計,塊設備IO統計等
sar
#網絡連接狀態查看
netstat -s
#進程資源使用信息查看
pidstat 1
pidstat -d 1
#查看某個進程的系統調用信息 -p後面是進程id,-tttT 進程系統後的系統調用時間
strace -tttT -p 12670
#統計IO設備輸入輸出的系統調用信息
strace -c dd if=/dev/zero of=/dev/null bs=512 count=1024k
#tcpdump 查看網絡數據包
tcpdump -nr /tmp/out.tcpdump
#塊設備的讀寫事件信息統計
btrace /dev/sdb 
#iotop查看某個進程的IO操作統計信息
iotop -bod5
#slabtop 查看內核 slab內存分配器的使用信息
slabtop -sc
#系統參數設置
sysctl -a
#系統性能指標統計信息
perf stat gzip file1
#系統cpu活動狀態查看
perf record -a -g -F 997 sleep 10

進程相關

## processes  進程管理
##ps查看當前系統執行的線程列表,進行瞬間狀態,不是連續狀態,連續狀態需要使用top名稱查看  更多常用參數請使用 man ps查看
ps
##顯示所有進程詳細信息
ps aux
##-u 顯示某個用戶的進程列表
ps -f -u www-data 
## -C 通過名字或者命令搜索進程
ps -C apache2
## --sort  根據進程cpu使用率降序排列,查看前5個進程  -pcpu表示降序  pcpu升序
ps aux --sort=-pcpu | head -5 
##-f 用樹結構顯示進程的層次關係,父子進程情況下
ps -f --forest -C apache2 
##顯示一個父進程的所有子進程
ps -o pid,uname,comm -C apache2
ps --ppid 2359 
##顯示一個進程的所有線程  -L 參數
ps -p 3150 -L 
##顯示進程的執行時間 -o參數
ps -e -o pid,comm,etime 
##watch命令可以用來實時捕捉ps顯示進程
watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15' 
##jobs 查看後臺運行的進程  jobs命令執行的結果,+表示是一個當前的作業,減號表是是一個當前作業之後的一個作業,jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated,但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識;也就是說,jobs命令顯示的是當前shell環境中所起的後臺正在運行或者被掛起的任務信息
jobs
##查看後臺運營的進程號
jobs -p
##查看現在被終止或者退出的進程號
jobs -n
##kill命令 終止一個前臺進程可以使用Ctrl+C鍵   kill  通過top或者ps獲取進程id號  kill [-s 信號 | -p ] [ -a ] 進程號 ...
##發送指定的信號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。關閉進程號12的進程
kill 12
##等同於在前臺運行PID爲123的進程時按下Ctrl+C鍵
kill -2 123
##如果任無法終止該程序可用“-KILL” 參數,其發送的信號爲SIGKILL(9) ,將強制結束進程  
kill -9 123
##列出所有信號名稱
##HUP    1    終端斷線
##INT     2    中斷(同 Ctrl + C)
##QUIT    3    退出(同 Ctrl + \)
##TERM   15    終止
##KILL    9    強制終止
##CONT   18    繼續(與STOP相反, fg/bg命令)
##STOP    19    暫停(同 Ctrl + Z)
kill -l
##得到指定信號的數值
kill -l KILL
##殺死指定用戶所有進程
kill -u peidalinux
kill -9 $(ps -ef | grep peidalinux) 
##將後臺中的命令調至前臺繼續運行  將進程123調至前臺執行
fg 123
##將一個在後臺暫停的命令,變成繼續執行
bg  123
##該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。nohup就是不掛起的意思  下面輸出被重定向到myout.file文件中
nohup command > myout.file 2>&1 &
##at:計劃任務,在特定的時間執行某項工作,在特定的時間執行一次。
## 格式:at HH:MM YYYY-MM-DD //HH(小時):MM(分鐘) YYYY(年)-MM(月份)-DD(日)
##HH[am pm]+D(天) days //HH(小時)[am(上午)pm(下午)]+days(天)
at 12:00(時間) //at命令設定12:00執行一項操作
#at>useradd aaa //在at命令裏設定添加用戶aaa
#ctrl+d //退出at命令
#tail -f /etc/passwd //查看/etc/passwd文件後十行是否增加了一個用戶aaa
##計劃任務設定後,在沒有執行之前我們可以用atq命令來查看系統沒有執行工作任務。
atq
##啓動計劃任務後,如果不想啓動設定好的計劃任務可以使用atrm命令刪除。
atrm 1 //刪除計劃任務1
##pstree命令:列出當前的進程,以及它們的樹狀結構  格式:pstree [選項] [pid|user]
pstree
##nice命令:改變程序執行的優先權等級 應用程序優先權值的範圍從-20~19,數字越小,優先權就越高。一般情況下,普通應用程序的優先權值(CPU使用權值)都是0,如果讓常用程序擁有較高的優先權等級,自然啓動和運行速度都會快些。需要注意的是普通用戶只能在0~19之間調整應用程序的優先權值,只有超級用戶有權調整更高的優先權值(從-20~19)。
nice [-n <優先等級>][--help][--version][命令]
nice -n 5 ls
##sleep命令:使進程暫停執行一段時間
date;sleep 1m;date
##renice命令 renice命令允許用戶修改一個正在運行進程的優先權。利用renice命令可以在命令執行時調整其優先權。
##其中,參數number與nice命令的number意義相同。(1) 用戶只能對自己所有的進程使用renice命令。(2) root用戶可以在任何進程上使用renice命令。(3) 只有root用戶才能提高進程的優先權
renice -5 -p 5200  #PID爲5200的進程nice設爲-5 
##pmap命令用於顯示一個或多個進程的內存狀態。其報告進程的地址空間和內存狀態信息 #pmap PID 
pmap 20367

javadump.sh

#!/bin/sh
DUMP_PIDS=`ps  --no-heading -C java -f --width 1000 |awk '{print $2}'`
if [ -z "$DUMP_PIDS" ]; then
    echo "The server $HOST_NAME is not started!"
    exit 1;
fi
DUMP_ROOT=~/dump
if [ ! -d $DUMP_ROOT ]; then
  mkdir $DUMP_ROOT
fi
DUMP_DATE=`date +%Y%m%d%H%M%S`
DUMP_DIR=$DUMP_ROOT/dump-$DUMP_DATE
if [ ! -d $DUMP_DIR ]; then
  mkdir $DUMP_DIR
fi
for PID in $DUMP_PIDS ; do
#Full thread dump 用來查線程佔用,死鎖等問題
  $JAVA_HOME/bin/jstack $PID > $DUMP_DIR/jstack-$PID.dump 2>&1
  echo -e ".\c"
#打印出一個給定的Java進程、Java core文件或遠程Debug服務器的Java配置信息,具體包括Java系統屬性和JVM命令行參數。
  $JAVA_HOME/bin/jinfo $PID > $DUMP_DIR/jinfo-$PID.dump 2>&1
  echo -e ".\c"
#jstat能夠動態打印jvm(Java Virtual Machine Statistics Monitoring Tool)的相關統計信息。如young gc執行的次數、full gc執行的次數,各個內存分區的空間大小和可使用量等信息。
  $JAVA_HOME/bin/jstat -gcutil $PID > $DUMP_DIR/jstat-gcutil-$PID.dump 2>&1
  echo -e ".\c"
  $JAVA_HOME/bin/jstat -gccapacity $PID > $DUMP_DIR/jstat-gccapacity-$PID.dump 2>&1
  echo -e ".\c"
#未指定選項時,jmap打印共享對象的映射。對每個目標VM加載的共享對象,其起始地址、映射大小及共享對象文件的完整路徑將被打印出來,  
  $JAVA_HOME/bin/jmap $PID > $DUMP_DIR/jmap-$PID.dump 2>&1
  echo -e ".\c"
#-heap打印堆情況的概要信息,包括堆配置,各堆空間的容量、已使用和空閒情況  
  $JAVA_HOME/bin/jmap -heap $PID > $DUMP_DIR/jmap-heap-$PID.dump 2>&1
  echo -e ".\c"
#-dump將jvm的堆中內存信息輸出到一個文件中,然後可以通過eclipse memory analyzer進行分析
#注意:這個jmap使用的時候jvm是處在假死狀態的,只能在服務癱瘓的時候爲了解決問題來使用,否則會造成服務中斷。
  $JAVA_HOME/bin/jmap -dump:format=b,file=$DUMP_DIR/jmap-dump-$PID.dump $PID 2>&1
  echo -e ".\c"
#顯示被進程打開的文件信息
if [ -r /usr/sbin/lsof ]; then
  /usr/sbin/lsof -p $PID > $DUMP_DIR/lsof-$PID.dump
  echo -e ".\c"
  fi
done
#主要負責收集、彙報與存儲系統運行信息的。
if [ -r /usr/bin/sar ]; then
/usr/bin/sar > $DUMP_DIR/sar.dump
echo -e ".\c"
fi
#主要負責收集、彙報與存儲系統運行信息的。
if [ -r /usr/bin/uptime ]; then
/usr/bin/uptime > $DUMP_DIR/uptime.dump
echo -e ".\c"
fi
#內存查看
if [ -r /usr/bin/free ]; then
/usr/bin/free -t > $DUMP_DIR/free.dump
echo -e ".\c"
fi
#可以得到關於進程、內存、內存分頁、堵塞IO、traps及CPU活動的信息。
if [ -r /usr/bin/vmstat ]; then
/usr/bin/vmstat > $DUMP_DIR/vmstat.dump
echo -e ".\c"
fi
#報告與CPU相關的一些統計信息
if [ -r /usr/bin/mpstat ]; then
/usr/bin/mpstat > $DUMP_DIR/mpstat.dump
echo -e ".\c"
fi
#報告與IO相關的一些統計信息
if [ -r /usr/bin/iostat ]; then
/usr/bin/iostat > $DUMP_DIR/iostat.dump
echo -e ".\c"
fi
#報告與網絡相關的一些統計信息
if [ -r /bin/netstat ]; then
/bin/netstat > $DUMP_DIR/netstat.dump
echo -e ".\c"
fi
echo "OK!"

常用工具安裝

#!/usr/bin/env bash
# ---------------------------------------------------------------------------------
# 控制檯顏色
BLACK="\033[1;30m"
RED="\033[1;31m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
BLUE="\033[1;34m"
PURPLE="\033[1;35m"
CYAN="\033[1;36m"
RESET="$(tput sgr0)"
# ---------------------------------------------------------------------------------
printf "${BLUE}\n"
cat << EOF
###################################################################################
# 安裝常用命令工具
# 命令工具清單如下:
# 核心工具:df、du、chkconfig
# 網絡工具:ifconfig、netstat、route、iptables
# IP工具:ip、ss、ping、tracepath、traceroute
# DNS工具:dig、host、nslookup、whois
# 端口工具:lsof、nc、telnet
# 下載工具:curl、wget
# 編輯工具:emacs、vim
# 流量工具:iftop、nethogs
# 抓包工具:tcpdump
# 壓縮工具:unzip、zip
# 版本控制工具:git、subversion
#
###################################################################################
EOF
printf "${RESET}\n"
printf "\n${GREEN}>>>>>>>>> 安裝常用命令工具開始${RESET}\n"
# 核心工具
printf "\n${CYAN}>>>> install coreutils(df、du)${RESET}\n"
yum install -y coreutils
printf "\n${CYAN}>>>> install chkconfig${RESET}\n"
yum install -y chkconfig
# 網絡工具
printf "\n${CYAN}>>>> install net-tools(ifconfig、netstat、route)${RESET}\n"
yum install -y net-tools
printf "\n${CYAN}>>>> install iptables${RESET}\n"
yum install -y iptables
# IP工具
printf "\n${CYAN}>>>> install iputils(ping、tracepath)${RESET}\n"
yum install -y iputils
printf "\n${CYAN}>>>> install traceroute${RESET}\n"
yum install -y traceroute
printf "\n${CYAN}>>>> install iproute(ip、ss)${RESET}\n"
yum install -y iproute
# 端口工具
printf "\n${CYAN}>>>> install lsof${RESET}\n"
yum install -y lsof
printf "\n${CYAN}>>>> install nc${RESET}\n"
yum install -y nc
printf "\n${CYAN}>>>> install netstat${RESET}\n"
yum install -y netstat
# DNS工具
printf "\n${CYAN}>>>> install bind-utils(dig、host、nslookup)${RESET}\n"
yum install -y bind-utils
printf "\n${CYAN}>>>> install whois${RESET}\n"
yum install -y whois
# 下載工具
printf "\n${CYAN}>>>> install curl${RESET}\n"
yum install -y curl
printf "\n${CYAN}>>>> install wget${RESET}\n"
yum install -y wget
# 編輯工具
printf "\n${CYAN}>>>> install emacs${RESET}\n"
yum install -y emacs
printf "\n${CYAN}>>>> install vim${RESET}\n"
yum install -y vim
# 流量工具
printf "\n${CYAN}>>>> install iftop${RESET}\n"
yum install -y iftop
printf "\n${CYAN}>>>> install nethogs${RESET}\n"
yum install -y nethogs
# 抓包工具
printf "\n${CYAN}>>>> install tcpdump${RESET}\n"
yum install -y tcpdump
# 壓縮工具
printf "\n${CYAN}>>>> install unzip${RESET}\n"
yum install -y unzip
# 版本控制工具
printf "\n${CYAN}>>>> install git${RESET}\n"
yum install -y git
printf "\n${CYAN}>>>> install subversion${RESET}\n"
yum install -y subversion
printf "\n${GREEN}<<<<<<<< 安裝常用命令工具結束${RESET}\n"

常用 lib 庫安裝

#!/usr/bin/env bash
# ---------------------------------------------------------------------------------
# 控制檯顏色
BLACK="\033[1;30m"
RED="\033[1;31m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
BLUE="\033[1;34m"
PURPLE="\033[1;35m"
CYAN="\033[1;36m"
RESET="$(tput sgr0)"
# ---------------------------------------------------------------------------------
printf "${BLUE}\n"
cat << EOF
###################################################################################
# 安裝常見 lib
# 如果不知道命令在哪個 lib,可以使用 yum search xxx 來查找
# lib 清單如下:
# gcc gcc-c++ kernel-devel libtool
# openssl openssl-devel
# zlib zlib-devel
# pcre
###################################################################################
EOF
printf "${RESET}\n"
printf "\n${GREEN}>>>>>>>>> 安裝常見 lib 開始${RESET}\n"
printf "\n${CYAN}>>>> install gcc gcc-c++ kernel-devel libtool${RESET}\n"
yum -y install make gcc gcc-c++ kernel-devel libtool
printf "\n${CYAN}>>>> install openssl openssl-devel${RESET}\n"
yum -y install make openssl openssl-devel
printf "\n${CYAN}>>>> install zlib zlib-devel${RESET}\n"
yum -y install make zlib zlib-devel
printf "\n${CYAN}>>>> install pcre${RESET}\n"
yum -y install pcre
printf "\n${GREEN}<<<<<<<< 安裝常見 lib 結束${RESET}\n"

系統檢查腳本

#!/usr/bin/env bash
##############################################################################
# console color
C_RESET="$(tput sgr0)"
C_BLACK="\033[1;30m"
C_RED="\033[1;31m"
C_GREEN="\033[1;32m"
C_YELLOW="\033[1;33m"
C_BLUE="\033[1;34m"
C_PURPLE="\033[1;35m"
C_CYAN="\033[1;36m"
C_WHITE="\033[1;37m"
##############################################################################
printf "${C_PURPLE}"
cat << EOF
###################################################################################
# 系統信息檢查腳本
###################################################################################
EOF
printf "${C_RESET}"
[[ $(id -u) -gt 0 ]] && echo "請用root用戶執行此腳本!" && exit 1
sysversion=$(rpm -q centos-release | cut -d- -f3)
double_line="==============================================================="
line="----------------------------------------------"
# 打印頭部信息
printHeadInfo() {
  cat << EOF
+---------------------------------------------------------------------------------+
|                           歡迎使用 【系統信息檢查腳本】                          |
+---------------------------------------------------------------------------------+
EOF
}
# 打印尾部信息
printFootInfo() {
  cat << EOF
+---------------------------------------------------------------------------------+
|                            腳本執行結束,感謝使用!|
+---------------------------------------------------------------------------------+
EOF
}
options=( "獲取系統信息" "獲取服務信息" "獲取CPU信息" "獲取系統網絡信息" "獲取系統內存信息" "獲取系統磁盤信息" "獲取CPU/內存佔用TOP10" "獲取系統用戶信息" "輸出所有信息" "退出" )
printMenu() {
  printf "${C_BLUE}"
  printf "主菜單:\n"
  for i in "${!options[@]}"; do
    index=`expr ${i} + 1`
    val=`expr ${index} % 2`
    printf "\t(%02d) %-30s" "${index}" "${options[$i]}"
    if [[ ${val} -eq 0 ]]; then
      printf "\n"
    fi
  done
  printf "${C_BLUE}請輸入需要執行的指令:\n"
  printf "${C_RESET}"
}
# 獲取系統信息
get_systatus_info() {
  sys_os=$(uname -o)
  sys_release=$(cat /etc/redhat-release)
  sys_kernel=$(uname -r)
  sys_hostname=$(hostname)
  sys_selinux=$(getenforce)
  sys_lang=$(echo $LANG)
  sys_lastreboot=$(who -b | awk '{print $3,$4}')
  sys_runtime=$(uptime | awk '{print  $3,$4}' | cut -d, -f1)
  sys_time=$(date)
  sys_load=$(uptime | cut -d: -f5)
  cat << EOF
【系統信息】
系統: ${sys_os}
發行版本:   ${sys_release}
系統內核:   ${sys_kernel}
主機名:    ${sys_hostname}
selinux狀態:  ${sys_selinux}
系統語言:   ${sys_lang}
系統當前時間: ${sys_time}
系統最後重啓時間:   ${sys_lastreboot}
系統運行時間: ${sys_runtime}
系統負載:   ${sys_load}
EOF
}
# 獲取CPU信息
get_cpu_info() {
  Physical_CPUs=$(grep "physical id" /proc/cpuinfo | sort | uniq | wc -l)
  Virt_CPUs=$(grep "processor" /proc/cpuinfo | wc -l)
  CPU_Kernels=$(grep "cores" /proc/cpuinfo | uniq | awk -F ': ' '{print $2}')
  CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq)
  CPU_Arch=$(uname -m)
  cat << EOF
【CPU信息】
物理CPU個數:$Physical_CPUs
邏輯CPU個數:$Virt_CPUs
每CPU核心數:$CPU_Kernels
CPU型號:$CPU_Type
CPU架構:$CPU_Arch
EOF
}
# 獲取服務信息
get_service_info() {
  port_listen=$(netstat -lntup | grep -v "Active Internet")
  kernel_config=$(sysctl -p 2> /dev/null)
  if [[ ${sysversion} -gt 6 ]]; then
    service_config=$(systemctl list-unit-files --type=service --state=enabled | grep "enabled")
    run_service=$(systemctl list-units --type=service --state=running | grep ".service")
  else
    service_config=$(/sbin/chkconfig | grep -E ":on|:啓用" | column -t)
    run_service=$(/sbin/service --status-all | grep -E "running")
  fi
  cat << EOF
【服務信息】
${service_config}
  ${line}
運行的服務:
${run_service}
  ${line}
監聽端口:
${port_listen}
  ${line}
內核參考配置:
${kernel_config}
EOF
}
# 獲取系統內存信息
get_mem_info() {
  check_mem=$(free -m)
  MemTotal=$(grep MemTotal /proc/meminfo | awk '{print $2}') #KB
  MemFree=$(grep MemFree /proc/meminfo | awk '{print $2}') #KB
  let MemUsed=MemTotal-MemFree
  MemPercent=$(awk "BEGIN {if($MemTotal==0){printf 100}else{printf \"%.2f\",$MemUsed*100/$MemTotal}}")
  report_MemTotal="$((MemTotal/1024))" "MB" #內存總容量(MB)
  report_MemFree="$((MemFree/1024))" "MB" #內存剩餘(MB)
  report_MemUsedPercent=$(free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/')
  cat << EOF
【內存信息】
內存總容量(MB): ${report_MemTotal}
內存剩餘量(MB):${report_MemFree}
內存使用率: ${report_MemUsedPercent}
EOF
}
# 獲取系統網絡信息
get_net_info() {
  pri_ipadd=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
  pub_ipadd=$(curl ifconfig.me -s)
  gateway=$(ip route | grep default | awk '{print $3}')
  mac_info=$(ip link | egrep -v "lo" | grep link | awk '{print $2}')
  dns_config=$(egrep -v "^$|^#" /etc/resolv.conf)
  route_info=$(route -n)
  cat << EOF
【網絡信息】
系統公網地址:${pub_ipadd}
系統私網地址:${pri_ipadd}
網關地址:${gateway}
MAC地址:${mac_info}
路由信息:
${route_info}
DNS 信息:
${dns_config}
EOF
}
# 獲取系統磁盤信息
get_disk_info() {
  disk_info=$(fdisk -l | grep "Disk /dev" | cut -d, -f1)
  disk_use=$(df -hTP | awk '$2!="tmpfs"{print}')
  disk_percent=$(free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/')
  disk_inode=$(df -hiP | awk '$1!="tmpfs"{print}')
  cat << EOF
【磁盤信息】
${disk_info}
磁盤使用: ${disk_use}
磁盤使用百分比: ${disk_percent}
inode信息: ${disk_inode}
EOF
}
# 獲取系統用戶信息
get_sys_user() {
  login_user=$(awk -F: '{if ($NF=="/bin/bash") print $0}' /etc/passwd)
  ssh_config=$(egrep -v "^#|^$" /etc/ssh/sshd_config)
  sudo_config=$(egrep -v "^#|^$" /etc/sudoers | grep -v "^Defaults")
  host_config=$(egrep -v "^#|^$" /etc/hosts)
  crond_config=$(for cronuser in /var/spool/cron/*; do
    ls ${cronuser} 2> /dev/null | cut -d/ -f5; egrep -v "^$|^#" ${cronuser} 2> /dev/null;
    echo "";
  done)
  cat << EOF
【用戶信息】
系統登錄用戶:
${login_user}
  ${line}
ssh 配置信息:
${ssh_config}
  ${line}
sudo 配置用戶:
${sudo_config}
  ${line}
定時任務配置:
${crond_config}
  ${line}
hosts 信息:
${host_config}
EOF
}
# 獲取CPU/內存佔用TOP10
get_process_top_info() {
  top_title=$(top -b n1 | head -7 | tail -1)
  cpu_top10=$(top -b n1 | head -17 | tail -11)
  mem_top10=$(top -b n1 | head -17 | tail -10 | sort -k10 -r)
  cat << EOF
【TOP10】
CPU佔用TOP10:
${cpu_top10}
內存佔用TOP10:
${top_title}
  ${mem_top10}
EOF
}
show_dead_process() {
  printf "殭屍進程:\n"
  ps -al | gawk '{print $2,$4}' | grep Z
}
get_all_info() {
  get_systatus_info
  echo ${double_line}
  get_service_info
  echo ${double_line}
  get_cpu_info
  echo ${double_line}
  get_net_info
  echo ${double_line}
  get_mem_info
  echo ${double_line}
  get_disk_info
  echo ${double_line}
  get_process_top_info
  echo ${double_line}
  get_sys_user
}
main() {
  while [[ 1 ]]
  do
    printMenu
    read option
    local index=$[ ${option} - 1 ]
    case ${options[${index}]} in
      "獲取系統信息")
        get_systatus_info ;;
      "獲取服務信息")
        get_service_info ;;
      "獲取CPU信息")
        get_cpu_info ;;
      "獲取系統網絡信息")
        get_net_info ;;
      "獲取系統內存信息")
        get_mem_info ;;
      "獲取系統磁盤信息")
        get_disk_info ;;
      "獲取CPU/內存佔用TOP10")
        get_process_top_info ;;
      "獲取系統用戶信息")
        get_sys_user ;;
      "輸出所有信息")
        get_all_info > sys.log
        printf "${C_GREEN}信息已經輸出到 sys.log 中。${C_RESET}\n\n"
      ;;
      "退出")
        exit ;;
      *)
        clear
        echo "抱歉,不支持此選項" ;;
    esac
  done
}
######################################## MAIN ########################################
printHeadInfo
main
printFootInfo
printf "${C_RESET}"

sed 進階

#!/bin/bash
#多個空格只保留一個
#sed '/./,/^$/!d' test
#刪除開頭的空白行
#sed '/./,$!d' test
#刪除結尾的空白行
sed '{
:start
/^\n*$/{$d; N; b start}
}' test
#刪除html標籤
#有問題
#s/<.*>//g
#sed 's/<[^>]*>//g' test1
#sed 's/<[^>]*>//g;/^$/d' test1
#and符號,代表替換命令中的匹配模式,不管預定義模式是什麼文本,都可以用and符號替換,and符號會提取匹配替換命令中指定替換模式中的所有字符串
echo "The cat sleeps in his hat" | sed 's/.at/"&"/g'
#替換單獨的單詞
echo "The System Administrator manual" | sed 's/\(System\) Administrator/\1 user/'
#在長數字中插入逗號
echo "1234567" | sed '{:start; s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/; t start}'
#給文件中的行編號
sed '=' test | sed 'N; s/\n/ /'
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/jEVHWuoWfS9rtsHMPsdaHw