文件的md5校驗
#/bin/bash
genMd5Sum(){
local pid_array=()
for file in ./*
do
md5sum ${file} &
pid_array+=("$!") # 將上一個進程id保存之pid_array
done
wait ${pid_array[@]} # 等待pid_array中的進程執行完畢
}
checkMd5Sum(){
local pid_array=()
for file in ./*.md5
do
md5sum -c ${file} &
pid_array+=("$!")
done
}
case $1 in
gen)
genMd5Sum
;;
check)
checkMd5Sum
;;
*)
echo "need action supply"
;;
esac
刪除重複文件
#!/bin/bash
ls -lS --time-style=long-iso | awk 'BEGIN {
getline; getline; #忽略第一行,讀入第二行
name1=$8; size=$5
}
{ # 從第三行開始遍歷
name2=$8;
if (size==$5)
{
"md5sum "name1 | getline; csum1=$1;
"md5sum "name2 | getline; csum2=$1;
if ( csum1==csum2 ) # 文件md5值和上一個相同則輸出重複的兩個文件名
{
print name1; print name2
}
};
size=$5; name1=name2;
}' | sort -u > duplicate_files # 輸出排序並打印至duplicate_files
# 將md5值相同的文件根據md5去重並按照文件名排序後輸入到unique_files
cat duplicate_files | xargs -I {} md5sum {} | \
sort | uniq -w 32 | awk '{ print $2 }' | \
sort -u > unique_files
echo Removing..
# 將不同時在duplicate_files unique_files中的文件刪除
comm duplicate_files unique_files -3 | tee /dev/stderr | xargs rm
echo Removed duplicates files successfully.
遠程監控磁盤腳本
#!/usr/bin/env bash
# 監控變量IP_LIST中的磁盤使用情況, 使用率超過80%的磁盤記錄日誌爲ALERT
logfile="diskusage.log"
if [[ -n $1 ]]
then
logfile=$1
fi
user=$USER
IP_LIST="127.0.0.1 0.0.0.0" # 需要監控的機器列表, 空格分割
if [ ! -e ${logfile} ] # 日誌文件不存在時打印頭部信息
then
printf "%-20s %-16s %-9s %-8s %-6s %-6s %-6s %s\n" \
"Date" "IP address" "Device" "Capacity" "Used" "Free" \
"Percent" "Status" > ${logfile}
fi
(
for ip in ${IP_LIST}; # 自動按空格分割遍歷字符串
do
# 登錄機器執行df -H命令, 獲取以/dev/開頭的行,寫入臨時文件(/tmp/$$.df),$$代表進程號
ssh -o StrictHostKeyChecking=no ${user}@${ip} 'df -H' | grep ^/dev/ > /tmp/$$.df
cur_date=$(date '+%Y-%m-%d.%H:%M:%S') # 當前時間格式化輸出
while read line; # 從標準順序讀入每行
do
printf "[%-14s] %-14s " ${cur_date} ${ip}
echo $line | \
awk '{ printf("%-9s %-8s %-6s %-6s %-8s" ,$1,$2,$3,$4,$5); }'
pusg=$(echo $line | egrep -o "[0-9]+%")
pusg=${pusg/\%/}; # 刪除%
if [ ${pusg} -lt 80 ];
then
echo SAFE
else
echo ALERT
fi
done< /tmp/$$.df # 將$$.df重定向至while循環的標準輸入
done
) >> ${logfile} # 最終的輸出全部重定向至logfile
用戶登錄情況統計
#!/usr/bin/env bash
# 獲取各個用戶登錄次數&時長&第一次登錄時間,並按照時長排序
log=/var/log/wtmp
if [[ -n $1 ]];
then
log=$1
fi
printf "%-4s %-10s %-10s %-6s %-8s\n" "Rank" "User" "Start" "Logins" "Usage hours"
# 除最後兩行外均打印至/tmp/ulog.$$
last -f ${log} | head -n -2 > /tmp/ulog.$$
cat /tmp/ulog.$$ | cut -d' ' -f1 | sort | uniq> /tmp/users.$$ # 按照用戶名排序並去重,保存至/tmp/users.$$
(
while read user;
do
grep ^${user} /tmp/ulog.$$ > /tmp/user.$$ # 獲取本user的訪問信息
minutes=0
while read t
do
s=$(echo ${t} | awk -F: '{ print ($1 * 60) + $2 }') # 計算登錄持續時長
let minutes=minutes+s
# 獲取訪問信息的最後一列(登錄持續時間),並去掉(),最後將輸出重定向至while done
done< <(cat /tmp/user.$$ | awk '{ print $NF }' | tr -d ')(')
firstlog=$(tail -n 1 /tmp/user.$$ | awk '{ print $5,$6 }') # 第一次登錄時間
nlogins=$(cat /tmp/user.$$ | wc -l) # 登錄次數
hours=$(echo "$minutes / 60.0" | bc) # 登錄持續時長
printf "%-10s %-10s %-6s %-8s\n" ${user} "${firstlog}" ${nlogins} ${hours}
done< /tmp/users.$$
) | sort -nrk 4 | awk '{ printf("%-4s %s\n", NR, $0) }' # 按照登錄時長排序並打印排序
rm /tmp/users.$$ /tmp/user.$$ /tmp/ulog.$$
bash中對mysql進行操作
#!/bin/bash
# bash中對mysql進行操作
USER="user"
PASS="user"
HOST="127.0.0.1"
mysql -u ${USER} -p${PASS} -h${HOST}<<EOF 2> /dev/null
CREATE DATABASE students;
EOF
[ $? -eq 0 ] && echo Created DB || echo DB already exist
mysql -u ${USER} -p${PASS} -h${HOST} students <<EOF 2> /dev/null
CREATE TABLE students(
id int,
name varchar(100),
score int
);
EOF
[ $? -eq 0 ] && echo Created table students || echo Table students already exist
mysql -u ${USER} -p${PASS} -h${HOST} students <<EOF 2> /dev/null
INSERT INTO students(id,name,score)values(0,'allen',100);
);
EOF
mysql -u ${USER} -p${PASS} -h${HOST} students <<EOF 2> /dev/null
SELECT * FROM students WHERE id=0;
EOF
mysql -u ${USER} -p${PASS} -h${HOST} students <<EOF 2> /dev/null
DROP TABLE students;
EOF
mysql -u ${USER} -p${PASS} -h${HOST} <<EOF 2> /dev/null
DROP DATABASE students;
EOF