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!!!"
记录成长过程
原文地址:https://www.cnblogs.com/zzzwqh/p/13596706.html