文件的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