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 root@172.25.254.11
;;
2)
ssh root@172.25.10.11
;;
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