1 扫描网段中哪些机器存活
#!/bin/bash
for ((i=1;i<256;i++))
do
{
ip="172.16.1.$i"
ping -c 3 -i 1 $ip &>/dev/null
if [ $? -eq 0 ]
then
echo "$ip exits"
else
echo "$ip does not exit"
fi
} &
done
wait
2 新建user01~user20用户,要求密码是随机6位数
密码取值范围是a-zA-Z0-9,要求密码不能只是单一的数字或小写或大写字母
#!/bin/bash
for i in `seq -w 20`
do
passwd=`openssl rand -base64 10 | egrep -o "[a-zA-Z0-9]{6}"|head -n 1`
id user$i &> /dev/null
if [ $? -ne 0 ]
then
useradd user$i &>/dev/null
echo "$passwd" | passwd --stdin user$i &>/dev/null
echo "User: user$i added,Password: $passwd"
else
echo "$passwd" | passwd --stdin user$i &>/dev/null
echo "User: user$i existed,Password: $passwd"
fi
done
3 判断服务器端口是否有响应
使用telnet IP 端口
的方式测试,如果端口开放会输出提示用^]
来中断连接,如果端口没开放会直接提示连接拒绝。
端口开放
端口未开放
#!/bin/bash
port_check(){
#判断telnet是否可用
if [ ! -x /usr/bin/telnet ];then
echo "telnet not found"
exit 1
fi
#创建一个临时文件,用于记录测试结果
temp_file=`mktemp port_telnet.XXX`
#telnet IP+Port,将输出记录到临时文件
(telnet $1 $2 <<EOF
^]
EOF
) &> $temp_file
#如果端口开放,输出记录中会有提示输入^]来结束连接
if egrep "\^]" $temp_file&>/dev/null
then
echo "IP:$1 Port:$2 is up"
else
echo "IP:$1 Port:$2 is down"
fi
#删除临时文件
rm -f $temp_file
}
port_check $1 $2
4 显示内存占用Top 10的进程
使用top -b -n 1
显示上一秒的所有占用情况,使用awk数组过滤出所有进程内存的占用字节数(RES),最后排序显示Top 10
#!/bin/bash
function mem_top {
#新建临时文件,存储内存状态
temp_file=`mktemp mem_temp.XXX`
#存储内存状态
top -n 1 -b > $temp_file
#使用数组存储并显示每个进程的内存占用字节数
tail -n +8 $temp_file | awk '{array[$NF]+=$6}END{for(i in array){print i,array[i]}}'| sort -k 2 -n -r | head -n 10
#删除临时文件
rm -f $temp_file
}
mem_top
5 shell猜随机数
数字范围1-100,定制计数器,每次猜完告诉用户猜大或猜小了,如果猜对了跳出脚本并输出计数器
#!/bin/bash
#通过随机数取余+1,得到1-100的随机数
num=`expr $RANDOM % 100 + 1`
count=0
while read -p "Please input a number(1-100): " input_num
do
#判断用户输入的是不是数字,不是数字不计入统计次数
if ! (echo $input_num| egrep "^[0-9]+$" &>/dev/null);then
echo "Wrong input,it must be a number";continue
fi
#比较用户输入数字与num的大小
if [ $input_num -eq $num ];then
let count++
echo "Correct,the num is $num,you have guessed $count times."
break
elif [ $input_num -gt $num ];then
let count++
echo "Bigger,continue"
continue
else
let count++
echo "Smaller,continue"
continue
fi
done
6 jumpserver脚本
- 制作选项菜单
- 使用while true死循环,让用户只能使用选项中的功能
- 使用trap函数截获用户的中断信号,不允许用户中断退出
- 保留一个不显示的隐藏选项用户中断退出,本例为10
- 配置用户家目录下的.bashrc文件,让用户登录就调用脚本
#!/bin/bash
WEB01=172.16.1.7
WEB02=172.16.1.8
MYSQL=172.16.1.51
NFS=172.16.1.31
#菜单函数,显示菜单
function menu {
echo -e "\t\t\t1.WEB01"
echo -e "\t\t\t2.WEB02"
echo -e "\t\t\t3.MYSQL"
echo -e "\t\t\t4.NFS"
echo -e "\t\t\t5.Menu"
}
function jumpserver {
menu
#用trap截获中断信号
trap '' INT HUP TSTP QUIT
#死循环,不让用户退出,选项10是隐藏的退出后门
while true
do
read -p "请输入要连接的服务器: " INPUT
case $INPUT in
1)
ssh $WEB01
;;
2)
ssh $WEB02
;;
3)
ssh $MYSQL
;;
4)
ssh $NFS
;;
5)
clear
menu
;;
10)
break
;;
*)
echo "请输入 1|2|3|4|5"
;;
esac
done
}
jumpserver
7 统计/etc/passwd中bash的种类和出现的次数
使用关联数组存储,bash的名称做数组下标,数组的值作为bash出现的次数
#!/bin/bash
declare -A array
while read line
do
TYPE=`echo $line|awk -F ":" '{print $NF}'`
let array[$TYPE]++
done</etc/passwd
for i in ${!array[@]}
do
echo "$i:${array[$i]}"
done
8 抓阄
每人输入姓名拼音,为每个人生成一个0-99的随机数,最后选出数最大的3个人。
- 使用while true死循环循环输入
- 输入exit|q|quit退出循环
- 检查姓名重复,重复的输入数字后标
- 检查拼音输入的合法性
- 检查数字是否重复,重复重新生成
- 使用临时文件,存储所有的姓名和数字
#!/bin/bash
#生成1-99的随机数
get_rand(){
expr $RANDOM % 100
}
#信息提示函数
desc(){
echo "=============================================================="
echo "请输入姓名的汉语拼音,如果有重名,会提示在姓名后面输入数字区分"
echo -e "\t\t输入exit|q|quit退出"
echo "=============================================================="
}
desc
#生成临时文件
TEMP_file=`mktemp temp_file.XXXX`
while true
do
read -p "请输入姓名:" NAME
#如果输入退出字符,就退出循环
if [ $NAME == "exit" ] || [ $NAME == "q" ] || [ $NAME == "quit" ]
then
echo "最后选出的人是:"
sort -k2 -nr $TEMP_file | head -n 3
break
fi
#检查输入的拼音是否合法
if [[ ! $NAME =~ ^[a-Z]+[0-9]*$ ]];then
echo "不是合法的拼音,请输入姓名的汉语拼音"
continue
fi
#检查是否有姓名重复
if `grep -w $NAME $TEMP_file &>/dev/null`;then
echo "**有姓名重复,请在输入姓名后加入数字用于区分!**"
echo "当前存在重复的姓名是:"
egrep -w -o "$NAME[0-9]*" $TEMP_file
continue
fi
#用户得到随机数
NUM=`get_rand`
#如果数字有重复,就重新生成数字
while `grep -w $NUM $TEMP_file &>/dev/null`
do
NUM=`get_rand`
done
echo "$NAME $NUM" >>$TEMP_file
echo "你的数字是:$NUM"
done
rm -f $TEMP_file &> /dev/null