shell中函數應用

1語法
方法1:
函數名()  {
    函數體
    return  n
}

function 函數名() {
    函數體
    return n
}

2#調用函數

#!/bin/bash

function fun1() {
    echo "ni"
}
fun1


#!/bin/bash

function  fun1()  {
    echo "  asfd"
}  

count=1
while [ $count -le 5 ]
do 
    fun1
    count=$[ $count+1 ]
done

echo "end"

fun1
echo  "end"


sh -x 調式腳本

3引用函數
每次引用函數時,bash會重新回到函數的定義

4函數不一定在最開始定義,但是定義函數前使用,會報錯

必須先定義函數,再使用

5如果函數名字重複,那麼只會使用最新的一個函數,舊的會被覆蓋


6函數返回值
返回值範圍0-255
1默認退出狀態碼:默認是函數最後一條命令返回的退出狀態碼。

2可以使用return命令退出函數並且返回特定的退出狀態碼
但是有範圍0-255


3使用函數輸出

使函數的輸出保存在shell變量中
可以獲得任何類型的函數輸出
並保存到變量中
#!/bin/bash
function addem() {
        case  $# in
                1)
                echo $[ $1 + $1 ] 
                ;;
                2)
                echo $[ $2 + $1 ]
                ;;
                *) 
                echo -1 
        esac
}

addem $@

4函數中使用變量

可以向函數中傳遞參數
函數名會在$0變量中定義,函數命令行上的任何參數都會通過
$1,$2定義
$#來判斷傳給函數的參數數目

function fun1() {
    echo $[ $1 * $2 ]
}

if [ $# -eq 2 ];then
    value=`fun1 $@`
    echo "The result is $value"
else
    echo "Usage:fun1 a b"
fi


5函數中的局部變量

函數中使用local vaule=#
全局變量都可以使用
 

6函數遞歸


#####################
#!/bin/bash
function dg() {
        local sum=1
        case $# in
                1)
        [ $@ -gt 0 ]&&{
        for i in `seq $1`
        do
                sum=$[ $sum * $i ]
        done
                echo $sum
        }||
        echo error
                ;;
                *)
                echo errer
        esac
}
dg $@


#####################


#!/bin/bash
function addem() {
        local n=$1
        if [ $1 -eq 1 ];then
                 result=1  
        else
                tmp=$((n-1))
                addem $tmp 
                result=$(( n*result))
        fi
}
case $# in
        1)
        case $@ in
                0|1)
                echo 1
                ;;
                *) 
                addem $1
                echo $result 
        esac 
        ;;
        *)
        echo error
esac

unit信號

1捕捉信號 trap命令
ctrl+c終止信號
ctrl+z打入後臺

trap "echo westos" 2
這樣按ctrl+c 變成輸出westos

stty -a 查看中斷信號與鍵盤的關係

信號屏蔽
trap "" 2  這樣就沒有ctrl+c 的功能了,
裏面可以寫文本來表示 echo youcannot type
trap : 2   或者 trap - 2 信號恢復

xargs 獲取前面命令的結果
-n2  每兩個數據一行

##############################################
#!/bin/bash
while [ 1 ]
do
   touch /tmp/westos_`date +%F-%N-%H:%M`
        echo -e "file westos_`date +%F-%N-%H:%M` touched"
        sleep 2
done
trap "`rm -fr `find /tmp/westos_*``" 2
trap - 2
###############################################

#############################


#!/bin/bash
while [ 1 ]
do
   touch /tmp/westos_`date +%F-%N-%H:%M`
trap "rm -fr /tmp/westos_*;echo 123;break" 2 
        echo -e "file westos_`date +%F-%N-%H:%M` touched"
        sleep 2
done

find /tmp/westos*

###############################

trap "find /tmp -type f -name "westos_*"|xargs rm -f&&exit;trap - 2" 2

屏蔽所有信號不能操作
trap ""  INT EXIT TSTP TERM HUP

放到  /etc/profile.d/

跳板機
如果你用172.25.10.11作跳板機去連接172.25.254.11服務器那麼
172.25.10.11 用172.25.254.11給10.11的ssh-key中的/root/.ssh/.rsa

命令ssh-copy-id .ssh/id_rsa.pub 172.25.10.11
直接就給他鑰匙的命令不需要scp


vim /etc/profile.d/nimama.sh;chmod +x /etc/profile.d/nimama.sh

vim tiaoban.sh
#!/bin/bash
[ $UID -eq 0 ] &&trap ""  INT EXIT TSTP TERM HUP&& sh /mnt/tiaoban.sh||trap ""  INT EXIT TSTP TERM HUP

vim /mnt/zhenji.sh;chmod +x /mnt/zhenji.sh

#!/bin/bash
while true
do
clear
cat <<menu 
1  172.25.254.11免密登陸
2  172.25.10.11
3  exit
menu


read -p "your choice  "  va
case $va in
        1)
        ssh [email protected] 
        ;;
        2)
        ssh [email protected]
        ;;
        3)
        exit
esac
done

登陸ssh失敗三次加入黑名單

1過濾日誌找到Failed --> 倒入文件 --》統計ip失敗次數
> file

cat /var/log/secure
vim /etc/hosts.deny
sshd:ip


vim /root/tongji.sh


#!/bin/bash
        >/etc/fileno
cat /var/log/secure|grep Failed|grep -v invalid|awk -F " " '{print $11}'>>/etc/fileno
cat /var/log/secure|grep Failed|grep 'invalid user'|awk -F " " '{print $13}'>>/etc/fileno
cat /etc/fileno|uniq -c|awk -F " " '{print $1}'
for i in  `cat /etc/fileno|uniq -c|awk -F " " '$1>=3 {print $2}'`
do
                echo "sshd:$i" >> /etc/hosts.deny
done


或者

#!/bin/bash

cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort  | uniq -c | awk '{print $2"="$1}' > /tmp/blacklist

MAXCOUNT="3"

for i in `cat /tmp/blacklist`
do
    IP=`echo $i | awk -F= '{print $1}'`         ##????IP
    NUM=`echo $i | awk -F= '{print $2}'`        ##??????

if [ $NUM -gt $MAXCOUNT ];then
    #??IP?????IP??????
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
        echo "sshd:$IP" >> /etc/hosts.deny
    fi
fi
done

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章