Shell 訊號處理 & Expect 免互動
阿新 • • 發佈:2020-09-01
訊號處理
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
後的expect
和send
命令都是和使用spawn
啟動的新程序進行互動。expect
通常用來等待一個程序的反饋,我們根據程序的反饋,再使用send
命令傳送對應的互動命令。send
命令接收一個字串引數,並將該引數傳送到程序。interact
命令用的其實不是很多,一般情況下使用spawn
、expect
和send
和命令就可以很好的完成我們的任務;但在一些特殊場合下還是需要使用interact
命令的,interact
命令主要用於退出自動化,進入人工互動。比如我們使用spawn
、send
和expect
命令完成了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!!!"