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
后的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 root@127.0.0.1 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 root@127.0.0.1 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 root@127.0.0.1
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 zzzwqh@127.0.0.1
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!!!"
Shell 信号处理 & Expect 免交互的更多相关文章
- shell中expect免交互
expect前言观察ssh登录的交互现象有些程序难以避免的需要交互.你该如何解决脚本与程序的交互问题?名词解释期待, 预期, 盼望, 预料,料想, 指望, 希望, 要求,想, 认为一.概述 我们通过S ...
- shell编程之免交互 (不要再让你的双手过度劳累了)
shell编程之免交互 1.Here Document免交互 2.Expect免交互 3.免交互磁盘创建 1.Here Document免交互 概述: Here Document使用I/O重定向的方式 ...
- 8.shell编程之免交互
shell编程之免交互 目录 shell编程之免交互 Here Document免交互 免交互定义 Here Document变量设定 多行的注释 expect expect 定义 expect基本命 ...
- shell编程之免交互
目录: 一.Here Document 免交互 二.Expect 一.Here Document 免交互 使用I/O重定向的方式将命令列表提供给交互式程序或命令, 比如 ftp.cat 或 read ...
- Shell批量SSH免交互登录认证
脚本实现功能:批量或单个SSH免交互登录认证 脚本应用场景:当部署集群时,大多数实现要配置好管理节点与从节点的SSH免交互登录,针对这样的情况,写了下面脚本,简化工作. 脚本支持系统:Ubuntu和C ...
- expect免交互用法
一.ssh免交互远程连接linux服务器 ssh在远程连接linux系统时,会有交互,比如输入yes/no,或者需要输入密码.我们怎么避免这些交互呢!比如我们可以用telnet远程登录交换机,去备份交 ...
- shell编程-ssh免交互批量分发公钥脚本
脚本基本原理 1.控制端免交互创建秘钥和公钥: 1 ssh-keygen -t rsa -f /root/.ssh/id_rsa -N "" 2.免交互发送公钥 1 sshpass ...
- 无密钥登录的自动脚本实现(ssh-copy-id、expect免交互输入脚本)
感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息. Better Me的博客:blog.csdn.net/tantexian 如需 ...
- expect实现免交互
如果想写一个能够自动处理输入输出的脚本又不想面对C或Perl,那么expect是最好的选择.它可以用来做一些Linux下无法做到交互的一些命令操作. (1).安装和使用expect expect是不会 ...
随机推荐
- kubernets之pod的标签拓展
一 标签的拓展使用 1.1 标签的作用范围不仅仅适用于pod对node以及其他类的大部分资源同样适用 k label node node01 gpu=true k是kubectl的别名形式 同样对于n ...
- [Poi2012]Rendezvous
题目描述 给定一个n个顶点的有向图,每个顶点有且仅有一条出边. 对于顶点i,记它的出边为(i, a[i]). 再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y: 从顶点a沿着 ...
- docker mysql 设置忽略大小写
使用docker 安装mysql时 Linux下是默认不忽略大小写,导致操作数据库的时候会报如下错误 为了解决上面的问题,我们在创建MySQL容器的时候就需要初始化配置 lower_case_ta ...
- RecyclerView 源码分析(二) —— 缓存机制
在前一篇文章 RecyclerView 源码分析(一) -- 绘制流程解析 介绍了 RecyclerView 的绘制流程,RecyclerView 通过将绘制流程从 View 中抽取出来,放到 Lay ...
- inode占满导致No space left on device inode快速解决方法
暂未发现其他比我这个更快的方法. 因为其他方法会展示那个非常卡的目录,导致效率极低.而我这个方法不会去展示那个目录. 查找占用的目录 find / -type d -size +1M -maxdept ...
- django中的几种返回模版的方式
redirect方法-----(重定向) # 首先导入redirect方法, from django.shortcuts import redirect 在函数中写一个返回值 return redir ...
- file转化为binary对象发送给后台
具体代码如下: function filechange(e) { var file = $('#filed').get(0).files[0]; var fileSize = file.size, f ...
- Kubernetes调整Node节点快速驱逐pod的时间
在高可用的k8s集群中,当Node节点挂掉,kubelet无法提供工作的时候,pod将会自动调度到其他的节点上去,而调度到节点上的时间需要我们慎重考量,因为它决定了生产的稳定性.可靠性,更快的迁移可以 ...
- 【题解】洛谷P3119 Grass Cownoisseur G
题面:洛谷P3119 Grass Cownoisseur G 本人最近在熟悉Tarjan的题,刷了几道蓝题后,我飘了 趾高气扬地点开这道紫题,我一瞅: 哎呦!这不是分层图吗? 突然就更飘了~~~ 用时 ...
- python 百分比的计算打印
在做压测的时候常常需要统计测试成功率,简单的例子如下: count = 89i = 100print("測試次數:%d"%count)print("測試成功率:%.2f% ...