当前位置 : 主页 > 编程语言 > java >

shell 练习题【3】

来源:互联网 收集:自由互联 发布时间:2022-06-23
文章目录 ​​1. 删除某个目录下大小为 0 的文件​​ ​​2. 查找 Linux 系统中的僵尸进程​​ ​​3. 提示用户输入年份后判断该年是否为闰年​​ ​​4. 生成随机密码(urandom 版本)​


文章目录

  • ​​1. 删除某个目录下大小为 0 的文件​​
  • ​​2. 查找 Linux 系统中的僵尸进程​​
  • ​​3. 提示用户输入年份后判断该年是否为闰年​​
  • ​​4. 生成随机密码(urandom 版本)​​
  • ​​5. 生成随机密码(字串截取版本)​​
  • ​​6. 生成随机密码(UUID 版本,16 进制密码)​​
  • ​​7. 生成随机密码(进程 ID 版本,数字密码)​​
  • ​​8. 测试用户名与密码是否正确​​
  • ​​9. 循环测试用户名与密码是否正确​​
  • ​​10. Shell 脚本的 fork 炸弹​​
  • ​​11. 批量下载有序文件(pdf、图片、视频等)​​
  • ​​12. 显示当前计算机中所有账户的用户名称​​
  • ​​13.指定目录路径,脚本自动将该目录使用 tar 命令打包备份到 /data 目录​​
  • ​​14. 显示进度条(回旋镖版)​​
  • ​​15. 安装 LAMP 环境(yum 版本)​​
  • ​​16. 循环关闭局域网中所有主机​​
  • ​​17. 获取本机 MAC 地址​​
  • ​​18. 自动配置 rsynd 服务器的配置文件 rsyncd.conf​​
  • ​​19. 修改 Linux 系统的最大打开文件数量​​
  • ​​20. 设置 Python ⽀持⾃动命令补⻬功能​​
  • ​​21. 自动修改计划任务配置文件​​
  • ​​22. 使用脚本循环创建三位数字的文本文件(111-999的文件)​​
  • ​​23. 找出 /etc/passwd 中能登录的用户,并将对应再 /etc/shadow 中第二列密码提出处理​​
  • ​​24. 统计 /etc/passwd 中 root 出现的次数​​
  • ​​25. 统计 Linux 进程相关数量信息​​

1. 删除某个目录下大小为 0 的文件

#!/bin/bash
dir="/var/www/html"
find $dir -type f -size 0 -exec rm -rf {} \;

2. 查找 Linux 系统中的僵尸进程

#!/bin/bash
ps aux | awk '{if($8 == "Z"){print $2, $11}}'

3. 提示用户输入年份后判断该年是否为闰年

#!/bin/bash
read -p "请输入一个年份:" year

if [ "$year" = "" ]; then
echo "没有输入年份"
exit
fi
# 使用正则测试变量 year 中是否包含大小写字母
if [[ "$year" =~ [a-Z] ]]; then
echo "你输入的不是数字"
exit
fi
# 判断是否为闰年
if [ $[year % 4] -eq 0 ] && [ $[year % 100] -ne 0 ]; then
echo "$year年是闰年"
elif [ $[year % 400] -eq 0 ]; then
echo "$year年是闰年"
else
echo "$year年不是闰年"
fi

4. 生成随机密码(urandom 版本)

#!/bin/bash
# /dev/urandom 文件是 Linux 内置的随即设备文件
# tr -dc '_A-Za-z0-9' < /dev/urandom 将随机文件中其它的字符删除,仅保留大小写字母,数字,下划线
# head 命令,显示头部 xx 字节
tr -dc '_A-Za-z0-9' < /dev/urandom | head -c 10

5. 生成随机密码(字串截取版本)

