ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

shell 练习题【2】

2021-02-20 17:33:05  阅读:198  来源: 互联网

标签:练习题 bin varnish shell log echo #### bash


文章目录

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有