Shell

 

set nocompatible 
set history=100
filetype on
filetype plugin on
filetype indent on 
set autoread 
set mouse=c
syntax enable 
set cursorline
hi cursorline guibg=#00ff00
hi CursorColumn guibg=#00ff00
set foldenable
set foldmethod=manual
set foldcolumn=0
setlocal foldlevel=3
set foldclose=all           
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set smarttab
set ai  
set si 
set wrap 
set sw=4        
set wildmenu 
set ruler 
set cmdheight=1 
set lz 
set backspace=eol,start,indent 
set whichwrap+=<,>,h,l 
set magic 
set noerrorbells
set novisualbell
set showmatch 
set mat=4 
set hlsearch
set ignorecase
set encoding=utf-8
set fileencodings=utf-8
set termencoding=utf-8
set smartindent
set cin
set showmatch
set guioptions-=T
set guioptions-=m
set vb t_vb=
set laststatus=4
set pastetoggle=<F9>
set background=dark
highlight Search ctermbg=black  ctermfg=white guifg=white guibg=black
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()  
    if expand("%:e") == 'sh'  
        call setline(1, "#!/bin/bash")
        call setline(2, "##############################################################")  
        call setline(3, "# File Name: ".expand("%"))
        call setline(4, "# Version: V1.0")
        call setline(5, "# Author: liushuo")
        call setline(6, "# Organization: www.shuoiliu.com")
        call setline(7, "# Created Time : ".strftime("%F %T"))
        call setline(8, "# Description:")
        call setline(9, "##############################################################")
    endif  
endfunc 
shell帮助脚本
用户家目录下 新建文件为  .vimrc

 

cat /etc/password
查看用户使用的解释器

一般以.sh结尾、用file查看文件类型(shell)
#!/bin/bash  # 默认使用的解释器
变量
以字母开头
${week} == $week
全局变量 :环境变量
$PATH   $PS1  $LANG

name=1213
export name # 局部转全局(临时),然后再脚本内就可以使用了
unset name 取消变量、刚声明的全局变量
 特殊变量
$0  # 脚本的名字
$1  # 第一个参数   
$2  # ....
$3  # ....
$n  # 第n个参数
$#  # 表示脚本一共有多少个参数  
$*  # h获取脚本的所有参数; 最后会当做一个参数
$@  # 获取脚本的所有参数; 不会当做一个参数
echo $?  # 显示上一个命令的执行结果code     非0错误;0成功;        判断软件是否安装成功
$$  # 获取当前执行脚本的进程号
$!  # 获取上一个后台工作进程的进程号
$_  # 获取上一个执行脚本的最后一个参数
 变量子串

 

