前言
公司有多台服务器,必须先登录跳板机,再从跳板机登录服务器,频繁的输入命令很繁琐,有没有更好的方式去实现。
expect 可以完美的帮助你
涉及概念
Tcl:(Tool command language)一种很强大的脚本语言
expect: 基于Tcl开发的语言包,请自行安装
except核心命令
send:命令向进程发送字符串。
expect:命令等待进程的某些字符串。expect支持正规表达式并能同时等待多个字符串,并对每一个 字符串执行不同的操作。expect还能理解一些特殊情况,如超时和遇到文件尾。
spawn:激活一个Unix程序来进行交互式的运行。
interact:允许用户交互
send命令用法
send "hello god.wei"
输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0BZ7A7K-1580201367165)(/img/bVbk79E)]
send命令会直接将字符串发送到进程
那如果我要运行命令呢,可以这样
send "pwd\r"
expect命令
用于接受进程的输出,然后我们可以通过判断输出结果来执行不同的操作
expect patlist1 action1 patlist2 action2…
该命令一直等到当前进程的输出和以上的某一个模式相匹配,或者等到时间超过一个特定的时间长度,或者等到遇到了文件的结束为止。
比如
#!/usr/bin/expect
expect apple
send "I want an apple\n"
输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PaVUu4UH-1580201367167)(/img/bVbk8av)]
expect 会监听当前进程的标准输出,如果满足期望,则继续运行下面的指令
spawn新建进程处理
spawn命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的)
spawn ssh shiwei.cao@godwei.com
expect apple
send "I want an apple\n"
这样当进程返回apple时就会向进程输出I want an apple
interact:允许用户交互
那如果我希望执行完操作之后不关闭远程终端,继续保持连接怎么办,这时候interact就派上用场了。
spawn ssh shiwei.cao@godwei.com
interact
这样就可以保持与远程服务器的连接
so?
这样我们就可以先连接跳板机然后在跳板机上执行ssh命令来连接远程服务器了
#####鸣谢:
1.TCL基本语法
2.except教程中文版