shell 练习题【2】
作者:互联网
文章目录
- 1. 查看有多少远程的 IP 在连接本机
- 2. 对 100 以内的所有正整数相加求和(1+2+3+4+...+100)
- 3. 统计13:30 到 14:30 所有访问 apache 服务器的请求有多少个?
- 4. 统计13:30 到 14:30 所有访问 apache 服务器的远程 IP 地址是什么?
- 5. 打印国际象棋棋盘
- 6. 统计每个远程 IP 访问了本机 apache 几次?
- 7. 统计当前 Linux 系统中可以登录计算机的账户有多少个?
- 8. 统计 /var/log 有多少个文件,并显示这些文件名
- 9. 自动为其它脚本添加解释器信息
- 10. 自动化部署 varnish 源码包软件
- 11. 编写 nginx 启动脚本
- 12. 自动对磁盘分区、格式化、挂载
- 13. 自动优化 Linux 内核参数
- 14. 切割 Nginx 日志文件
- 15. 检测 MySQL 数据库连接数量
- 16. 根据 md5 校验码,检测文件是否被修改
- 17. 检测 MySQL 服务是否存活
- 18. 备份 MySQL 的 shell 脚本(mysqldump版本)
- 19. 将文件中所有的小写字母转换为大写字母
- 20. 非交互自动生成 SSH 密钥文件
- 21. 检查特定的软件包是否已经安装
- 22. 监控 HTTP 服务器的状态(测试返回码)
- 23. 自动添加防火墙规则,开启某些服务或端口
- 24. 使用脚本自动创建逻辑卷
- 25. 显示 CPU 厂商信息
1. 查看有多少远程的 IP 在连接本机
#!/bin/bash
# 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)
# 使用 netstat -atn 可以查看本机所有连接的状态,-a 查看所有,
# -t 显示 tcp 连接的信息, -n 数字格式显示
# Local Address(第四列是本机的 IP 和端口信息)
# Foreign Address(第五列是远程主机的 IP 和端口信息)
# 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息
# sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数
netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c
2. 对 100 以内的所有正整数相加求和(1+2+3+4+…+100)
#!/bin/bash
# 对 100 以内的所有正整数相加求和
# seq 可以快速生成 100 个整数
sum=0
for i in `seq 100`
do
sum=$[sum+i]
done
echo "$sum"
3. 统计13:30 到 14:30 所有访问 apache 服务器的请求有多少个?
#!/bin/bash
# 统计13:30 到 14:30 所有访问 apache 服务器的请求有多少个?
# awk 使用 -F 选项指定文件内容的分隔符是/或者:
# 条件判断$7:$8大于等于13:30,并且要求,$7:$8 小于等于 14:30
# 最后使用 wc -l 统计这样的数据有多少行
awk -F "[ /:]" '$7":"$">="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log | wc -l
4. 统计13:30 到 14:30 所有访问 apache 服务器的远程 IP 地址是什么?
#!/bin/bash
awk -F "[ /:]" '$7":"$">="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log
5. 打印国际象棋棋盘
jiaming@jiaming-VirtualBox:~/Documents$ cat print_chessboard.sh
#!/bin/bash
# 打印国际象棋棋盘
# 设置两个变量 i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘
# i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列
# i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
# 棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块
for i in {1..8}
do
for j in {1..8}
do
sum=$[i+j]
if [ $[sum%2] -eq 0 ];then
echo -ne "\033[46m \033[0m"
else
echo -ne "\033[47m \033[0m"
fi
done
echo
done
6. 统计每个远程 IP 访问了本机 apache 几次?
#!/bin/bash
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log
7. 统计当前 Linux 系统中可以登录计算机的账户有多少个?
#!/bin/bash
# way 1:
grep "bash$" /etc/passwd | wc -l
# way 2:
awk -f: "/bash$/{x++}end{print x}" /etc/passwd
8. 统计 /var/log 有多少个文件,并显示这些文件名
#!/bin/bash
# 统计 /var/log 有多少个文件,并显示这些文件名
cd /var/log
sum=0
for i in `ls -r *`
do
if [ -f $i ];then
let sum++
echo "文件名:$i"
fi
done
echo "总文件数量为:$sum"
9. 自动为其它脚本添加解释器信息
#!/bin/bash
# 自动为其他脚本添加解释器信息#!/bin/bash
# 使用 grep 判断对象脚本是否已经有解释器信息,如果没有则用 sed 添加解释器以及描述信息
if ! grep -q "^#!" $1; then
sed '1i #!/bin/bash' $1
sed '2i #Description: '
fi
# 使用 vim 把对象脚本打开,光标跳转到文件第二行
vim +2 $1
10. 自动化部署 varnish 源码包软件
#!/bin/bash
# 需要提前下载 varnish-3.0.6.tar.gz
yum -y install gcc readline-devel pcre-devel
useradd -s /sbin/nologin varnish # 创建用户以及指定 shell
tar -xf varnish-3.0.6.tar.gz # 解压+指定文件
cd varnish-3.0.6
./configure --prefix=/usr/local/varnish
make && make install
cp redhat/varnish.initrc /etc/init.d/varnish
cp redhat/varnish.sysconfig /etc/sysconfig/varnish
cp redhat/varnish_reload_vcl /usr/bin/
ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/
ln -s /usr/local/varnish/bin/* /usr/bin
mkdir /etc/varnish
cp /usr/local/varnish/etc/varnish/default.vcl /etc/varnish/
uuidgen > /etc/varnish/secret
11. 编写 nginx 启动脚本
#!/bin/bash
# 本脚本编写完成后,放在 /etc/init.d/目录下,就可以被 linux 系统自动识别到该脚本
# 如果脚本名为 /etc/init.d/nginx,则 service nginx start 就可以启动服务
program=/usr/local/nginx/sbin/nginx
pid=/usr/local/nginx/logs/nginx.pid
function start {
if [ -f $pid ];then
echo "nginx is working..."
else
$program
fi
}
function status {
if [ -f $pid ];then
echo "service is working..."
else
echo "service turned off."
fi
}
function stop {
if [ -! -f $pid ];then
echo "nginx turned off."
else
$program -s stop
echo "turn off service OK!"
fi
}
case $1 in
start)
start ;;
stop)
stop ;;
restart)
stop
sleep 1
start ;;
status)
status ;;
*)
echo "Wrong parameter."
esac
12. 自动对磁盘分区、格式化、挂载
#!/bin/bash
fdisk /dev/vdb << EOF
n # 新建分区
p # 创建主分区
1 # 分区编号 1
wq # 两个回车,对整个磁盘分一个区
EOF
mkfs.xfs /dev/vdb1 # 格式化
if [ -e /data ];then # 创建挂载点目录
exit
fi
mkdir /data
# 自动挂载刚刚创建的分区,并设置开机自动挂载该分区
echo '/dev/vdb1 /data xfx defaults 1 2' >> /etc/fstab
mount -a
13. 自动优化 Linux 内核参数
#!/bin/bash
#### ⾃动优化 Linux 内核参数
#脚本针对 RHEL7
cat >> /usr/lib/sysctl.d/00‐system.conf <<EOF
fs.file‐max=65535
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535 k
ernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 5010 641280 5010 128
net.core.wmem_default=262144
net.core.wmem_max=262144
net.core.rmem_default=4194304
net.core.rmem_max=4194304
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
EOF
sysctl –p
14. 切割 Nginx 日志文件
# mkdir /data/scripts
# vim /data/scripts/nginx_log.sh
#!/bin/bash
logs_path="/usr/local/nginx/logs/"
mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
# chmod +x /data/scripts/nginx_log.sh
# crontab -e
# 0 1 * * * /data/scripts/nginx_log.sh
15. 检测 MySQL 数据库连接数量
#!/bin/bash
log_file=/var/log/mysql_count.log
user=root
passwd=123456
while :
do
sleep 2
count=`mysqladmin -u "$user" -p "$passwd" status | awk '{print $4}'`
echo "`date +%Y-%m-%d` :$count" >> $log_file
done
16. 根据 md5 校验码,检测文件是否被修改
#!/bin/bash
# 根据 md5 校验码,检测文件是否被修改
# 本示例脚本检测的是 /etc 目录下所有的 conf 结尾的文件
# 当数据被人篡改,再执行一次
# 将两次执行的结果做对比,MD5 码改变的文件,就是被人篡改的文件
for i in $(ls /etc/*.conf)
do
md5sum "$i" >> /var/log/conf_file.log
done
17. 检测 MySQL 服务是否存活
#!/bin/bash
host=192.168.51.198 # host 为你需要检测的 MySQL 主机的 IP 地址
user=root
passwd=123456
mysqladmin -h '$host' -u '$user' -p '$passwd' ping $>/dev/null
if [ $? -eq 0 ]
then
echo "MySQL is up"
else
echo "MySQL is down"
fi
18. 备份 MySQL 的 shell 脚本(mysqldump版本)
#!/bin/bash
user=root
passwd=123456
dbname=mysql
date=$(date +%Y%m%d)
# 测试备份目录是否存在,不存在则自动创建该目录
[ ! -d /mysqlbackup ] && mkdir /mysqlbackup
# 使用 mysqldump 命令备份数据库
mysqldump -u "$user" -p "$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql
19. 将文件中所有的小写字母转换为大写字母
#!/bin/bash
tr "[a-z]" "[A-Z]" < $1 # $1:文件名称
20. 非交互自动生成 SSH 密钥文件
#!/bin/bash
rm -rf ~/.ssh/{known_hosts, id_rsa*}
ssh-keygen -t RSA -N '' -f ~/.ssh/id_rsa
21. 检查特定的软件包是否已经安装
#!/bin/bash
#### 检查特定的软件包是否已经安装
if [ $#### -eq 0 ];then
echo "你需要制定⼀个软件包名称作为脚本参数"
echo "⽤法:$0 软件包名称 ..."
fi
#### $@提取所有的位置变量的值,相当于$*
for package in "$@"
do
if rpm -q ${package} &>/dev/null ;then
echo -e "${package}\033[32m 已经安装\033[0m"
else
echo -e "${package}\033[34;1m 未安装\033[0m"
fi
done
22. 监控 HTTP 服务器的状态(测试返回码)
#!/bin/bash
#### 监控 HTTP 服务器的状态(测试返回码)
#### 设置变量,url为你需要检测的⽬标⽹站的⽹址(IP 或域名),⽐如百度
url=http://http://183.232.231.172/index.html
#### 定义函数 check_http:
#### 使⽤ curl 命令检查 http 服务器的状态
#### ‐m 设置curl不管访问成功或失败,最⼤消耗的时间为 5 秒,5 秒连接服务为相应则视为⽆法连接
#### ‐s 设置静默连接,不显⽰连接时的连接速度、 时间消耗等信息
#### ‐o 将 curl 下载的⻚⾯内容导出到/dev/null(默认会在屏幕显⽰⻚⾯内容)
#### ‐w 设置curl命令需要显⽰的内容%{http_code},指定curl返回服务器的状态码
check_http()
{
status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} $url)
}
while :
do
check_http
date=$(date +%Y%m%d‐%H:%M:%S)
#### ⽣成报警邮件的内容
echo "当前时间为:$date
$url 服务器异常,状态码为${status_code}. 请尽快排查异常." > /tmp/http$$.pid
#### 指定测试服务器状态的函数,并根据返回码决定是发送邮件报警还是将正常信息写⼊⽇志
if [ $status_code -ne 200 ];then
mail -s Warning root < /tmp/http$$.pid
else
echo "$url 连接正常" >> /var/log/http.log
fi
sleep 5
done
23. 自动添加防火墙规则,开启某些服务或端口
#!/bin/bash
#### ⾃动添加防⽕墙规则,开启某些服务或端⼝(适⽤于 RHEL7)
#### 设置变量定义需要添加到防⽕墙规则的服务和端⼝号
#### 使⽤ firewall‐cmd ‐‐get‐services 可以查看 firewall ⽀持哪些服务
service="nfs http ssh"
port="80 22 8080"
#### 循环将每个服务添加到防⽕墙规则中
for i in $service do
echo "Adding $i service to firewall"
firewall‐cmd --add-service=${i}
done
#循环将每个端⼝添加到防⽕墙规则中
for i in $port
do
echo "Adding $i Port to firewall"
firewall‐cmd --add-port=${i}/tcp
done
#将以上设置的临时防⽕墙规则,转换为永久有效的规则(确保重启后有效) firewall‐cmd --runtime-to-permanent
24. 使用脚本自动创建逻辑卷
#!/bin/bash #### 使⽤脚本⾃动创建逻辑卷
#### 清屏,显⽰警告信息,创建将磁盘转换为逻辑卷会删除数据
clear
echo -e "\033[32m !!!!!!警告(Warning)!!!!!!\033[0m"
echo
echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
echo "脚本会将整个磁盘转换为 PV,并删除磁盘上所有数据!!!"
echo "This Script will destroy all data on the Disk"
echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
echo read -p "请问是否继续 y/n?:"sure
#### 测试⽤⼾输⼊的是否为 y,如果不是则退出脚本
[ $sure != y ] && exit
#### 提⽰⽤⼾输⼊相关参数(磁盘、 卷组名称等数据),并测试⽤⼾是否输⼊了这些值,如果没有输⼊,则脚本退出
read -p "请输⼊磁盘名称,如/dev/vdb:" disk
[ -z $disk ] && echo "没有输⼊磁盘名称" && exit
read -p "请输⼊卷组名称:" vg_name
[ -z $vg_name ] && echo "没有输⼊卷组名称" && exit
read -p "请输⼊逻辑卷名称:" lv_name
[ -z $lv_name ] && echo "没有输⼊逻辑卷名称" && exit
read -p "请输⼊逻辑卷⼤⼩:" lv_size
[ -z $lv_size ] && echo "没有输⼊逻辑卷⼤⼩" && exit
#### 使⽤命令创建逻辑卷
pvcreate $disk
vgcreate $vg_name $disk
lvcreate -L ${lv_size}M -n ${lv_name} ${vg_name}
25. 显示 CPU 厂商信息
#!/bin/bash
awk '/vendor_id/{print $3}' /proc/cpuinfo | uniq
标签:练习题,bin,varnish,shell,log,echo,####,bash 来源: https://blog.csdn.net/weixin_39541632/article/details/113808134