echo ${#oldboy}
echo $oldboy|wc -L
echo $oldboy|awk '{print length}'
expr length oldbody

 

 数组
数组定义
1、array=(one two three four)
2、array=([0]=one [1]=two [2]=three [3]=four)
3、array[0]=one

获取值
echo ${array[@]}
echo ${array[@]}
echo ${array[0]}

删除值
unset array[1]      
但是下标位置不会改变



使用for循环打印数组元素
array=(1 2 3 4 5)
for n in ${array[*]}
do
    echo $n
done
echo =====================
#i为数组下标
for ((i=0;i<${#array[*]};i++))
do
    echo ${array[i]}
done 

 

运算命令

expr  '':'' > /dev/null
可以匹配

 

 

与环境变量相关的目录
环境变量存储目录
/etc/profile /etc/bashrc /etc/profile.d/ 用户环境变量配置文件 ~/.bash_profile ~/.bashrc

 变量赋值方法-read
从命令行读取内容
read -p "input x y :" x y

-t 10 # 10秒超时
循环
条件表达式

 


[ -f /root/oldboy.txt ] 判断这个文件是否存在;两侧有空格
echo $?

[ -d /root/123.txt ]   判断目录存不存在  

[ 1 -eq 1 ]
[ 1 -ne 1 ] 不等于
[ 1 -gt 1 ] 大于 
[ 1 -ge 1 ] 大于等于 
[ 1 -lt 1 ] 小于
[ 1 -le 1 ] 小于等于
更多查看man test
[ $# -eq 2] && echo 'args:'$#             前一个执行成功,再执行后边的

[ -d /oldboy ] || mkdir -p /oldboy     前一个执行失败,在执行后边的    



 

逻辑测试表达式

在[] 和test中使用操作符     在[[]]和(())中使用操作符     说明
    -a                $$          and与,两端都为震则为真
    -o                ||          or或,两端有一个为真则为真
    !                 !          not非,相反则为真

 

 

 

 if语句
# 单分支
num1=$1
num2=$2
if [ $num1 -gt $num2 ];then
  echo $num1 greater than $num2
fi
# 双分支
if [ $# -ne 2 ];then
  echo 'Usage: please inpit 2 number: num1 num2'
  exit
fi
num1=$1
num2=$2
if [ $num1 -gt $num2 ];then
  echo $num1 greater than $num2
else
  echo $num1 less than $num2
fi
# 多分支
num1=$1 num2=$2 if [ $num1 -gt $num2 ];then   echo $num1 greater than $num2
elif [ $num1 -eq $num2 ];then
  echo $num1 greater than $num2
else
  echo $num1 less than $num2
fi
 for循环
语法
开机


for 变量名字 in 列表
do
  命令
done
--------------------------------
for num in 1 2 3 4 5 6 # 生成序列的东西 {01..10}
do
  echo num #echo chkconfig $name off
done

$(chkconfig |egrep "crond|sshd|rsyslog|network|sysstat" -v |awk '{print $1}')

# sh -x 123.sh # 调试、执行过程

for ((i=1;i<=5;i++))
do
  echo $i
done
for i in `seq 100`
do
    ((num+=i))
done
echo $num
 mkdir /oldboy -p
cd /oldboy
touch stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_finished.jpg 
touch stu_102999_4_finished.jpg stu_102999_5_finished.jpg

for file in `ls ./*.jpg`
do
    mv $file `echo ${file/_finished/}`
done
在Linux下批量修改文件名,将文件名中的“_finished”去掉。

 

rename "_finished" ""  *.jpg 

 

 while

只要满足条件,就一直循环下去

while <条件表达式>
do
  指令
    if <>
    then
      continue
    fi
done

 

while ((i<=100))do
    ((num+=i))
   ((i++)) done echo $num

 

 until

直到满足某个条件满足,退出循环

until [ $# -eq 0 ]
do
  ehco $*
  shift done
 case
case   变量   in
    arg1 )
            指令
            ;;
    arg2)
            指令
            ;;
    *)
            
         可以不写;;
esac

 

 

 

 

 

 

 函数

 

 

程序的加载顺序:
1、系统别名
2、函数
3、系统命令
4、可执行文件

 

在函数内使用的$n
函数名  参数1 参数2

$0 是父脚本的名称

############### 模块化 #############
. ./functions
func $1


# return返回值,使用$?问号

函数内局部变量 local name=123;不用local函数外也会生效

 

 

 

 

 shell脚本

 

#!/bin/bash 
lockfile=/var/lock/subsys/rsyncd
. /etc/init.d/functions
rsyncd_pid_file_path=/var/run/rsyncd.pid

start(){
    rsync --daemon &>/dev/null
    retval=$?
    if [ $retval -eq 0 ]
    then
        action "rsync startup ok" /bin/true
        touch $lockfile
        return $retval
    else
        action "rsync startup fail" /bin/false
        return $retval
    fi
}
stop(){
    if test -s "$rsyncd_pid_file_path"
    then
        rsyncd_pid=`cat $rsyncd_pid_file_path`
        if (kill -0 $rsyncd_pid &>/dev/null)
        then
            kill $rsyncd_pid
            retval=$?
            if [ $retval -eq 0 ]
            then
                action "rsync stop ok" /bin/true
                rm $lockfile
                return $retval
            else
                action "rsync stop fail" /bin/false
                return $retval
            fi
        else
            echo " rsyncd process is not exist."
            return 2
        fi
    else
        echo "$rsyncd_pid_file_path is not exist,or rsyncd does not startup."
    fi
}
case "$1" in
    start)
        start
        retval=$?
        ;;
    stop)
        stop
        retval=$?
        ;;
    restart)
        stop
        sleep 1
        start
        retval=$?
        ;;
    *)
        echo "usage:$0 {start|stop|restart}"
        exit 1
