系统相关
首页 > 系统相关> > shell 练习题【2】

shell 练习题【2】

作者:互联网

文章目录

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