基础知识

expect基础知识

  • exp_continue是匹配一行后,从当前expect块第一行开始匹配
  • expect块的每一行匹配后,直接退出当前expect块,往下一个expect块开始匹配
  • expect块需要send的信息中包含双引号 ”“ ,需要进行 \ 转义

shell基础知识

脚本其实就是短小的、用来让计算机自动化完成一系列工作的程序,这类程序可以用文本编辑器修改,不需要编译,通常是解释运行的。

变量

用语句给变量赋值

  1. for file in `ls /etc`

  2. for file in $(ls /etc)

  3. ip=`awk '{ print $1 }' iplist` # 变量能重新赋值,使用变量可以用$ip、${ip}

  4. ip=$(awk '{ print $1 }' iplist)

函数

  • 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
  • 在函数体内部,当n>=10时,需要使用${n}来获取参数。
  • 函数返回值在调用该函数后通过 $? 来获得。

处理参数列表

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$@与$*加引号时区别:$@在引号中返回每个参数

  1. #!/usr/bin/bash
  2. source ./color.sh
  3.  
  4. # "$*"
  5. echo -e "${RED}\"$ *\":"
  6. for i in "$*";do
  7. echo -e "${RED}$i${CLOSE_ALL}"
  8. done
  9.  
  10. echo -e "\n"
  11.  
  12. # "$@"
  13. echo -e "${BLUE}\"$ @\":"
  14. for i in "$@";do
  15. echo -e "${BLUE}$i${CLOSE_ALL}"
  16. done

test.sh

结果截图

输入/输出重定向

输入/输出重定向列表

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

实例

  1. $ command1 < infile > outfile

同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。

  1. $ command > file >&1
    $ find /etc -name "*.txt"  > list 2>&1

stdout 和 stderr 合并后重定向到 file。先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list。此时屏幕不显示信息,在list中显示,通过cat list查看。

  1. $ command >& > file
    $ find /etc -name "*.txt"  2>&1 >list

stderr重定向到stdout,stdout重定向到file。先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,

因此第二步重定向stdout,对stdout的拷贝不产生任何影响。此时屏幕会输出错误信息,标准输出在list中显示,通过cat list查看。

  1. $ command > /dev/null >&

屏蔽 stdout 和 stderr,不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null。/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。

文件包含

  1. . filename
  2.  
  3.  
  4. source filename

包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。如实例中batch.sh通过source包含color.sh脚本。

实例1、批量登录远程Linux服务器

包括4个文件:batch.sh(批量管理expect登录脚本)color.sh(颜色脚本)、sshLogin.exp(expect登录脚本)、iplist(用于登录的IP、用户名和用户密码)

batch.sh(批量管理expect登录脚本)

  1. #!/usr/bin/bash
  2.  
  3. source ./color.sh
  4.  
  5. callSSH() {
  6. # $$:pid $:filename $:username $:ip $:password
  7. echo -e "$GREEN Param init(pid: $$): $1 $2 $3 $4 $CLOSE_ALL"
  8. expect $ $ $ $
  9. return $?
  10. }
  11.  
  12. sshManage() {
  13. i=
  14. for ip in `awk 'NR>2 {print $1}' iplist`
  15. do
  16. user=$(awk -v IP=$ip '{if(IP==$1) print $2}' iplist)
  17. password=`awk -v IP=$ip '{if(IP==$1) print $3}' iplist`
  18.  
  19. if [ $i -le ]
  20. then
  21. i="0$i"
  22. else
  23. i="$i"
  24. fi
  25.  
  26. echo -e "$BLUE<<-------------- Login $ip($i) begin -------------->>$CLOSE_ALL"
  27. callSSH sshLogin.exp $user $ip $password
  28. echo -e "${BLUE}return_value = $? $CLOSE_ALL"
  29. echo -e "$BLUE<<-------------- Login $ip($i) end-------------->>$CLOSE_ALL"
  30. let "i++"
  31. done
  32. }
  33.  
  34. echo -e "$RED<<<<<<<<<<<<<<<<<<<<<< sshManage begin >>>>>>>>>>>>>>>>>>>>>>$CLOSE_ALL"
  35. sshManage
  36. echo -e "$RED<<<<<<<<<<<<<<<<<<<<<< sshManage end >>>>>>>>>>>>>>>>>>>>>>$CLOSE_ALL"

batch.sh

