Ubuntu 安装 expect
1 | sudo apt install expect |
学习 expect
不得不说,百度很久都找不到expect的详细文档,都是一些重复的基础用法,这里记录下我找到的expect的中文教程:
http://xstarcd.github.io/wiki/shell/expect.html
https://www.cnblogs.com/TDXYBS/p/11012089.html
shell结合expect写的批量scp脚本工具
expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。
1 | !/bin/bash |
分析:
<<-EOF
获取stdin,并在EOF处结束stdin,输出stdout值得一提的是
<<-EOF
和<<EOF
的区别,<<-EOF
输入行的开头部分的制表符(Tab)都将被去除, 而<<EOF
不会。这可以解决由于脚本中的自然缩进产生的制表符。对于
#!/bin/expect
的为第一行的脚本,表示脚本的解释程序位置在/bin/expect
, 如此不能使用sh script.sh
的方式(该方式的只能启动第一行为#!/usr/bin/sh
的脚本), 需要先赋予脚本执行权限 —-chmod a+x script.sh
。详见:expect spawn not foundhttps://blog.csdn.net/chinabluexfw/article/details/7461944)expect eof 和interact 二者可以根据情况选一个作为结尾,一般我们使用 expect eof 。
expect eof 表示交互结束,退回到原用户;
interact 会停留在目标用户。
echo
在终端输出字符带有转义字符的时候,需要转义符生效需要加-e
参数。朋友电脑加 -e 正常,但是我这里加-e
不正常,如下图(图一是朋友电脑的情况,图二是我的电脑,这是个问题,待研究)。
2020-01-07 更新: 关于-e的问题,这里给出了解答。https://blog.csdn.net/liudsl/article/details/79213390
原因是:GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell) 的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist Shell),并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。
Ubuntu继承了Debian,所以从Ubuntu 6.10开始默认是Dash Shell。
我的脚本(通过expect登录远程主机执行脚本部署)
1 |
|
参考:
https://www.cnblogs.com/su-root/p/11229316.html
https://blog.csdn.net/jacky0922/article/details/45071817
https://www.cnblogs.com/TDXYBS/p/11012089.html
本文链接: http://www.ionluo.cn/blog/posts/bda874eb.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!