Linux常用脚本

2017-01-22

记录日常使用到的脚本

把本地文件夹备份至远程服务器

1.通过scp拷贝目录

#!/bin/bash
dd=`date '+%Y-%m-%d-%H%M%S'`
scp -i /root/.ssh/id_rsa -P 22 -r /local root@malu.me:/backup/${dd}

2.拷贝目录至windows共享 (如果有防火墙,需允许445, 135, 137, 138, 139 UDP和TCP)

#!/bin/bash
dd=`date '+%Y-%m-%d-%H%M%S'`
smbclient -c "mkdir ${dd};prompt OFF;recurse ON;lcd /local;cd ${dd};mput *" //IP/share -U username%password

切换到当前目录执行脚本

#!/bin/bash
MY_PATH=$(cd "$(dirname "$0")"; pwd)
cd $MY_PATH

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

#!/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

杀死包含关键字的进程,及其所有子进程

#!/bin/bash
PID=`ps -ef|grep [n]ame|awk '{print $2}'`
expr 1 + $PID > /dev/null 2>&1
if [[ $? -eq 0 ]]; then
	pstree -p $PID | grep -oP '(?<=\()[0-9]+(?=\))'|xargs kill -9
fi

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

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);
}

向本地监听的所有匹配端口发送curl请求

netstat -lnt4p|grep sshd|grep -v ':22 '|awk -F '0.0.0.0:' '{print $2}'|awk '{print $1}'|xargs -t -i curl localhost:{}