shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd、scp

对自动部署免去用户交互很痛苦,expect能很好的解决这类问题。

expect的核心是spawn expect send set

spawn 调用要执行的命令
expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
send 发送需要交互的值,替代了用户手动输入内容
set 设置变量值
interact  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof  这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

设置expect永不超时
set timeout -1

设置expect 300秒超时,如果超过300没有expect内容出现,则推出
set timeout 300

expect编写语法,expect使用的是tcl语法。

一条Tcl命令由空格分割的单词组成. 其中, 第一个单词是命令名称, 其余的是命令参数
cmd arg arg arg

$符号代表变量的值. 在本例中, 变量名称是foo.
$foo

方括号执行了一个嵌套命令. 例如, 如果你想传递一个命令的结果作为另外一个命令的参数, 那么你使用这个符号
[cmd arg]

双引号把词组标记为命令的一个参数. "$"符号和方括号在双引号内仍被解释
"some stuff"

大括号也把词组标记为命令的一个参数. 但是, 其他符号在大括号内不被解释
{some stuff}

反斜线符号是用来引用特殊符号. 例如:n 代表换行. 反斜线符号也被用来关闭"$"符号, 引号,方括号和大括号的特殊含义

expect使用实例

1。首先确认expect的包要安置。

#rpm -qa | grep expect

如果没有则需要下载安装,

#yum install expect

2.安装完成后,查看expect的路径,可以用

#which expect

/usr/bin/expect

3.编辑脚本
#vi autosu.sh
添加如下内容

#!/usr/bin/expect  -f   //这个expect的路径就是用which expect 查看的结果spawn su - nginx       //切换用户
expect "password:"      //提示让输入密码
send "testr"       //输入nginx的密码
interact                //操作完成

4.确定脚本有可执行权限

chmod +x autosu.sh

5.执行脚本 expect autosu.sh 或 ./autosu.sh

expect常用脚本

登陆到远程服务器

#!/usr/bin/expect
set timeout 5
set server [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2] spawn ssh -l $user $server
expect {
"(yes/no)" { send "yesr"; exp_continue }
"password:" { send "$passwdr" }
}
expect "*Last login*" interact

scp拷贝文件

#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]        //第1个参数,其它2,3,4参数类似
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_fileexpect {"(yes/no)?"{send "yesn"expect "*assword:" { send "$passwordn"}}"*assword:"
{send "$passwordn"
}
}
expect "100%"
expect eof

使用方法
./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file
以上的命令执行后,将把本地/root目录下的src_file文件拷贝到用户名为root,密码为123456的主机192.168.75.130中的/root下,同时还将这个源文件重命名为dest_file

【原文】http://www.nginx.cn/1934.html

转载于:https://blog.51cto.com/990487026/1713876

Linux expect与Shell交互相关推荐

  1. linux expect 输入密码,shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了. 从 ...

  2. php 与shell,[转]PHP与Shell交互

    From : http://blog.csdn.net/houqd2012/article/details/8219199 最近想使用PHP与Sheel进行交互.PHP控制显示和高层的逻辑结构.She ...

  3. linux多进程spawn,【Linux Shell脚本编程】expect解决脚本交互 + Shell的多进程处理

    如果在没有使用密钥认证的情况下,想通过SSH来传输文件给多个主机会面临交互的问题,这在脚本中是非常不友好的.要解决这个问题的话可以使用expect这个工具,它的功能就是提前把交互中需要的内容先写好,然 ...

  4. 在Linux中实现自动交互(管道操作符,输入重定向,here document,expect)

    这是本人接触Linux中,接触到的几种自动交互的方法,本人小白一枚,有不足之处请多多指教 1.查找帮助,通过管道等工具实现自动交互 举一个比较简单的例子,当我们给用户设置密码时,这时就涉及到了自动交互 ...

  5. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。...

    反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹. 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常 ...

  6. linux 脚本 expected,使用expect实现shell中scp自动输入密码

    使用expect实现shell中scp自动输入密码 前段时间有一个需求,要实现一个自动备份脚本,因为不需要全部备份,所以没有使用rsync,在这里使用scp.因为scp需要输入用户密码,在网上查了好多 ...

  7. expect spawn、linux expect 用法

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ######## ...

  8. expect() php,Linux expect 的安装

    expect是建立在tcl基础上的一个工具,它还提供了一些Tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作,在远程管理方面发挥很大的作用. 因为expect是基于tcl的,所 ...

  9. linux定时scp脚本,linux expect 实现定时scp的任务

    一,什么是expect? expect 是一种脚本语言, 在做系统管理时,我们很多时候需要输入密码,例如:连接 ssh,连接ftp, 那么如何能做到不输入密码吗? 我们需要有一个工具,能代替我们实现与 ...

最新文章

  1. 推荐的讲解算法的网站、好博客:
  2. SQL注入是什么?如何防止?
  3. 浏览器在DPI缩放时变化问题
  4. ACM MM 2021 | 面向多模态情绪识别的双流异质图递归神经网络
  5. web worker技术-js新线程
  6. 语言的进步与代码生成
  7. lintcode 418整数转罗马数字
  8. mysql数据库优化教程_mysql数据库索引优化学习教程
  9. 大数据_Flink_流式处理_简介_流数据处理的应用行业---Flink工作笔记0003
  10. eclipse配置python开发环境_Eclipse中配置python开发环境详解
  11. 在线编辑fckeditor3
  12. Dijkstra算法原理
  13. 英国部份城市中英文对照
  14. 88E1111 100BASE-T百兆工程(part1)
  15. POJ3067 Japan
  16. Throttling - Django REST framework
  17. iOS CALayer专用图层理解与使用方法一(CAShapeLayer、CATextLayer、CATransformLayer)
  18. 为什么计算机模拟试题无法评分,科目一电脑模拟打分答题
  19. 计算机毕业设计之java+springboot基于vue的生鲜交易系统-生鲜商城网站
  20. java重学系列之IO字节流

热门文章

  1. 页面多条件组合查询功能 代码 如何写效率高_Jeecg Boot 2.2 首个里程碑版本发布,低代码平台
  2. unity 异步加载网络图片_一个非常好用的AssetBundle资源加载器
  3. 视觉slam发展史--从开始到未来
  4. 我的Python脚本——生成任意波形并存为txt
  5. 北斗导航 | 学习PPP和PPP-RTK
  6. php的isset(),PHP isset()具有多个参数
  7. c语言编程中%g是什么格式
  8. python3 copy_python3 深浅copy对比详解
  9. pycharm变量存_20190909 pycharm快捷键与变量
  10. rust(64)-指针类型(1)