zoukankan      html  css  js  c++  java
  • Shell 信号处理 & Expect 免交互

    监控脚本项目

    信号处理

    1 什么是信号
    	由键盘组合键或者 kill 命令发出操作称之为信号
        
        信号是发送给进程的,进程在收到信号后会作出默认的响应
        
    2 为何要在进程内处理信号
        进程在收到信号后会有默认的响应,
        如果我们想改变进程在接收到信号后的反应,那么需要在进程内捕捉信号执行我们自定义的操作
        
        主要的应用场景:
        	在进程内捕捉终止信号,然后忽略掉,从而达到让进程不受外界干扰正常运行完毕的效果
            
            ps:不是所有的信号都可以被捕捉,比如-9
            
            
    3、如何处理信号
    
    	trap "捕捉到信号之后要执行的命令" 信号
        trap "" 信号
        trap "" 信号1 信号2 信号3
    

    示例如

    [root@zzzwqh example]# cat 3.sh 
    #!/bin/bash
    
    trap "" INT QUIT HUP TERM TSTP
    
    clear
    n=0
    
    while :
    do
        [ $n -eq 0 ] && n=1 || n=0    
    
        if [ $n -eq 1 ];then
            echo -e "33[31m 红灯亮 33[0m"
        else
            echo -e "33[32m 绿灯亮 33[0m"
        fi
        
        sleep 0.5
        clear
    done 
    [root@zzzwqh example]#
    

    进程脱离当前会话窗口运行

    • nohup
    # 在终端 2 内
    [root@zzzwqh ~]# echo $$
    12479
    [root@zzzwqh ~]# nohup ping www.baidu.com &
    
    # 关闭终端 2
    
    # 在终端 1 内仍然可以看到进程
    [root@zzzwqh ~]# ps -ef |grep [p]ing
    root      13169      1  0 18:58 ?        00:00:00 ping www.baidu.com
    [root@zzzwqh ~]# 
    
    • setsid
    # 父进程ID 是 1
    setsid ping www.baidu.com &
    
    • (进程 &)
    # 父进程ID 是 1
    (ping www.baidu.com &)
    

    Expect 介绍

    Expect 命令

    在使用expect时,基本上都是和以下四个命令打交道:

    命令 作用
    spawn 启动新的进程
    expect 从进程接收字符串
    send 用于向进程发送字符串
    interact 允许用户交互
    • spawn命令用来启动新的进程,spawn后的expectsend命令都是和使用spawn启动的新进程进行交互。
    • expect通常用来等待一个进程的反馈,我们根据进程的反馈,再使用send命令发送对应的交互命令。
    • send命令接收一个字符串参数,并将该参数发送到进程。
    • interact命令用的其实不是很多,一般情况下使用spawnexpectsend和命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互。比如我们使用spawnsendexpect命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。

    Expect 基本使用

    [root@zzzwqh example]# cat 4.sh 
    #!/usr/bin/expect 
    
    spawn ssh root@127.0.0.1 hostname
    
    expect "yes/no"
    send "yes
    "
    
    expect "assword"
    send "1
    "
    
    expect eof
    [root@zzzwqh example]# 
    

    PS:我们此时编写的是 expect 脚本,不要用 sh 4.sh 执行,可以 ./4.sh 运行,也可以 expect 4.sh 运行

    • expect 一问一答
    #!/usr/bin/expect 
    
    spawn ssh root@127.0.0.1 hostname
    
    expect {
        "yes/no" {send "yes
    ";exp_continue}    
        "*assword" {send "1
    ";}
    }
    
    expect eof
    
    • 远程登录主机执行多条命令
    [root@zzzwqh example]# cat 6.sh 
    #!/usr/bin/expect 
    
    spawn ssh root@127.0.0.1
    
    expect {
        "yes/no" {send "yes
    ";exp_continue}    
        "*assword" {send "1
    ";}
    }
    
    expect {
        "#" {send "ls
    "}
    }
    
    expect {
        "*root*" {send "pwd
    "}
    }
    
    expect {
        "#" {send "exit
    "}
    }
    
    expect eof
    [root@zzzwqh example]# 
    
    • interact(了解)
    [root@zzzwqh example]# cat 7.sh 
    #!/usr/bin/expect 
    
    spawn ssh zzzwqh@127.0.0.1
    
    expect {
        "yes/no" {send "yes
    ";exp_continue}    
        "*assword" {send "1
    ";}
    }
    
    expect {
        "*zzzwqh*" {send "ls
    "}
    }
    
    expect {
        "*zzzwqh*" {send "pwd
    "}
    }
    
    interact
    
    [root@zzzwqh example]# 
    
    • 在 expect 脚本中定义变量
    #!/usr/bin/expect 
    set user "root"
    set pass "1"
    set ip "127.0.0.1"
    set cmd "hostname"
    
    spawn ssh $user@$ip $cmd
    
    expect {
        "yes/no" {send "yes
    ";exp_continue}    
        "*assword" {send "$pass
    ";}
    }
    
    expect eof
    
    • 把 expect 引入 shell 脚本
    #!/bin/bash
    
    user="root"
    pass="1"
    ip="127.0.0.1"
    cmd="hostname"
    
    expect << EOF
    spawn ssh $user@$ip $cmd
    
    expect {
        "yes/no" {send "yes
    ";exp_continue}    
        "*assword" {send "$pass
    ";}
    }
    
    expect eof
    EOF
    
    echo "success!!!"
    
    记录成长过程
  • 相关阅读:
    关于STM32F405的GPIO中断问题
    No section matches selector
    碳元科技估计要炸
    FreeRTOS 时间片,外部中断,任务优先级的一个疑问
    STM32之HAL库、标准外设库、LL库
    suggest braces around empty body in an 'if' statement
    快速搭建Redis缓存数据库
    Docker Centos安装Openssh
    vmdk虚拟机转换为OVF模板,导入esxi
    Redis安装及主从配置
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13596706.html
Copyright © 2011-2022 走看看