案例1:如何部署own cloud私有云仓库?(需要源码包私联)
问题:
- 搭建私有云仓库需要那些服务?
- 为什么需要5.6以上版本的PHP?
分析:
- owncloud 、php-5.6以上版本、mariadb
- 5.6版本的PHP
- :在性能上有很大的提升采用了更高效的内存管理机制,例如对 PHP 脚本执行过程中的内存分配和释放进行了优化。在 OwnCloud 中,当有大量用户同时访问和操作文件时,比如在企业环境中多个员工同时上传或下载文件,良好的内存管理可以减少内存泄漏的风险,提高服务器的响应速度和稳定性。
PHP 5.6 及以上版本修复了大量的安全漏洞。例如,在旧版本的 PHP 中可能存在一些安全隐患,如 SQL 注入漏洞(由于旧版本对输入数据验证和处理的不完善)和跨站脚本攻击(XSS)漏洞。而在 PHP 5.6 中,对数据过滤和验证机制进行了增强,如引入了新的输入过滤函数来更好地处理用户输入数据,防止恶意脚本注入。这对于 OwnCloud 来说非常重要,因为它需要处理用户的各种文件操作请求和元数据输入,这些数据如果不经过安全的处理,很容易被攻击者利用,从而危及用户文件的安全。
实现
实现解析:
- install_firewalld:关闭防火墙和selinux
- install_config:将/etc/selinux/config里的enforcing改为disadled
- Install_server:安装软件(搭建OwnCloud需要LAMP的架构支持)以及启动服务(httpd、mariadb)
- Install_owncloud:解压own cloud到当前目录,并将将owncloud下面的所有文件复制到/var/www/html中,最后再修改权限
- Install_mariadb:在Mariadb数据库中创建OwnCloud的数据库,
- Install_yum:升级yum数据库
- Install_php:重新安装PHP(5.6版本)
结果验证
案例2:提示用户输入用户名,脚本自动创建相应的帐户和密码
-
问题
- 如何输入用户名会怎么样
- 如何不输入密码会怎么样
-
分析
- 当用户不输入账户名时,,则会提示必须输入帐户名并退出脚本;
- 当用户不输入密码时,则统一使用默认密码12345
-
实现:
-
#!/bin/bash
# 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户
# 不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默
# 认的 123456 作为默认密码。
read -p "请输入用户名: " user
#使用?z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2
#没有输入用户名脚本退出后,使用$?查看的返回码为 2
if [ -z $user ];then
echo "您不需输入账户名"
exit 2
fi
#使用 stty ?echo 关闭 shell 的回显功能
#使用 stty echo 打开 shell 的回显功能
stty -echo
read -p "请输入密码: " pass
stty echo
pass=${pass:?123456}
useradd "$user"
echo "$pass" | passwd ??stdin "$user"
-
-
解析
-
- #使用‐z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2
- #没有输入用户名脚本退出后,使用$?查看的返回码为 2
- #使用 stty ‐echo 关闭 shell 的回显功能
- #使用 stty echo 打开 shell 的回显功能
-
-
验证:
案例3:使用脚本自动创建逻辑卷
流程图:
实现
#!/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}
实现解析
-
- # 清屏,显示警告信息,创建将磁盘转换为逻辑卷会删除数据
- # 测试用户输入的是否为 y,如果不是则退出脚本
- # 提示用户输入相关参数(磁盘、卷组名称等数据),并测试用户是否输入了这些值,如果没有输入,则脚本退出
- # 使用命令创建逻辑卷
6、结果验证
案例4:提示用户输入年份后判断该年是否是闰年
-
问题
- 如何该用户输入的数字不能被4整除如何?
- 如果该用户输入的不是数字如何?
-
分析
-
流程图
-
实现
#!/bin/bash
# 提示用户输入年份后判断该年是否为闰年
# 能被4整除并且并不能被100整除的年份是闰年
# 能被400整除的年份也是闰年
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
解析
-
- 用户输入为空白时,提示没有输入年份
- 用户输入为字母时,提示输入不是数字
- 用户输入是数字时,与四进行计算
结果验证
案例5:检查特定软件包否安装
-
问题
-
分析
- 软件包名称:需要检查的软件包名称,例如nginx。
- 检查方法:使用which命令来检查软件包的可执行文件是否存在。
- 输出结果:根据检查结果输出相应的提示信息
-
流程图
- 实现
-
#!/bin/bash
package_name="nginx"
rpm -qa | grep -qw $package_name
if [ $? -eq 0 ]; then
echo "$package_name is installed."
else
echo "$package_name is not installed."
fi
-
-
实现解析
-
-
- Rpm -qa 命令会列出系统中所有已经安装过的软件包
- #rpm -qa | grep -qw $package_name在rpm -qa 的输出中进行搜索
- 后续的if语句根据grep命令的退出状态来判断软件是否安装,并输出相应的信息
-
-
结果验证
案例6:用shell脚本实现统计Linux系统中与进程相关的常见数量信息
-
问题
- 如何查看Linux进程
- 如何将正在进行的进程总数、不同用户拥有的进程总数量、处于睡眠状态的进程数量、僵尸进程的数量等列举出来
-
分析
- 将进程进行循环,依次查看进程状态
- 进程状态进行一个叠加,显示进程总数
-
流程图
-
实现
-
#!/bin/bash
# 统计正在运行的进程总数
running_processes=$(ps -ef | grep -v grep | grep -c " S ")
echo "正在运行的进程总数: $running_processes"
# 统计不同用户拥有的进程数量
user_process_count=$(ps -ef | awk '{print $1}' | sort | uniq -c | awk '{print $2 " " $1}')
echo "不同用户拥有的进程数量如下:"
echo "$user_process_count"
# 统计处于睡眠状态的进程数量
sleeping_processes=$(ps -ef | grep -v grep | grep -c " Ss ")
echo "处于睡眠状态的进程数量: $sleeping_processes"
# 统计僵尸进程数量
zombie_processes=$(ps -ef | grep -v grep | grep -c " Z ")
echo "僵尸进程数量: $zombie_processes"
-
-
实现解析
-
-
- 统计正在运行的进程总数
- 首先使用 ps -ef 命令列出系统中所有的进程信息。ps -ef 会显示每个进程的详细信息,包括用户、PID(进程 ID)、PPID(父进程 ID)、CPU 使用率、内存使用率等等。
- 然后通过 grep -v grep 过滤掉包含 grep 本身的行,因为 grep 命令在查找进程时也会作为一个进程出现,如果不过滤掉会干扰统计结果
- 接着使用 grep -c " S " 统计包含状态标识为 S(代表正在运行或可运行状态)的进程行数,也就是正在运行的进程总数
- 统计正在运行的进程总数
- 统计不同用户拥有的进程数量
- 同样先使用 ps -ef 列出所有进程信息
- 接着通过 awk '{print $1}' 提取每行进程信息中的第一个字段,也就是进程所属的用户
- 然后使用 sort 对提取出的用户进行排序,以便后续进行去重统计
- 再通过 uniq -c 对排序后的用户进行去重,并统计每个用户出现的次数。这里 uniq -c 会在每行前面添加一个数字,表示该行内容出现的次数
- 最后通过 awk '{print $2 " " $1}' 重新调整输出格式,先输出用户名称,再输出该用户拥有的进程数量,并将结果存储在变量 user_process_count 中,然后输出相关信息
- 统计处于睡眠状态的进程数量
- 使用 ps -ef 列出所有进程信息
- 通过 grep -v grep 过滤掉 grep 本身的进程
- 使用 grep -c " Ss " 统计包含状态标识为 Ss(代表睡眠状态)的进程行数,也就是处于睡眠状态的进程数量grep -v grep 过滤掉 grep 本身的进程。
- 统计僵尸进程数量
- 利用 ps -ef 列出所有进程信息
- 通过 grep -v grep 过滤掉 grep 本身的进程
- 使用 grep -c " Z " 统计包含状态标识为 Z(代表僵尸状态)的进程行数,也就是僵尸进程数量,并将结果存储在变量 zombie_processes 中,最后输出该数量
-
-
结果验证
-