Linux运维高薪必看 | shell编程15例(三)
1、统计当前 Linux 系统中可以登录计算机的账户有多少个
#!/bin/bash # 统计当前 Linux 系统中可以登录计算机的账户有多少个 #方法 1: grep "bash$" /etc/passwd | wc -l #方法 2: awk -f: '/bash$/{x++}end{print x}' /etc/passwd
2、统计/var/log 有多少个文件,并显示这些文件名
#!/bin/bash # 统计/var/log 有多少个文件,并显示这些文件名 # 使用 ls 递归显示所有,再判断是否为文件,如果是文件则计数器加 1 cd /var/log sum=0 for i in `ls -r *` do if [ -f $i ];then let sum++
echo "文件名:$i" fi done echo "总文件数量为:$sum"
3、自动为其他脚本添加解释器信息
#!/bin/bash # 自动为其他脚本添加解释器信息#!/bin/bash,如脚本名为 test.sh 则效果如下: # ./test.sh abc.sh 自动为 abc.sh 添加解释器信息 # ./test.sh user.sh 自动为 user.sh 添加解释器信息 # 先使用 grep 判断对象脚本是否已经有解释器信息,如果没有则使用 sed 添加解释器以及描述信息 if ! grep -q "^#!" $1; then sed '1i #!/bin/bash' $1 sed '2i #Description: ' fi # 因为每个脚本的功能不同,作用不同,所以在给对象脚本添加完解释器信息,以及 Description 后还希望 # 继续编辑具体的脚本功能的描述信息,这里直接使用 vim 把对象脚本打开,并且光标跳转到该文件的第 2 行 vim +2 $1
4、自动化部署 varnish 源码包软件
#!/bin/bash # 自动化部署 varnish 源码包软件 # 本脚本需要提前下载 varnish‐3.0.6.tar.gz 这样一个源码包软件,该脚本即可用自动源码安装部署软件
yum -y install gcc readline‐devel pcre‐devel
useradd -s /sbin/nologin varnish
tar -xf varnish‐3.0.6.tar.gz cd varnish‐3.0.6
# 使用 configure,make,make install 源码安装软件包 ./configure ‐‐prefix=/usr/local/varnish
make && make install
# 在源码包目录下,将相应的配置文件拷贝到 Linux 系统文件系统中 # 默认安装完成后,不会自动拷贝或安装配置文件到 Linux 系统,所以需要手动 cp 复制配置文件 # 并使用 uuidgen 生成一个随机密钥的配置文件
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
5、编写 nginx 启动脚本
#!/bin/bash # 编写 nginx 启动脚本 # 本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本 # 如果本脚本名为/etc/init.d/nginx,则 service nginx start 就可以启动该服务 # service nginx stop 就可以关闭服务 # service nginx restart 可以重启服务 # service nginx status 可以查看服务状态
program=/usr/local/nginx/sbin/nginx
pid=/usr/local/nginx/logs/nginx.pid start(){ if [ -f $pid ];then echo "nginx 服务已经处于开启状态" else $program fi stop(){ if [ -! -f $pid ];then echo "nginx 服务已经关闭" else $program -s stop
echo "关闭服务 ok" fi } status(){ if [ -f $pid ];then echo "服务正在运行..." else echo "服务已经关闭" fi }
case $1 in start)
start;;
stop)
stop;;
restart)
stop
sleep 1
start;;
status)
status;;
*)
echo "你输入的语法格式错误" esac
6、自动对磁盘分区、格式化、挂载
#!/bin/bash # 自动对磁盘分区、格式化、挂载 # 对虚拟机的 vdb 磁盘进行分区格式化,使用<<将需要的分区指令导入给程序 fdisk # n(新建分区),p(创建主分区),1(分区编号为 1),两个空白行(两个回车,相当于将整个磁盘分一个区) # 注意:1 后面的两个回车(空白行)是必须的! fdisk /dev/vdb << EOF
n
p
1
wq
EOF
#格式化刚刚创建好的分区 mkfs.xfs /dev/vdb1
#创建挂载点目录 if [ -e /data ]; then exit fi mkdir /data
#自动挂载刚刚创建的分区,并设置开机自动挂载该分区 echo '/dev/vdb1 /data xfs defaults 1 2' >> /etc/fstab
mount -a
7、自动优化 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
kernel.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
8、切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)
#mkdir /data/scripts #vim /data/scripts/nginx_log.sh #!/bin/bash # 切割 Nginx 日志文件(防止单个文件过大,后期处理很困难) 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
9、检测 MySQL 数据库连接数量
#!/bin/bash # 检测 MySQL 数据库连接数量 # 本脚本每 2 秒检测一次 MySQL 并发连接数,可以将本脚本设置为开机启动脚本,或在特定时间段执行 # 以满足对 MySQL 数据库的监控需求,查看 MySQL 连接是否正常 # 本案例中的用户名和密码需要根据实际情况修改后方可使用 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
10、根据 md5 校验码,检测文件是否被修改
#!/bin/bash # 根据 md5 校验码,检测文件是否被修改 # 本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件 # 本脚本在目标数据没有被修改时执行一次,当怀疑数据被人篡改,再执行一次 # 将两次执行的结果做对比,MD5 码发生改变的文件,就是被人篡改的文件 for i in $(ls /etc/*.conf) do md5sum "$i" >> /var/log/conf_file.log done
11、检测 MySQL 服务是否存活
#!/bin/bash # 检测 MySQL 服务是否存活 # host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码 # 这些信息需要根据实际情况修改后方可使用 host=192.168.51.198
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
12、备份 MySQL 的 shell 脚本(mysqldump版本)
#!/bin/bash # 备份 MySQL 的 shell 脚本(mysqldump版本) # 定义变量 user(数据库用户名),passwd(数据库密码),date(备份的时间标签) # dbname(需要备份的数据库名称,根据实际需求需要修改该变量的值,默认备份 mysql 数据库)
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
13、将文件中所有的小写字母转换为大写字母
#!/bin/bash # 将文件中所有的小写字母转换为大写字母 # $1是位置参数,是你需要转换大小写字母的文件名称 # 执行脚本,给定一个文件名作为参数,脚本就会将该文件中所有的小写字母转换为大写字母 tr "[a‐z]" "[A‐Z]" < $1
14、非交互自动生成 SSH 密钥文件
#!/bin/bash # 非交互自动生成 SSH 密钥文件 # ‐t 指定 SSH 密钥的算法为 RSA 算法;‐N 设置密钥的密码为空;‐f 指定生成的密钥文件>存放在哪里 rm -rf ~/.ssh/{known_hosts,id_rsa*}
ssh‐keygen -t RSA -N '' -f ~/.ssh/id_rsa
15、检查特定的软件包是否已经安装
#!/bin/bash # 检查特定的软件包是否已经安装 if [ $# -eq 0 ];then echo "你需要制定一个软件包名称作为脚本参数" echo "用法:$0 软件包名称 ..." fi # $@提取所有的位置变量的值,相当于$* for package in "$@" do if rpm -q ${package} &>/dev/null ;then echo -e "${package}�33[32m 已经安装�33[0m" else echo -e "${package}�33[34;1m 未安装�33[0m" fi done