color.sh(颜色脚本)

  1. #!/usr/bin/bash
  2.  
  3. # Example:
  4. # echo -e "\033[字背景颜色;文字颜色m 字符串 \033[0m"
  5. # echo -e "\033[41;36m something here \033[0m"
  6. # echo -e "$RED something here $CLOSE_ALL"
  7.  
  8. # font color: -
  9. BLACK="\033[30m" # 黑色
  10. RED="\033[31m" # 红色
  11. GREEN="\033[32m" # 绿色
  12. YELLOW="\033[33m" # 黄色
  13. BLUE="\033[34m" # 蓝色
  14. PURPLE="\033[35m" # 紫色
  15. SKY_BLUE="\033[36m" # 天蓝色
  16. WHITE="\033[37m" # 白色
  17.  
  18. # blackground color: -
  19. BLACK_WHITE="\033[40;37m" # 黑底白字
  20. RED_WHITE="\033[41;37m" # 红底白字
  21. GREEN_WHITE="\033[42;37m" # 绿底白字
  22. YELLOW_WHITE="\033[43;37m" # 黄底白字
  23. BLUE_WHITE="\033[44;37m" # 蓝底白字
  24. PURPLE_WHITE="\033[45;37m" # 紫底白字
  25. SKY_BLUE_WHITE="\033[46;37m" # 天蓝底白字
  26. WHITE_BLACK="\033[47;30m" # 白底黑字
  27.  
  28. # Control options
  29. CLOSE_ALL="\033[0m" # 关闭所有属性
  30. HIGH_BRIGHTNESS="\33[1m"  # 设置高亮度
  31. UNDERLINE="\33[4m"  # 下划线
  32. FLICKER="\33[5m"  # 闪烁
  33. REVERSE_DISPLAY="\33[7m"  # 反显
  34. SET_FOREGROUND="\33[30m — \33[37m" # 设置前景色
  35. SET_BACKGROUND="\33[40m — \33[47m" # 设置背景色
  36. SET_CURSOR_POS="\33[y;xH" # 设置光标位置
  37. N_CURSOR_UP="\33[nA"  # 光标上移n行
  38. N_CURSOR_DOWN="\33[nB"  # 光标下移n行
  39. N_CURSOR_RIGHT="\33[nC"  # 光标右移n行
  40. N_CURSOR_LEFT="\33[nD"  # 光标左移n行
  41. CURSOR_POS_SAVE="\33[s"  # 保存光标位置
  42. CURSOR_POS_RECOVER="\33[u"  # 恢复光标位置
  43. CURSOR_HIDE="\33[?25l"  # 隐藏光标
  44. CURSOR_DISPLAY="\33[?25h"  # 显示光标
  45. CLEAR_SCREEN="\33[2J"  # 清屏
  46. CLEAR_CONTENT="\33[K"  # 清除从光标到行尾的内容

color.sh

sshLogin.exp(expect登录脚本)

  1. #!/usr/bin/expect
  2.  
  3. if { $argc != } {
  4. send -- "Usage: expect sshLogin.exp username ip password\n"
  5. exit
  6. }
  7.  
  8. #Param
  9. set userName [lindex $argv ]
  10. set IP [lindex $argv ]
  11. set password [lindex $argv ]
  12. set timeout
  13.  
  14. spawn ssh -P22 $userName@$IP
  15. expect {
  16. eof { exit }
  17. timeout { exit }
  18. "*password*" { send -- "$password\n" }
  19. "*(yes/no)?*" { send -- "yes\n";exp_continue }
  20. }
  21.  
  22. expect {
  23. eof { exit }
  24. timeout { exit }
  25. "*#*" { send -- "find /etc -names \"*.txt\" >list 2>&1\n" }
  26. }
  27.  
  28. expect {
  29. eof { exit }
  30. timeout { exit }
  31. "*#*" { send -- "cat list\n" }
  32. }
  33.  
  34. set timeout
  35. expect {
  36. eof { exit }
  37. timeout { exit }
  38. "*#*" { send -- "\n" }
  39. }
  40.  
  41. expect {
  42. eof { exit }
  43. timeout { exit }
  44. "*#*" { send -- "exit\n" }
  45. }
  46. expect eof
  47. exit

sshLogin.sh

iplist(用于登录的IP、用户名和用户密码)

  1. #ip username password
  2.  
  3. 10.10.3.128 root ******
  4. 10.10.1.21 root ******

iplist

结果截图

实例2、批量激活脚本

  1. #!/bin/bash
  2. chmod spv*.bin
  3. ./spv*.bin
  4. echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
  5. eth=`ifconfig |awk '{print $1}' | awk 'NR==1{print}' | awk -F':' '{print $1}'`
  6. ip=`ifconfig $eth | grep netmask |awk '{print $2}'| awk -F '.' '{print $4}'`
  7. mv /tmp/spv_License/spv_License/License$ip.txt /home/spv/config/spvlicense
  8. chown apache.apache /home/spv/config/spvlicense
  9.  
  10. mysql -uuser -ppassword dbname -e "insert into user_role (userID,roleID) values (100,1);"
  11.  
  12. #echo "first code is:"
  13. #cat /tmp/spv_License/spv_License/
  14. code=`cat /tmp/spv_License/spv_License/$ip\_license.txt`
  15. #echo "first code is:$code"
  16. echo -e "\033[35m first code is:$code \033[0m"
  17.  
  18. #echo "please reboot this hac now"
  19. if [ $? == ];
  20. then
  21. echo -e "\033[35m Import license success,please reboot this hac now. \033[0m"
  22. else
  23. echo -e "\033[31m Import license failure,please Import license by yourself ! \033[0m"
  24. fi
  1. /tmp/spv_License/spv_License目录下的文件,包含所有的激活文件。

