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