#!/bin/bash
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
num=${#key}
#### 设置初始密码为空
pass=''
#### 循环 8 次,⽣成随机密码
#### 每次都是随机数对密码库的⻓度取余,确保提取的密码字符不超过密码库的⻓度
#### 每次循环提取⼀位随机密码,并将该随机密码追加到 pass 变量的最后
for i in {1..8}
do
index=$[RANDOM%num] pass=$pass${key:$index:1}
done
echo $pass

6. 生成随机密码(UUID 版本,16 进制密码)

#!/bin/bash
uuidgen

7. 生成随机密码(进程 ID 版本,数字密码)

#!/bin/bash
echo $$

8. 测试用户名与密码是否正确

#!/bin/bash
#### 测试⽤⼾名与密码是否正确
#⽤⼾名为 tom 并且密码为 123456,则提⽰登录成功,否则提⽰登录失败
read -p "请输⼊⽤⼾名:" user
read -p "请输⼊密码:" pass
if [ "$user" == 'tom' -a "$pass" == '123456' ];then
echo "Login successful"
else
echo "Login Failed"
fi

9. 循环测试用户名与密码是否正确

#!/bin/bash
#### 循环测试⽤⼾名与密码是否正确
#### 循环测试⽤⼾的账⼾名和密码,最⼤测试 3 次,输⼊正确提⽰登录成功,否则提⽰登录失败
#### ⽤⼾名为 tom 并且密码为 123456
for i in {1..3}
do
read -p "请输⼊⽤⼾名:" user
read -p "请输⼊密码:" pass
if [ "$user" == 'tom' -a "$pass" == '123456' ];then
echo "Login successful"
exit
fi
done
echo "Login Failed"

10. Shell 脚本的 fork 炸弹

#!/bin/bash
# 快速消耗计算机资源,至使计算机死机

.(){ .|.& };.

11. 批量下载有序文件(pdf、图片、视频等)

#!/bin/bash
#### 批量下载有序⽂件(pdf、 图⽚、 视频等等)
#### 本脚本准备有序的⽹络资料进⾏批量下载操作(如 01.jpg,02.jpg,03.jpg)
#### 设置资源来源的域名连接
url="http://www.baidu.com/" echo "开始下载..."
sleep 2
type=jpg
for i in `seq 100`
do
echo "正在下载$i.$type"
curl $url/$i.$type -o /tmp/${i}$type
sleep 1
done #curl 使⽤-o 选项指定下载⽂件另存到哪⾥.

12. 显示当前计算机中所有账户的用户名称

#!/bin/bash
#### 显⽰当前计算机中所有账⼾的⽤⼾名称
#### 下⾯使⽤3种不同的⽅式列出计算机中所有账⼾的⽤⼾名
#### 指定以:为分隔符,打印/etc/passwd ⽂件的第 1 列
awk -F: '{print $1}' /etc/passwd
#### 指定以:为分隔符,打印/etc/passwd ⽂件的第 1 列
cut -d: -f1 /etc/passwd
#### 使⽤ sed 的替换功能,将/etc/passwd ⽂件中:后⾯的所有内容替换为空(仅显⽰⽤⼾名)
sed 's/:.*//' /etc/passwd

13.指定目录路径,脚本自动将该目录使用 tar 命令打包备份到 /data 目录

#!/bin/bash
#### 制定⽬录路径,脚本⾃动将该⽬录使⽤ tar 命令打包备份到/data⽬录
[ ! -d /data ] && mkdir /data
[ -z $1 ] && exit
if [ -d $1 ];then
tar -czf /data/$1.-`date +%Y%m%d`.tar.gz $1
else
echo "该⽬录不存在"
fi

14. 显示进度条(回旋镖版)

#!/bin/bash
#### 显⽰进度条(回旋镖版)
while :
do
clear
for i in {1..20}
do
echo ‐e "\033[3;${i}H*"
sleep 0.1
done
clear
for i in {20..1}
do
echo ‐e "\033[3;${i}H*"
sleep 0.1
done
clear
done

15. 安装 LAMP 环境(yum 版本)

#!/bin/bash
#### 安装 LAMP 环境(yum 版本)
#### 本脚本适⽤于 RHEL7(RHEL6 中数据库为 mysql)
yum makecache &>/dev/null
num=$(yum repolist | awk '/repolist/{print $2}' | sed 's/,//')
if [ $num -lt 0 ];then
yum -y install httpd
yum -y install mariadb mariadb-server mariadb-devel
yum -y install php php-mysql
else
echo "未配置 yum 源..."
fi

16. 循环关闭局域网中所有主机

#!/bin/bash
#### 循环关闭局域⽹中所有主机
#### 假设本机为 192.168.4.100,编写脚本关闭除⾃⼰外的其他所有主机
#### 脚本执⾏,需要提前给所有其他主机传递 ssh 密钥,满⾜⽆密码连接
for i in {1..254}
do
[ $i -eq 100 ] && continue
echo "正在关闭 192.168.4.$i..."
ssh 192.168.4.$i poweroff
done

17. 获取本机 MAC 地址

#!/bin/bash
#### 获取本机 MAC 地址
ip a s | awk 'BEGIN{print " 本 机 MAC 地 址 信 息 如 下 :"}/^[0‐9]/{print $2;getline;if($0~/link\/ether/){print $2}}' | grep -v lo:

#### awk 读取 ip 命令的输出,输出结果中如果有以数字开始的⾏,先显⽰该⾏的地 2 列(⽹卡名称), #### 接着使⽤ getline 再读取它的下⼀⾏数据,判断是否包含 link/ether
#### 如果保护该关键词,就显⽰该⾏的第 2 列(MAC 地址)
#### lo 回环设备没有 MAC,因此将其屏蔽,不显⽰

18. 自动配置 rsynd 服务器的配置文件 rsyncd.conf

#!/bin/bash #### ⾃动配置 rsynd 服务器的配置⽂件 rsyncd.conf
#### See rsyncd.conf man page for more options.

[ ! -d /home/ftp ] && mkdir /home/ftp
echo 'uid = nobody
gid = nobody
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
[ftp]
path = /home/ftp
comment = share' > /etc/rsyncd.conf

19. 修改 Linux 系统的最大打开文件数量

#!/bin/bash
#### 修改 Linux 系统的最⼤打开⽂件数量
#### 往/etc/security/limits.conf ⽂件的末尾追加两⾏配置参数,修改最⼤打开⽂件数量为 65536 cat >> /etc/security/limits.conf <<EOF
* soft nofile 65536
* hard nofile 65536
* EOF

20. 设置 Python ⽀持⾃动命令补⻬功能

#!/bin/bash
#### 设置 Python ⽀持⾃动命令补⻬功能
#### Summary:Enable tab complete for python
#### Description:
Needs import readline and rlcompleter module
#
import readline
#
import rlcompleter
#
help(rlcompleter) display detail: readline.parse_and_bind('tab: complete')
#
man python display detail: PYTHONSTARTUP variable
if [ ! -f /usr/bin/tab.py ];then
cat >> /usr/bin/tab.py <<EOF
import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
EOF
fi
sed -i '$a export PYTHONSTARTUP=/usr/bin/tab.py' /etc/profile
source /etc/profile

21. 自动修改计划任务配置文件

#!/bin/bash
#### ⾃动修改计划任务配置⽂件
read -p "请输⼊分钟信息(00‐59):" min
read -p "请输⼊⼩时信息(00‐24):" hour
read -p "请输⼊⽇期信息(01‐31):" date
read -p "请输⼊⽉份信息(01‐12):" month
read -p "请输⼊星期信息(00‐06):" weak
read -p "请输⼊计划任务需要执⾏的命令或脚本:" program
echo "$min $hour $date $month $weak $program" >> /etc/crontab

22. 使用脚本循环创建三位数字的文本文件(111-999的文件)

#!/bin/bash #### 使⽤脚本循环创建三位数字的⽂本⽂件(111-999 的⽂件)
for i in {1..9} do
for j in {1..9} do
for k in {1..9} do
touch /tmp/$i$j$k.txt
done
done
done

23. 找出 /etc/passwd 中能登录的用户,并将对应再 /etc/shadow 中第二列密码提出处理

#!/bin/bash #### 找出/etc/passwd 中能登录的⽤⼾,并将对应在/etc/shadow 中第⼆列密码提出处理

user=$(awk -F: '/bash$/{print $1}' /etc/passwd)
for i in $user
do
awk -F: -v x=$i '$1==x{print $1,$2}' /etc/shadow
done

24. 统计 /etc/passwd 中 root 出现的次数

#!/bin/bash
#### 统计/etc/passwd 中 root 出现的次数
# 每读取⼀⾏⽂件内容,即从第 1 列循环到最后 1 列,依次判断是否包含 root 关键词,如果包含则 x++ awk -F: '{i=1;while(i<=NF){if($i~/root/){x++};i++}} END{print "root 出现次数为"x}' /etc/passwd

25. 统计 Linux 进程相关数量信息

#!/bin/bash
#### 统计 Linux 进程相关数量信息
running=0
sleeping=0
stoped=0
zombie=0
#### 在 proc ⽬录下所有以数字开始的都是当前计算机正在运⾏的进程的进程 PID
#### 每个 PID 编号的⽬录下记录有该进程相关的信息
for pid in /proc/[1‐9]*
do
procs=$[procs+1]
stat=$(awk '{print $3}' $pid/stat)
#### 每个 pid ⽬录下都有⼀个 stat ⽂件,该⽂件的第 3 列是该进程的状态信息
case $stat in
R)
running=$[running+1]
;;
T)
stoped=$[stoped+1]
;;
S)
sleeping=$[sleeping+1]
;;
Z)
zombie=$[zombie+1]
;;
esac
done
echo "进程统计信息如下"
echo "总进程数量为:$procs"
echo "Running 进程数为:$running"
echo "Stoped 进程数为:$stoped"
echo "Sleeping 进程数为:$sleeping"
echo "Zombie 进程数为:$zombie"


网友评论