业务场景:当我们每次需要交互式登录服务器,输入账号密码在服务器上执行机械化操作的时候,经常需要进行繁琐的脚本操作,如果可以写一个脚本自动化执行交互式命令就好了。
1.交互式命令执行工具 expect
linux系统自带expect执行工具 具有三大命令spawn expect send
编写好脚本之后,使用expect login.exp来执行该脚本(脚本后缀最好叫exp表示区别于.sh脚本,普通.sh脚本使用sh shell.sh来执行。)
#!/usr/bin/expect
# 可以支持设置变量set,取变量用$user。
set user admin
set host koubei.inc.alipay.net
set password SomePassword
spawn ssh $user@$host #spawn表示开启命令
expect "*password*" # *表示通配符 expect表示期望获取到的结果,支持通配符*
send "$password\r" #输入之后需要\r表示回车
expect eof
2.登录服务器之后继续执行脚本(命令)
以上方法可以让我们成功登陆服务器,但是在服务器上我们却无法执行脚本,所以如果想既登陆服务器,又要在目标服务器上执行脚本,我们有2个方式。
spawn ssh admin@koubei.inc.alipay.net "
ls;
tail kb-webroot/server/Resources/Cookies/stable_Cookie.cookie"
expect "password"
send "SomePassword\r"
expect eof
在ssh admin@koubei.inc.alipay.net 后面加上双引号,双引号中写你需要在目标服务器上执行的脚本,支持换行,不用加\,两个命令之间需要使用分号‘;’隔开。
如果脚本内容过于复杂,你可以在目标服务器上写好一个可执行的脚本文件 example.sh ,然后讲双引号中的内容改成"./example.sh"来执行,有了这个功能基本就能实现所有的需求了。
3.在本地bash和expect穿插执行,参数传递。
若果你需要先在本地环境执行脚本拿到一些参数,然后传递给目标服务器,最后在目标服务器获得结果之后回到本地shell,这时候就需要穿插使用。
#!/bin/bash
read -s PWD
/usr/bin/expect <
spawn ssh admin@koubei.inc.alipay.net "
ls;
tail kb-webroot/server/Resources/Cookies/stable_Cookie.cookie"
expect "password"
send "$PWD\n"
expect eof
EOD
ls
echo "call me crazy"
4.总结
shell的执行命令还有很多,熟练的shell能力能让我们的日常开发工作简单准确和更加轻松,明显提升工作体验,所以好好学习shell吧!也欢迎能看到这篇文章的朋友,多多交流经验技术!