esac
exit $retval
rsyncd脚本
#!/bin/bash
cat <<EOF
1.install lamp
2.install lnmp
3.exit
EOF
read -p "请选择一个序号(必须是数字):" num
#1.判断是否为整数
expr 2 + $num &>/dev/null
if [ $? -ne 0 ]
then
    echo "Usage:$0 {1|2|3}"
    exit 1
fi

#2.判断执行处理
case $num in
    1)
        echo "install lamp..."
        ;;
    2)
        echo "install lnmp..."
        ;;
    3)
        echo "bye."
        exit 
        ;;
    *)
        echo "Usage:$0 {1|2|3}"
        exit 1
esac        
菜单
#!/bin/bash
. /etc/init.d/functions

if [ $# -ne 2 ]
then
    echo "usage:$0 localdir remotedir"
    exit 1
fi

for n in 8 41 42 43
do
   scp -rp $1 10.0.0.$n:$2 &>/dev/null
   if [ $? -eq 0 ]
   then
       action "10.0.0.$n is successful" /bin/true
   else
       action "10.0.0.$n is failure" /bin/false
   fi
done
批量scp

 

lockfile=/var/lock/subsys/mysqld
. /etc/init.d/functions
mysqld_pid_file_path="/application/mysql/data/web01.pid"
mysqld_safe=/application/mysql/bin/mysqld_safe

start(){
    /bin/sh $mysqld_safe --datadir=/application/mysql/data --pid-file=$mysqld_pid_file_path &>/dev/null &
    retval=$?
    if [ $retval -eq 0 ]
    then
        action "mysql startup ok" /bin/true
        touch $lockfile
        return $retval
    else
        action "mysql startup fail" /bin/false
        return $retval
    fi
}
stop(){
    if test -s "$mysqld_pid_file_path"
    then
        mysqld_pid=`cat $mysqld_pid_file_path`
        if (kill -0 $mysqld_pid &>/dev/null)
        then
            kill $mysqld_pid
            retval=$?
            if [ $retval -eq 0 ]
            then
                action "mysql stop ok" /bin/true
                rm $lockfile
                return $retval
            else
                action "mysql stop fail" /bin/false
                return $retval
            fi
         else
            echo " mysqld process is not exist."
            return 2
         fi
    else
        echo "$mysqld_pid_file_path is not exist,or mysqld does not startup."
    fi
}
case "$1" in
    start)
        start
        retval=$?
        ;;
    stop)
        stop
        retval=$?
        ;;
    restart)
        stop
        sleep 2
        start
        retval=$?
        ;;
    *)
        echo "usage:$0 {start|stop|restart}"
        exit 1
esac
exit $retval
mysqld启动脚本
path=/backup
mysql="mysql -uroot -poldboy123"
mysqldump="mysqldump -uroot -poldboy123"
[ -d $path ]||mkdir $path -p
for dbname in `$mysql -e "show databases;" 2>/dev/null|grep -v _schema|sed 1d`
do
    $mysqldump  -B $dbname|gzip >$path/${dbname}_$(date +%F).sql.gz 2>/dev/null
done
mysql分库备份
path=/backup
mysql="mysql -uroot -poldboy123"
mysqldump="mysqldump -uroot -poldboy123"
[ -d $path ]||mkdir $path -p
for dbname in `$mysql -e "show databases;" 2>/dev/null|grep -v _schema|sed 1d`
do
    for tname in `$mysql -e "show tables from $dbname;" 2>/dev/null|sed 1d`
    do
        $mysqldump  $dbname $tname|gzip 1>$path/${dbname}_${tname}.sql.gz 2>/dev/null
    done
done
mysql分库分表备份
path=/backup
[ -d $path ]||mkdir $path -p
for dbname in `mysql -e "show databases;"|grep -v _schema|sed 1d`
do
    for tname in `mysql -e "show tables from $dbname;"|sed 1d`
    do
        if [ "$dbname" = "mysql" ]
        then
            mysqldump --skip-lock-tables $dbname $tname|gzip >$path/${dbname}-${tname}.sql.gz
        else
            mysqldump $dbname $tname|gzip >$path/${dbname}-${tname}.sql.gz
        fi
    done
