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  "^#!"  $1then 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
本文来源云计算就该这么学,经授权后由congtou发布,观点不代表华盟网的立场,转载请联系原作者。

发表评论