shell练习

1、判断当前主机是否和远程主机是否ping通
2、进程存在
3、判断一个服务是否正常
4、输入一个用户,用脚本判断该用户是否存在
5、判断vsftpd软件包是否安装,如果没有则自动安装(yum源已配好)
6、判断当前内核主版本是否为2,且此版本是否大于等于6;如果都满足则输出当前内核版本
7、判断ftp服务是否已启动




判断当前主机是否和远程主机是否ping通

思路:
1、使用哪个命令实现ping ping -c
2、根据命令的执行结果状态来判断是否通 $?
3、根据逻辑和语法结构来编写脚本

#!/bin/bash
#name:ping.sh
#desc: 判断一个ip能否ping通
#time:2022-04-04

read -p "输入一个ip地址:" IP
#ping一个ip
ping -c1 IP  错误
if [ $? -eq 0 ];then
        echo "这个${IP}能ping通"
else
        echo "这个${IP}不能ping通"
fi

if [ $# -ne 1 ];then 拒绝非法传参
echo "$0 "&&“不能ping通”

fi
ping -c1 $1 &>/dev/null
[ $? -eq 0 ] && echo “能通” || echo “不能通”

2、进程存在,但是这个进程不一定服务正常

pgrep 与pidof 区别 pgrep 会把包含字母的所有进程打印pid pidof只打印相应的进程
1、查看进程的相关命令 ps
2、根据命令的返回状态值来判断进程是否存在
3、根据逻辑用脚本实现’

#!/bin/bash

#name:process_exits
#path:learn_shell
#usage:
#desc:judge whether the process exist
#expand:though process exist,it maybe not service.
#command-line:ps,pidof,pgrep

#定义变量
read -p "please input the process:" process
#通过命令查看进程是否存在
#ps -ef | grep $process | grep -v 'grep' &>/dev/null     **#为什么加上grep -v 'grep'**  -v除去关键字所在的行 可能会查到多条语句,而其中语#句并不是我们所需要的
pidof $process &> /dev/null
if [ $? -eq 0 ];
then
	echo "$process exist"
else
	echo  "$process isn't exist"

fi

3、判断一个服务是否正常

netstat 用于显示各种网络相关信息,如网络信息,路由表,接口状态等等
1、可以判断进程是否存在,用/etc/init.d/httpd status判断状态等方法
2、最好的方法是直接访问一下,通过访问成功和失败的返回值来判断
分析:内部服务
外部服务:wget一下 返回的数字是200 即正常启动

#!/bin/bash

#name:normal_service
#path:learn_shell
#uasge
#time:2022-04-12
#desc:judge whether the service is normal web_service
#command-line:wget

read -p "please input the service:" service
wget $service &> /dev/null
if [ $? -eq 0 ];
then
	echo "the servie is normal"
	rm -f index.*
else
	echo "the service isn't normal"
fi

拓展:判断一个服务是否正常,如果不在运行,那么请开启sshd服务
systemctl命令 – 管理系统服务
Centos7之后从init完全换成了systemd的启动方式,systemd 启动服务的机制主要是通过 systemctl 的这个系统服务管理指令来处理。
#!/bin/bash
SSHD=systemctl status sshd | grep Active | awk '{print $3}' | cut -d "(" -f2 | cut -d ")" -f1

if [ “$SSHD” == “running” ]
then
echo “sshd服务正在运行!”
else
systemctl start sshd
fi

4、输入一个用户,用脚本判断该用户是否存在

判断用户存在的指令:id + 用户名
grep -w +用户名 /etc/passwd

#!/bin/bash

#name:user_add
#path:/learn_shell
#time:2022-04-15
#desc:add user
#command-line:id,useradd

read -p "Please input a user:" user
#判断用户是否存在
id $user &> /dev/null
if [ $? -ne 0 ];
then
	#创建用户并设置密码不会写
	useradd -m li cai123456| passwd li 
else
	echo "$user already  exits"
fi

5、判断vsftpd软件包是否安装,如果没有则自动安装(yum源已配好)
#!/bin/bash

#name:install_package
#path:/learn_shell
#time:2022-04-15
#desc:
#command-line:rpm

read -p "Please input a package:" package
#查询特定的软件包
rpm -q $package &> /dev/null
if [ $? -ne 0 ];
then
	echo "installing $package..."
	yum install $package
else
	echo "$package already exist"
fi

拓展:判断多个包
read -p “请输入需要安装的软件包,多个用空格隔开:” soft1 soft2 soft3
rpm -q $soft1 &> /dev/null && “安装”

6、判断当前内核主版本是否为2,且此版本是否大于等于6;如果都满足则输出当前内核版本
查看内核版本:uname -r 去特定的列用cut kernel=`uname -r` var1=`echo $kernel | cut -d. -f1` var2=`echo $kernel | cut -d. -f2` [[ $var1 -eq 2 && $var2 -ge 6 ]] && echo $kernel || "当前版本不符合要求" [ $var1 -eq 2 -a $var2 -ge 6 ]]&& echo $kernel || "当前版本不符合要求" #**为什么一层中括号里面不能加逻辑运算符**