done
mysql分库分表备份_2
for n in {1..254}
do
    {
    if `ping -c 1 -w 3 10.0.0.$n &>/dev/null`
    then
        echo "10.0.0.$n is up."
    else
        echo "10.0.0.$n is down"
    fi
    } &
done


# -w   deadline
# -c   次数
 
检测网段内主机状态ping
# 随机数生成
$((RANDOM)) 0-32767
openssl rand -base64 10
uuidgen
head /dev/urandom|cksum
cat /proc/sys/kernel/random/uuid
date +%s%N
mkpasswd -l 20 -d 10 -C 5 -c 3 -s 2
-l 长度
-d 数字
-c 小写字母
-C 大写字母
-s 特殊字符

 

. /etc/init.d/functions

if [ $UID -ne 0 ]
then
    echo "必须用root执行本脚本"
    exit 1
fi

for n in {23..29}
do
    pass=`openssl rand -base64 10`
    if [ `grep -w "oldboy$n" /etc/passwd|wc -l` -eq 0 ]
    then
        useradd oldboy$n &>/dev/null &&\
        echo $pass|passwd --stdin oldboy$n &>/dev/null &&\
        echo -e "oldboy$n\t$pass" >>/tmp/user.list &&\
        action "oldboy$n is successful." /bin/true
    else
        action "oldboy$n is exist." /bin/false
    fi
done
批量创建用户,密码随机
# RANDOM随机数---> md5 --->截取子串 --->找出初始MD5串
array=( 21029299 00205d1c a3da1677 1f6d12dd 890684b ) Funmd5(){ for n in {0..32767} do echo -e "$n\t`echo $n|md5sum`" >>/tmp/md5sum1.log & done } FunJudge(){ char=`echo ${array[*]}|tr ' ' '|'` egrep "$char" /tmp/md5sum1.log } main(){ Funmd5 FunJudge } main
awk '{S[$1]++}END{for(key in S) print S[key],key}' access_2010-12-8.log|sort -rn|head >/tmp/ip.log
while read line
do
    ip=`echo $line|awk '{print $2}'`
    count=`echo $line|awk '{print $1}'`
    if [ $count -gt 100 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ] 
    then
        iptables -I INPUT -s $ip -j DROP &&\
        echo "$ip" >>/tmp/drop.log
    else
        echo "$ip" >>/tmp/accept.log
    fi
done</tmp/ip.log
日志ip排序分组_1
awk '/ESTAB/{print $0}' netstat.log |awk -F "[ :]+" '{print $(NF-3)}'|sort|uniq -c|sort -rn|head >/tmp/ip.log
while read line
do
    ip=`echo $line|awk '{print $2}'`
    count=`echo $line|awk '{print $1}'`
    if [ $count -gt 10 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ] 
    then
        iptables -I INPUT -s $ip -j DROP &&\
        echo "$ip" >>/tmp/drop.log
    else
        echo "$ip" >>/tmp/accept.log
    fi
done</tmp/ip.log
日志ip排序分组_2
awk '{S[$1]++}END{for(key in S) print S[key],key}' access_2010-12-8.log|sort -rn|head >/tmp/ip.log
while read line
do
 ip=`echo $line|awk '{print $2}'`
 count=`echo $line|awk '{print $1}'`
 if [ $count -gt 100 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ] 
 then
 iptables -I INPUT -s $ip -j DROP &&\
 echo "$ip" >>/tmp/drop.log
 else
 echo "$ip" >>/tmp/accept.log
 fi
done</tmp/ip.log
解决DOS攻击-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#!/bin/bash

for i in I am oldboy teacher welcome to oldboy training class

 do

   if [ "${#i}" -le 6 ];then

  echo $i

   fi

done
循环打印下面这句话中字母数不大于 6 的单词

 

posted @ 2019-04-22 20:08  慕沁  阅读(207)  评论(0)    收藏  举报