• shell练习题


      

    20、编写批量修改扩展名脚本
    
    #!/bin/bash
    # 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件 
    # 执行脚本时,需要给脚本添加位置参数
    # 脚本名  txt  doc(可以将 txt 的扩展名修改为 doc)
    # 脚本名  doc  jpg(可以将 doc 的扩展名修改为 jpg)
     
    for i in "ls *.$1"
    do
       	mv $i ${i%.*}.$2
    done  

    释:

    假设定义了一个变量为,【代码如下】:
    
    file=/dir1/dir2/dir3/my.file.txt
    
    可以用${ }分别替换得到不同的值:
    
    ${file#*/}:删掉《=最后一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    
    ${file##*/}:删掉 《= 第一个 /  及其左边的字符串:my.file.txt
    
    ${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
    
    ${file##*.}:删掉最后一个 .  及其左边的字符串:txt
    
    ${file%/*}:删掉=》最后一个  /  及其右边的字符串:/dir1/dir2/dir3
    
    ${file%%/*}:删掉=》第一个 /  及其右边的字符串:(空值)
    
    ${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
    
    ${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my
    
    
    【记忆的方法为】:
    
    # 是 去掉左边(键盘上#在 $ 的左边)
    
    %是去掉右边(键盘上% 在$ 的右边)
    
    单一符号是最小匹配;两个符号是最大匹配
    
    ${file:0:5}:提取最左边的 5 个字节:/dir1
    
    ${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
    
    也可以对变量值里的字符串作替换:
    
    ${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
    
    ${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
    

      

    18、使用死循环实时显示 eth0 网卡发送的数据包流量
    
    #!/bin/bash
    # 使用死循环实时显示 eth0 网卡发送的数据包流量 
     
    while :
    do
     	echo  '本地网卡 eth0 流量信息如下: '
      	ifconfig eth0 | grep "RX pack" | awk '{print $5}'
        ifconfig eth0 | grep "TX pack" | awk '{print $5}'
       	sleep 1
    done
    

      

    19、使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息
    
    #!/bin/bash
    # 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码
    # 本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息
    for i in `cat user.txt`
    do
       	useradd  $i
       	echo "123456" | passwd ‐‐stdin $i
    done
    
    21、使用 expect 工具自动交互密码远程其他主机安装 httpd 软件
    
    #!/bin/bash
    # 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件 
     
    # 删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机
    rm  ‐rf  ~/.ssh/known_hosts
    expect <<EOF
    spawn ssh 192.168.4.254
     
    expect "yes/no" {send "yes
    "}
    # 根据自己的实际情况将密码修改为真实的密码字串
    expect "password" {send  "密码
    "}
    expect "#" {send  "yum ‐y install httpd
    "}
    expect "#" {send  "exit
    "}
    EOF
    

      

    5、监控内存和磁盘容量,小于给定值时报警
    
    #!/bin/bash
    # 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员
     
    # 提取根分区剩余空间
    disk_size=$(df / | awk '///{print $4}')
     
    # 提取内存剩余空间
    mem_size=$(free | awk '/Mem/{print $4}')
    while :
    do
    # 注意内存和磁盘提取的空间大小都是以 Kb 为单位
    if  [  $disk_size -le 512000 -a $mem_size -le 1024000  ]
    then
        mail  ‐s  "Warning"  root  <<EOF
    	Insufficient resources,资源不足
    EOF
    fi
    done
    

      

    8、检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(使用 UID 数字对比版本)
    
    #!/bin/bash
    # 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不
    # 是,则提示您非管理员(使用 UID 数字对比版本)
    if [ $UID -eq 0 ];then
        yum ‐y install vsftpd
    else
        echo "您不是管理员,没有权限安装软件"
    fi
    

      

    9、编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 作为默认密码。
    
    #!/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"
    

      

    7、检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(使用字串对比版本)
    
    #!/bin/bash
    # 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不
    # 是,则提示您非管理员(使用字串对比版本) 
    if [ $USER == "root" ]
    then
    	yum ‐y install vsftpd
    else
        echo "您不是管理员,没有权限安装软件"
    fi
    

      

    22、一键部署 LNMP(源码安装版本)
    
    #!/bin/bash
    # 一键部署 LNMP(源码安装版本)
    menu()
    {
    clear
    echo "  ##############‐‐‐‐Menu‐‐‐‐##############"
    echo "# 1. Install Nginx"
    echo "# 2. Install MySQL"
    echo "# 3. Install PHP"
    echo "# 4. Exit Program"
    echo "  ########################################"
    }
     
    choice()
    {
      read -p "Please choice a menu[1‐9]:" select
    }
     
    install_nginx()
    {
      id nginx &>/dev/null
      if [ $? -ne 0 ];then
        useradd -s /sbin/nologin nginx
      fi
      if [ -f nginx‐1.8.0.tar.gz ];then
        tar -xf nginx‐1.8.0.tar.gz
        cd nginx‐1.8.0
        yum -y install  gcc pcre‐devel openssl‐devel zlib‐devel make
        ./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module
        make
        make install
        ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
        cd ..
      else
        echo "没有 Nginx 源码包"
      fi
    }
     
    install_mysql()
    {
      yum -y install gcc gcc‐c++ cmake ncurses‐devel perl
      id mysql &>/dev/null
      if [ $? -ne 0 ];then
        useradd -s /sbin/nologin mysql
      fi
      if [ -f mysql‐5.6.25.tar.gz ];then
        tar -xf mysql‐5.6.25.tar.gz
        cd mysql‐5.6.25
        cmake .
        make
        make install
        /usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/
    ‐‐basedir=/usr/local/mysql/
        chown -R root.mysql /usr/local/mysql
        chown -R mysql /usr/local/mysql/data
        /bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld
        chmod +x /etc/init.d/mysqld
        /bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf
        echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
        ldconfig
        echo 'PATH=$PATH:/usr/local/mysql/bin/' >> /etc/profile
        export PATH
      else
        echo  "没有 mysql 源码包"
        exit
      fi
    }
     
    install_php()
    {
    #安装 php 时没有指定启动哪些模块功能,如果的用户可以根据实际情况自行添加额外功能如‐‐with‐gd 等
    yum  -y  install  gcc  libxml2‐devel
    if [ -f mhash‐0.9.9.9.tar.gz ];then
      tar -xf mhash‐0.9.9.9.tar.gz
      cd mhash‐0.9.9.9
      ./configure
      make
      make install
      cd ..
    if [ ! ‐f /usr/lib/libmhash.so ];then
      ln -s /usr/local/lib/libmhash.so /usr/lib/
    fi
    ldconfig
    else
      echo "没有 mhash 源码包文件"
      exit
    fi
    if [ -f libmcrypt‐2.5.8.tar.gz ];then
      tar -xf libmcrypt‐2.5.8.tar.gz
      cd libmcrypt‐2.5.8
      ./configure
      make
      make install
      cd ..
      if [ ! -f /usr/lib/libmcrypt.so ];then  
        ln -s /usr/local/lib/libmcrypt.so /usr/lib/
      fi
      ldconfig
    else
      echo "没有 libmcrypt 源码包文件"
      exit
    fi
    if [ -f php‐5.4.24.tar.gz ];then
      tar -xf php‐5.4.24.tar.gz
      cd php‐5.4.24
      ./configure  ‐‐prefix=/usr/local/php5  ‐‐with‐mysql=/usr/local/mysql  ‐‐enable‐fpm    ‐‐
      enable‐mbstring  ‐‐with‐mcrypt  ‐‐with‐mhash  ‐‐with‐config‐file‐path=/usr/local/php5/etc  ‐‐with‐
      mysqli=/usr/local/mysql/bin/mysql_config
      make && make install
      /bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini
      /bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf
      cd ..
    else
      echo "没有 php 源码包文件"
      exit
    fi 
    }
     
    while :
    do
      menu
      choice
      case $select in
      1)
        install_nginx
        ;;
      2)
        install_mysql
        ;;
      3)
        install_php
        ;;
      4)
        exit
        ;;
      *)
        echo Sorry!
      esac
    done
    

      

    27、统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个
    
    #!/bin/bash
    # 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个
     
    # awk 使用‐F 选项指定文件内容的分隔符是/或者:
    # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30
    # 最后使用 wc ‐l 统计这样的数据有多少行,即多少个
    awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l
    

      

    28、统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么 
    
    #!/bin/bash
    # 统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么 
    # awk 使用‐F 选项指定文件内容的分隔符是/或者:
    # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30
    # 日志文档内容里面,第 1 列是远程主机的 IP 地址,使用 awk 单独显示第 1 列即可
    awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log
    

      

    25、查看有多少远程的 IP 在连接本机
    
    #!/bin/bash
    # 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计) 
     
    # 使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有,
    # -t仅显示 tcp 连接的信息,‐n 数字格式显示
    # Local Address(第四列是本机的 IP 和端口信息)
    # Foreign Address(第五列是远程主机的 IP 和端口信息)
    # 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息
    # sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数
    netstat -atn  |  awk  '{print $5}'  | awk  '{print $1}' | sort -nr  |  uniq -c
    

      

    23、编写脚本快速克隆 KVM 虚拟机
    
    #!/bin/bash
    # 编写脚本快速克隆 KVM 虚拟机
     
    # 本脚本针对 RHEL7.2 或 Centos7.2
    # 本脚本需要提前准备一个 qcow2 格式的虚拟机模板,
    # 名称为/var/lib/libvirt/images  /.rh7_template 的虚拟机模板
    # 该脚本使用 qemu‐img 命令快速创建快照虚拟机
    # 脚本使用 sed 修改模板虚拟机的配置文件,将虚拟机名称、UUID、磁盘文件名、MAC 地址
    # exit code:  
    #    65 ‐> user input nothing
    #    66 ‐> user input is not a number
    #    67 ‐> user input out of range
    #    68 ‐> vm disk image exists
     
    IMG_DIR=/var/lib/libvirt/images
    BASEVM=rh7_template
    read -p "Enter VM number: " VMNUM
    if [ $VMNUM -le 9 ];then
    VMNUM=0$VMNUM
    fi
     
    if [ -z "${VMNUM}" ]; then
        echo "You must input a number."
        exit 65
    elif [[  ${VMNUM} =~ [a‐z]  ]; then
        echo "You must input a number."
        exit 66
    elif [ ${VMNUM} -lt 1 -o ${VMNUM} -gt 99 ]; then
        echo "Input out of range"
        exit 67
    fi
     
    NEWVM=rh7_node${VMNUM}
     
    if [ -e $IMG_DIR/${NEWVM}.img ]; then
        echo "File exists."
        exit 68
    fi
     
    echo -en "Creating Virtual Machine disk image......	"
    qemu‐img create -f qcow2 ‐b $IMG_DIR/.${BASEVM}.img $IMG_DIR/${NEWVM}.img &> /dev/null
     
    echo -e "e[32;1m[OK]e[0m"
     
    #virsh dumpxml ${BASEVM} > /tmp/myvm.xml
    cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml
    sed -i "/<name>${BASEVM}/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
    sed -i "/uuid/s/<uuid>.*</uuid>/<uuid>$(uuidgen)</uuid>/" /tmp/myvm.xml
    sed -i "/${BASEVM}.img/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
     
    # 修改 MAC 地址,本例使用的是常量,每位使用该脚本的用户需要根据实际情况修改这些值 
    # 最好这里可以使用便利,这样更适合于批量操作,可以克隆更多虚拟机 
    sed -i "/mac /s/a1/0c/" /tmp/myvm.xml
     
    echo -en "Defining new virtual machine......		"
    virsh define /tmp/myvm.xml &> /dev/null
    echo -e "e[32;1m[OK]e[0m"
    

      

    #!/bin/bash
    # 打印国际象棋棋盘
    # 设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘
    # i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列
    # i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
    # 棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块
    # 使用 echo ‐ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块
    for i in {1..8}
    do
      	for j in {1..8}
      	do
      		sum=$[i+j]
    		if [  $[sum%2] -eq 0 ];then
     			echo -ne "33[46m  33[0m"
    		else
    			echo -ne "33[47m  33[0m"
    		fi
      	done
      	echo
    done
    

      

     

    38、切割 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
    

      

    39、检测 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
    

      

    41、检测 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
    

      

    32、统计/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"
    

      

    36、自动对磁盘分区、格式化、挂载
    
     #!/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
    

      

    35、编写 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
    

      

    #!/bin/bash
    # 判断文件或目录是否存在 
     
    if [ $# -eq 0 ] ;then
    echo "未输入任何参数,请输入参数"
    echo "用法:$0 [文件名|目录名]"
    fi
    if [ -f $1 ];then
    	echo "该文件,存在"
    	ls -l $1
    else
    	echo "没有该文件"
    fi
    if [ -d  $1 ];then
       	echo "该目录,存在"
       	ls -ld  $2
    else
       	echo "没有该目录"
    fi
    

      

    #!/bin/bash
    # 关闭 SELinux 
     
    sed -i  '/^SELINUX/s/=.*/=disabled/' /etc/selinux/config
    setenforce 0
    

      87、Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本

    #!/bin/bash
    # Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本 
     
    # 使用 trap 命令可以拦截用户通过键盘或 kill 命令发送过来的信号
    # 使用 kill ‐l 可以查看 Linux 系统中所有的信号列表,其中 2 代表 Ctrl+C
    # trap 当发现有用户 ctrl+C 希望终端脚本时,就执行 echo "暂停 10s";sleep 10 这两条命令
    # 另外用户使用命令:[ kill ‐2 脚本的 PID ] 也可以中断脚本和 Ctrl+C 一样的效果,都会被 trap 拦截
    trap 'echo "暂停 10s";sleep 10' 2
    while :
    do
    	echo "go go go"
    done
    

      使用脚本开启关闭虚拟机

    #!/bin/bash
    # 使用脚本开启关闭虚拟机 
     
    # 脚本通过调用virsh命令实现对虚拟机的管理,如果没有该命令,需要安装 libvirt‐client 软件包
    # $1是脚本的第1个参数,$2是脚本的第2个参数
    # 第1个参数是你希望对虚拟机进行的操作指令,第2个参数是虚拟机名称
    case $1 in
      list)
        virsh list --all
        ;;
      start)
        virsh start $2
        ;;
      stop)
        virsh destroy $2
        ;;
      enable)
        virsh autostart $2
        ;;
      disable)
        virsh autostart --disable $2
        ;;
      *)
        echo "Usage:$0 list"
        echo "Usage:$0 [start|stop|enable|disable]  VM_name"
        cat << EOF
        #list      显示虚拟机列表
        #start     启动虚拟机
        #stop      关闭虚拟机
        #enable    设置虚拟机为开机自启
        #disable   关闭虚拟机开机自启功能
        EOF
        ;;
    esac
    

      

    80、显示本机 Linux 系统上所有开放的端口列表

    #!/bin/bash
    # 显示本机 Linux 系统上所有开放的端口列表 
    
    # 从端口列表中观测有没有没用的端口,有的话可以将该端口对应的服务关闭,防止意外的攻击可能性
    ss -nutlp | awk '{print $1,$5}' | awk -F"[: ]" '{print "协议:"$1,"端口号:"$NF}' | grep "[0‐9]" | uniq
    

      

    81、将 Linux 系统中 UID 大于等于 1000 的普通用户都删除
    
    #!/bin/bash
    # 将 Linux 系统中 UID 大于等于 1000 的普通用户都删除 
     
    # 先用 awk 提取所有 uid 大于等于 1000 的普通用户名称
    # 再使用 for 循环逐个将每个用户删除即可
    user=$(awk -F: '$3>=1000{print $1}' /etc/passwd)
    for i in $user
    do
       	userdel -r $i
    done
    

      

    79、判断用户输入的是 Yes 或 NO
    
    #!/bin/bash
    # 判断用户输入的是 Yes 或 NO 
     
    read -p  "Are you sure?[y/n]:"  sure
    case  $sure  in
    	y|Y|Yes|YES)  
    		echo "you enter $a"
    		;;
        n|N|NO|no)
     		echo "you enter $a"
     		;;
        *)
     		echo "error";;
    esac
    

      

    76、判断用户输入的数据类型(字母、数字或其他) 

    #!/bin/bash
    # 判断用户输入的数据类型(字母、数字或其他) 
    read -p "请输入一个字符:" KEY
    case "$KEY" in
    	[a‐z]|[A‐Z])
    		echo "字母" 
    		;;
    	[0‐9])
    		echo "数字" 
    		;;
    	*)
    		echo "空格、功能键或其他控制字符"
    esac
    

      

    74、统计 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"
    

      70、自动修改计划任务配置文件

    #!/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
    

     69、设置 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
    

      

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

      

    [root@xuegod-master ~]# ip a | awk 'BEGIN{print  " 本 机 MAC 地 址 信 息 如 下 :"}{if(/inet /){print $2}}' | grep -v "127.0.0.1/8"
     本 机 MAC 地 址 信 息 如 下 :
    192.168.1.129/24
    
    [root@xuegod-master ~]# ip a | awk 'BEGIN{print  " 本 机 MAC 地 址 信 息 如 下 :"}{if(/link/ether/){print $2}}'
     本 机 MAC 地 址 信 息 如 下 :
    00:0c:29:ed:bb:ce
    

      

    62、制定目录路径,脚本自动将该目录使用 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
    

      

    51、查找 Linux 系统中的僵尸进程
    
    #!/bin/bash
    # 查找 Linux 系统中的僵尸进程
     
    # awk 判断 ps 命令输出的第 8 列为 Z 是,显示该进程的 PID 和进程命令
    ps aux | awk '{if($8 == "Z"){print $2,$11}}'
    

      

    50、删除某个目录下大小为 0 的文件
    
    #!/bin/bash
    # 删除某个目录下大小为 0 的文件
     
    #/var/www/html 为测试目录,脚本会清空该目录下所有 0 字节的文件
    dir="/var/www/html"
    find $dir -type f -size 0 -exec rm -rf {} ;
    

      

    48、使用脚本自动创建逻辑卷
    
    #!/bin/bash
    # 使用脚本自动创建逻辑卷 
     
    # 清屏,显示警告信息,创建将磁盘转换为逻辑卷会删除数据
    clear
    echo -e "33[32m           !!!!!!警告(Warning)!!!!!!33[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}
    

      

    42、备份 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
    

      

    82、使用脚本开启关闭虚拟机
    
    #!/bin/bash
    # 使用脚本开启关闭虚拟机 
     
    # 脚本通过调用virsh命令实现对虚拟机的管理,如果没有该命令,需要安装 libvirt‐client 软件包
    # $1是脚本的第1个参数,$2是脚本的第2个参数
    # 第1个参数是你希望对虚拟机进行的操作指令,第2个参数是虚拟机名称
    case $1 in
      list)
        virsh list --all
        ;;
      start)
        virsh start $2
        ;;
      stop)
        virsh destroy $2
        ;;
      enable)
        virsh autostart $2
        ;;
      disable)
        virsh autostart --disable $2
        ;;
      *)
        echo "Usage:$0 list"
        echo "Usage:$0 [start|stop|enable|disable]  VM_name"
        cat << EOF
        #list      显示虚拟机列表
        #start     启动虚拟机
        #stop      关闭虚拟机
        #enable    设置虚拟机为开机自启
        #disable   关闭虚拟机开机自启功能
        EOF
        ;;
    esac
    

      

  • 相关阅读:
    dd是___元素
    【电商8】footer mod_service
    外边距塌陷问题
    隐藏display: ____;
    判断一个32位的整数的二进制有几个1
    8 switch case
    键盘录入
    两个整数的交换
    运算符
    java 异常报错总结
  • 原文地址:https://www.cnblogs.com/linuxws/p/10777402.html
Copyright © 2020-2023  润新知