或者
#!/bin/bash
kernel=uname -r
test ${kernel:0:1} -eq 2 -a ${kernel:2:1} -ge 6 && echo $kernel || echo ‘不符合要求’

其他命令参考:
uname -r grep ^2.[6-9] || ‘不符合要求’

7、判断ftp服务是否已启动,如果已启动输出以下信息: service

vsftpd服务已启动:
vsftpd监听的端口是:
vsftpd的进程PID是:
service +服务

循环语句
for 循环,循环的语句已知
for 循环已知循环次数
for循环步长
for i in {1…10…2} #1-10 步长为2

不带列表循环
seq生成一个序列 seq 10

8、计算1-100奇数之和

#!/bin/bash

#name:8_odd_sum
#path:
#desc:1-100odd sum
#command-line:for

sum=0

for i in {1..100}
do
	let sum+=i	
done

echo "The odd sum of 1-100 is $sum"

continue:继续,表示循环体内下面的代码不执行,重新开始下一次循环
break:打断;马上停止执行本次循环,执行循环体后面的代码
exit:直接跳出程序

9、判断一个数是质数

#!/bin/bash

#name:9_prime
#path:
#desc:judge whether a number is prime
#command-line:for

read -p "please input a number:" number
if [ $number -le 1 ];
then
	echo "$number isn't a prime"
else
	if [ $number -eq 2 ];
	then
		echo "$number is a prime"
	else
		for i in `seq 2 $[$number-1]`
		do
			if [ $[$number%${i}] -eq 0 ];
			then
				echo "$number isn't a prime"
				exit
			fi
		done
		echo "$number is a prime"

	fi

fi

10、批量创建用户
批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123456

#!/bin/bash

#name:10_creat_new_user
#path:
#desc:
#command-line:grep,groupadd,useradd

#judge whether class is exist
grep -w class /etc/group &>/dev/null
[ $? -ne 0 ] && groupadd class
for((i=1;i<=5;i++))
do
        useradd -G class u$i
        echo 123|passwd --stdin u$i

done


11、批量新建5个用户stu1-stu5,要求这几个用户的家目录都在/rhome,提示判断该目录是否存在

#!/bin/bash

#name:11_creat_new_user
#path:
#desc:
#command-line:useradd,passwd

folder="/rhome"
#judge whether mkdir is exist
if [ ! -d "$folder" ];
then
	mkdir "$folder"
fi
#[ ! -d "$folder" ] && mkdie "$folder"

for((i=1;i<=5;i++))
do
	useradd -d /$folder/stu$i stu$i
	echo 123|passwd --stdin stu$i
done

12、写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存两个文本文件里,这是一个局域网内机器检查通讯的一个思路。
以10.1.1.1-10.1.1.10为例

13、输入一年份,判断是闰年

while循环
14、100以内的偶数和
15、写一个30秒同步一次时间,向同步服务器10.1.1.250的脚本,如果同步失败,则进行邮件报警,每次失败都报警;同步成功,也进行邮件通知,但是成功100次才通知1次。
计划任务最低1分钟
每隔30秒同步一次时间,该脚本是一个死循环
怎么向另一台服务器发送同步时间命令?rdate
发送邮件?mail

16、判断/tmp/run目录是否存在,如果不存在就建立,如果存在就删除目录里所有文件
17、判断一个路劲,判断路劲是否存在,而且输出是文件还是目录,如果链接文件,还要输出是有效

随机数
bash 默认有一个$RANDOM的变量 0~ 32767 使用set|grep RANDOM

18、写一个脚本,产生一个phonenum.txt文件,随机产生以139开头的手机号1000个,每个一行。
分析:
1、产生1000个电话号码,脚本需要循环1000次
2、139+8位,后8位随机产生,可以让每一个数字都随机产生,$[RANDOM%10] 0-9
3、将随机产生的数字分别保存到变量里,然后加上139保存到文件里

19、在上面的1000个手机号里抽奖5个幸运观众,显示出这5个幸运观众。但只显示头3个数和尾号的4个数,中间的都用*代替。

如何获得幸运观众的行号
如何取出对应行号的内容???head tail

嵌套循环
20、打印图案
5
54
543
5432
54321

expect自动应答 tcl语言
需求1server远程登录到node2上什么都不做

21、A远程登录到server上操作

shell脚本和expect结合使用
22、shell脚本和expect结合使用,在多台服务器上创建一个用户

综合案例写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上
说明:主机和密码文件已经提供。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值