1. 程式人生 > 實用技巧 >Shell 訊號處理 & Expect 免互動

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 "\033[31m 紅燈亮 \033[0m"
    else
        echo -e "\033[32m 綠燈亮 \033[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 [email protected] hostname

expect "yes/no"
send "yes\r"

expect "assword"
send "1\n"

expect eof
[root@zzzwqh example]# 

PS:我們此時編寫的是 expect 指令碼,不要用 sh 4.sh 執行,可以 ./4.sh 執行,也可以 expect 4.sh 執行

  • expect 一問一答
#!/usr/bin/expect 

spawn ssh [email protected] hostname

expect {
    "yes/no" {send "yes\n";exp_continue}    
    "*assword" {send "1\n";}
}

expect eof
  • 遠端登入主機執行多條命令
[root@zzzwqh example]# cat 6.sh 
#!/usr/bin/expect 

spawn ssh [email protected]

expect {
    "yes/no" {send "yes\n";exp_continue}    
    "*assword" {send "1\n";}
}

expect {
    "#" {send "ls\n"}
}

expect {
    "*root*" {send "pwd\n"}
}

expect {
    "#" {send "exit\n"}
}

expect eof
[root@zzzwqh example]# 
  • interact(瞭解)
[root@zzzwqh example]# cat 7.sh 
#!/usr/bin/expect 

spawn ssh [email protected]

expect {
    "yes/no" {send "yes\n";exp_continue}    
    "*assword" {send "1\n";}
}

expect {
    "*zzzwqh*" {send "ls\n"}
}

expect {
    "*zzzwqh*" {send "pwd\n"}
}

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\n";exp_continue}    
    "*assword" {send "$pass\n";}
}

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\n";exp_continue}    
    "*assword" {send "$pass\n";}
}

expect eof
EOF

echo "success!!!"