Linux常用脚本

2017-01-22

记录日常使用到的脚本

防止脚本重复执行(每次只有一个脚本在执行)

#!/bin/bash
function run_only_one(){
        PID=$$
        snum=`ps -ef|grep $0|grep -v grep|grep -v " $PPID "|grep -v " $PID "|wc -l`
        if [ $snum -lt 1 ]; then
            echo "start process....."
        else
            echo "runing....."
            exit
        fi  
}
run_only_one

scp拷贝最近3天日期命名的tar.z文件,并删除本地6天前的tar.z文件

#!/bin/bash
for((i=0;i<=3;i++)); do
	datefile=`date -d"$i day ago" +%Y%m%d`.tar.z
	if [ ! -f "$datefile" ]; then
		scp malu.me:/backup/$datefile /home/backup/
	fi
done
find ./ -mtime +6 -type f -name "*.tar.z"|xargs rm -f

合并指定目录下的所有文本,并去除重复行,并过滤^M字符 (生成超级字典)

#!/bin/bash
if [ $# != 1 ] ; then 
echo "USAGE: $0 FLODER" 
exit 1;  
fi
root_dir=$1
NEWFILE=newfile_dic.txt
NEWFILE_TMP=newfile_dic.txt.tmp
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
function getdir(){
    for element in `ls $1`
    do  
        dir_or_file=$1"/"$element
        if [ -d $dir_or_file ]
        then 
            getdir $dir_or_file
        else
            echo -n $dir_or_file
            cat $dir_or_file |sed 's/^M//g'>> $NEWFILE_TMP
            echo '              ok'
        fi  
    done
}
getdir $root_dir
IFS=$SAVEIFS
sort $NEWFILE_TMP|uniq > $NEWFILE
rm -f $NEWFILE_TMP

注意:^M的输入方式是 Ctrl + v ,然后Ctrl + m

杀死进程及其所有子进程

pstree -p PID | grep -oP '(?<=\()[0-9]+(?=\))'|xargs kill -9

将目录下所有文件名改成小写

for i in `find ./`;do mv $i `echo $i |tr [A-Z] [a-z]`;done

防御CC攻击脚本

#!/bin/sh
status=`netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' |awk -F ":" -- '{print $1}' |sort -n|uniq -c |sort -n|tail -n 1`
NUM=`echo $status|awk '{print $1}'`
IP=`echo $status|awk '{print $2}'`
result=`echo "$NUM > 150" | bc`
if [ $result = 1 ]
then
  echo IP:$IP is over $NUM, BAN IT!
  /sbin/iptables -I INPUT -s $IP -j DROP
fi

向进程发送按键指令

其实用C写的,算不上脚本。需要先编译:

gcc key.c -o key.bin

运行:

./key.bin PID cmd

#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>

void stackchar(int fd,char c)
{
        if (ioctl(fd, TIOCSTI, &c) < 0) {
                perror("ioctl");
                exit(1);
        }
}

int main(int argc, char *argv[])
{
        int i, j;
        char c;
        char proc_file[20];
        int mixer_fd=0;

        strcpy(proc_file,"/proc/");
        strcat(proc_file,argv[1]);
        strcat(proc_file,"/fd/1");

        if ((mixer_fd = open(proc_file,O_WRONLY))){
                for (i = 2; i < argc; i++) {
                        if (i > 1) stackchar(mixer_fd,' ');
                        for (j=0; (c = argv[i][j]); j++) {
                                stackchar(mixer_fd,c);
                        }
                }
        }

        stackchar(mixer_fd,'\n');
        exit(0);
}