【shell笔记】-----shell脚本使用 expect指令实现ssh自动登录

这里写图片描述
运用到虚拟机的时候,经常需要ssh [email protected]或者直接ssh 192.168.1.1,然后等待输入用户密码。这样下来,对于服务器运维每天要登录很多服务器,那么这一步骤就显得累赘。在学习网络中,用SecureCRT Application登录router/switch是很方便的,只需要将登录信息记录下来,下次即可直接登录。

在Linux中expect就是一个处理交互的指令。那么只要交互的过程是一致的,咱把这个交互的过程记录下来,并且写到脚本当中去实现自动化操作。如此就可实现通过bash就可实现登录主机了。

expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,无需人为的干预。
expect的作者Don Libes在1990年 开始编写。
expect是一个用来实现自动交互功能的软件套件。
系统管理员可以创建脚本借助expect实现对命令或程序提供输入,(一般这些输入都需要手工输入进行的,就好像password。这里指的命令和程序是expect从终端监听得到的)

高级的expect可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。

expect的5个重要命令:(前4个核心命令)

spawn:启动新进程,后跟新进程要执行的指令;(后面的expect、send都是在这个进程内进行交互的)
expect:指定要监听的字符串或正则表达式,如果spawn进程返回了匹配的字符串,则触发send;
send:发送指定的字符串到spawn进程,用于代替标准输入;
interact:用户参与交互;(用户登录完成后,仍想在此状态进行其他的操作,这个就能协助实现目的)
exp_continue:匹配多个字符串,在执行动作后面加此命令

login.sh脚本如下:

#!/bin/bash  //使用的是Redhat Linux 7.2系统版本
set timeout 300   //设置超时300s
/usr/bin/expect << EOF
spawn ssh -p 22 root@192.168.1.1
expect "*password:" {send "xizaipasswd\r"}
expect "*#" {send "touch /file1.txt\r"}  //登录成功后执行相应的操作
expect "*#" {send "touch /file2.txt\r"}  //"*#"内容为正则表达式
EOF

login.sh执行过程:

1、【spawn】启动一个新进程,执行ssh登录指令;
2、【expect】监听到标准输入的提示信息”password:”符合匹配,触发【send】发送密码代替手动
3、【expect】监听到标准输入的提示信息”*#”符合匹配,触发【send】发送执行命令创建文件
4、执行结束,等待超时

遗漏小点

Tip //简单expect语句写法

expect "*#"      
send "touch /file1.txt\r"

Tip2//简单语句中大括号可以执行多个命令,需要加一个“;”号隔开

expect "*password:" {send "touch file1.txt\r";send "touch file2.txt\r"}

*

expect最常用的语法。
是来自tcl语言的模式-动作,这种语法极其灵活,在实现ssh登录中使用到:

expect "*password:" {send "xizaipasswd\r"}  //单一分支模式
expect "*#" {send "touch /file1.txt\r"} 
expect "*#" {send "touch /file2.txt\r"}
  expect  {                               //多分支模式语法
  "*password:" {send "redhat\r"; exp_continue}
  "*#" {send "touch /file1.txt\r"}
  }    

# Tip 如果expect监听的是同一个参数如:
 expect {
 "*#" {send "touch /file1.txt\r"; exp_continue}
 "*#" {send "touch /file2.txt\r"}   //使用多分支只执行第一条
 }

猜你喜欢

转载自blog.csdn.net/weixin_42611900/article/details/82083093