eth为ifconfig下的第一列中的第一行以逗号分隔的第一个字段。也就是eth0。

ip为ifconfig eth0下的查找关键字netmask所在行的第二个字段下以逗号分隔的第四个字段,也就是126。

连接MySQL数据库,执行SQL:mysql -uuser -ppassword -e " sql "

chown将spvlicense文件的拥有者改为apache.apache

  1.  

很有用的shell脚本的更多相关文章

  1. 一个有用的shell脚本

    #!/bin/bash #if [ $1 -eq null ]; then # echo "please input params1!" # exit #fi #if [ $2 - ...

  2. Shell脚本编程的常识

    (这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用) 七种文件类型 d            目录                                       ...

  3. shell脚本编程常识

    (这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用) 七种文件类型 d            目录                                       ...

  4. SHELL脚本编程的常识和VI常用技巧

    来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...

  5. Shell脚本学习指南 [ 第一、二章 ] 背景知识、入门

    摘要:第一章介绍unix系统的发展史及软件工具的设计原则.第二章介绍编译语言与脚本语言的区别以及两个相当简单但很实用的Shell脚本程序,涵盖范围包括了命令.选项.参数.Shell变量.echo与pr ...

  6. nginx日志切割(logrotate或shell脚本)

    nginx自己不会对日志文件进行切割,可以通过两种不同的方式进行,分别是:通过logrotate和通过shell脚本. 如果是yum方式安装的nginx,系统默认会自动通过logrotate这个日志管 ...

  7. Shell脚本实现每个工作日定时执行指定程序

    我们可能会遇到这样的情景:必须在每个工作日定时执行Linux服务器上的某个程序.那么有没有办法实现这一功能呢?答案是肯定的.我们可以运用Shell脚本简单实现这一功能. 原理很简单,Shell脚本内部 ...

  8. 【转】shell脚本写的俄罗斯方块游戏

    亲测一个很好玩的shell脚本写的俄罗斯方块游戏,脚本来自互联网 先来讲一下思维流程 一.方块的表示 由于shell不能定义二维数组,所以只能用一维数组表示方块,俄罗斯方块主要可以分为7类,每一类方块 ...

  9. 统计网卡流量的两段shell脚本(使用ifconfig)

    一个很小巧的shell脚本,使用ifconfig的不间断输出来统计网卡的流量,有需要的朋友可以参考下 使用shell脚本计算Linux网卡流量,方法中最关键点: ifconfig $eth_name ...

随机推荐

  1. linux编译gpu_flow

    因为需要做双流,论文里面推荐到这个GPU版本的TVL1算法,于是开始编译. 一.下载源码 git clone https://github.com/feichtenhofer/gpu_flow.git ...

  2. SpringBoot: 8.整合freemarker(转)

    1.创建maven项目,添加pom依赖 <!--springboot项目依赖的父项目--> <parent> <groupId>org.springframewor ...

  3. [SOME_MUTATION] (state) {// mutate state}Vuex中使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名

    使用常量替代 Mutation 事件类型 使用常量替代 mutation 事件类型在各种 Flux 实现中是很常见的模式.这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可 ...

  4. Android OKHttp 可能你从来没用过的拦截器 【实用推荐】

    前言 在平时开发中,你有没有下面这样的困扰呢? 场景一 明明是服务端的接口数据错误,而QA(测试)第一个找到的可能是客户端开发的你,为什么这个页面出现错误了? 而作为客户端开发的你,可能要拿出测试机连 ...

  5. poj1905 Expanding Rods(二分)

    题目链接:https://vjudge.net/problem/POJ-1905 题意:有一根长len的木棍,加热了n度,长度会膨胀为len*(1+n*c),c为膨胀系数.现在把这根木棍夹在两堵墙之间 ...

  6. java8 用法小结

    一 简单的stream parallelStream慎用,除非你知道它内部干了什么 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, ...

  7. 使用Minikube运行一个本地单节点Kubernetes集群

    使用Minikube是运行Kubernetes集群最简单.最快捷的途径,Minikube是一个构建单节点集群的工具,对于测试Kubernetes和本地开发应用都非常有用. ⒈安装Minikube Mi ...

  8. 1-python django的创建

    一.Virtualenv(我的python环境是3.7) 1.虚拟环境创建(针对python版本和django的版本不一致的) 输入 pip install virtuallenv ,看到如下信息就是 ...

  9. python中property属性的介绍及其应用

    Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的 ...

  10. drf的三大认证

    目录 三大认证任务分析 auth组件的认证权限六表 自定义User表分析 源码分析 认证与权限工作原理 源码分析 认证模块工作原理 权限模块工作原理 admin关联自定义用户表 自定义认证.权限类 用 ...