Q:利用shell脚本实现ssh自动登录远程服务器?

A:expect命令

#!/usr/bin/expect
spawn ssh root@172.16.11.99
expect "*password:"
send "rootzhang\r"
expect "*#"
interact

#!/usr/bin/expect  //告诉操作系统,此脚本里的代码用expect这个shell来执行(类似与bash)

shell> expect 脚本  //执行expect脚本

1、使用expect -c的嵌套调用

  如果需要在shell脚本中嵌套expect代码,就要使用expect -c "expect代码"

expect -c "
  spawn ssh $user_name@$ip_addr df -P
  expect {
    \"*(yes/no)?\" {send \"yes\r\" ; exp_continue}
    \"*password:\" {send \"$user_pwd\r\" ; exp_continue}
    #退出
  }
"

格式:spawn ssh登录远程主机 在该远程主机上要执行的命令(只能执行一条)

注意:在expect -c里面的代码,双引号要用\转义字符。

2、使用here document的嵌套调用

#!/bin/bash
echo ""
/usr/bin/expect <<EOF  #利用here document的expect代码嵌套

spawn ssh root@172.16.11.99
expect "*password:"
send "rootzhang\r"
expect "*#"
send "touch zhangjiacai\r"
expect "*#"
send "exit\r"
expect eof  #捕获结束 EOF

expect详解-- programmed dialogue with interactive programs

  是一个工具,是一个用来处理交互的命令。

借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成。

形象的说,ssh登录,ftp登录等都符合交互的定义。可以根据用户设定的规则和系统进程进行自动化交互,例如远程登陆的密码输入、自动化的执行远程命令。


expect中最关键的四个命令是spawn、expect、send、interact

spawn:启动新的进程,后面可接shell命令

expect:从进程接收字符串

send:用于向进程发送字符串 interact:允许用户交互

1、spawn命令

  spawn命令就是用来启动新的进程的。

  spawn后的send和expect命令都是和spawn打开的进程进行交互的。

set timeout   //设置超时时间,单位是:秒
spawn ftp 172.16.1.1  //打开新的进程,该进程用户连接远程ftp服务器
expect "Name"  //进程返回Name时
send "ftp\r"  //向进程输入ftp\r
expect "Password:"  //进程返回Password:时
send "123456\r"  //向进程输入123456\r
expect "ftp> "  //进程返回ftp>时
send "mirror xiang\r"  //向进程输入mirror xiang\r #下载xiang文件夹
expect "ftp> "
send "exit\r"  //向进程输入exit\r #退出

2、send命令

  send命令接收一个字符串参数,并将该参数发送到进程。(有点像here document)

3、expect命令

  expect通常是用来等待一个进程的反馈,expect可以接收一个字符串参数,也可以接收正则表达式参数。

  和上文的send命令结合,实现简单的交互式。

模式-动作:

> 单一分支模式语法:

  expect "hi" {send "You said hi"}  #匹配到hi后,会输出"you said hi"给进程,作为标准输入

> 多分支模式语法:

  #匹配到hi,hello,bye任意一个字符串时,执行相应的输出。

expect {
  "hi" { send "You said hi\n"; exp_continue}
  "hello" { send "Hello yourself\n"; exp_continue}
  "bye" { send "That was unexpected\n"}
}

4、interact

  利用spawn、expect、send自动化完成部分操作。

  如果想在适当的时候干预这个过程---就用到了interact(互相影响 互相作用)

比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令。interact可以达到这些目的,在自动登录ftp后,允许用户交互。

spawn ftp 172.16.1.1
expect "Name"
send "ftp\r"
expect "Password:"
send "123456\r"
interact  //留在ftp中手动执行后续命令操作

> 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了;

> 如果没有这一句登录完成后会退出,而不是留在远程终端上。

总结:

  expect工具在日常的运维中非常有用,可以用在多机器服务重启、远程copy、多机器日志查看、ftp文件操作、telnet等多种场景。shell中有些操作会受限于密码输入的人工操作,expect工具可以代替人工来完成一些交互性工作。

使用expect的自动化交互的更多相关文章

  1. linux自动化交互脚本expect详解set timeout 5是 意思是在expect语句中,5s后超时,不再作出选择。

    linux自动化交互脚本expect详解  更新时间:2020年10月21日 10:13:20   作者:lendsomething     这篇文章主要介绍了linux自动化交互脚本expect的相 ...

  2. 自动化交互expect

    自动化交互expect 一,介绍 每次服务器控制链接都需要输入密码,很麻烦,每次交互大大延长了时间 因此就有了免交互及自动化交互存在expect 二,安装 yum install expect -y ...

  3. Shell编程之Expect自动化交互程序

    一.Expect自动化交互程序 1.spawn命令 通过spawn执行一个命令或程序,之后所有的Expect操作都会在这个执行过的命令或程序进程中进行,包括自动交互功能. 语法: spawn [ 选项 ...

  4. Expect自动化交互程序

    Expect介绍: 1.什么是Expect Expect是一个用来实现自动化交互功能的软件套件,基于TCL的脚本编程工具语言,方便学习,功能强大. 2.为什么要使用expcet: 当今的企业运维中,自 ...

  5. expect 实现自动交互脚本

    1. 说明 在编写脚本时,可能会遇到需要在另一台主机上执行一个命令,或者在本机拷贝另一台主机内的一个文件.如果两台主机之间没有做互信,就会牵扯到用户输入密码的交互过程,这对编写自动脚本来说, 就行不通 ...

  6. expect实现自动交互由浅入深

    expect实现自动交互由浅入深 作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet ...

  7. python 全栈开发,Day123(图灵机器人,web录音实现自动化交互问答)

    昨日内容回顾 . 百度ai开放平台 . AipSpeech技术,语言合成,语言识别 . Nlp技术,短文本相似度 . 实现一个简单的问答机器人 . 语言识别 ffmpeg (目前所有音乐,视频领域,这 ...

  8. 图灵机器人,web录音实现自动化交互问答

    一.图灵机器人 介绍 图灵机器人 是以语义技术为核心驱动力的人工智能公司,致力于“让机器理解世界”,产品服务包括机器人开放平台.机器人OS和场景方案. 官方地址为: http://www.tuling ...

  9. shell脚本之通过发送带\n字符串或expect脚本实现交互输入自动化

    编写shell脚本难免遇到需要交互式输入指令的步骤: 方法一: # cat action.sh #!/bin/sh read -p "enter number:" no; read ...

随机推荐

  1. 结队编程study

    ##今天针对study进行结队编程,我和搭档张佳慧刚开始误认为SystemBarTintManager,baseActivity是personalActivity跳转的下一个界面,因为这个代码个人中心 ...

  2. oracle索引(转)

    引,索引的建立.修改.删除 2007-10-05 13:29 来源: 作者: 网友评论 0 条 浏览次数 2986 索引索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完 ...

  3. linuxCentOs6前期简单且必要的设置

    1.修改主机名 Sudo vi /etc/sysconfig/network(需要重启) Hostname master (不需要重启,设置当前主机名为master) Hostname查看当前主机名 ...

  4. 使用关系型数据库作为Redis落地的思路

    Redis的持久化方式主要有2种:RDB和AOF,但各有不足,同时Redis没有SQL支持,Redis本身提供的命令不足以实现大多数SQL查询需求,对后期运营的分析需求支撑不足.此外,对于游戏来说,活 ...

  5. number问题

    Missing Number Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one ...

  6. winform 自定义分页控件 及DataGridview数据绑定

    分页效果如上图所示,用到的控件均为基本控件 ,其方法如下 右击项目-添加-新建项 选择用户控件 然后在用户控件中拖入所需要的Label,Button,Text 用户控件全部代码: using Syst ...

  7. JavaScript设计模式读书笔记之一:接口

    接口 在JavaScrip中模仿接口 用注释描述接口 用属性检查模仿接口 用鸭式辨型模仿接口 依赖于接口的设计模式 工厂模式 组合模式 装饰者模式 命令模式 接口 在JavaScrip中模仿接口 用注 ...

  8. 云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core

    在昨天的博文中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法. 帐户 连接数 A 4077 B 3995 C 741 D 698 E ...

  9. JavaWeb总结(七)—JSTL标签库

    一.JSTL标签库介绍 JSTL标签库的使用时为了弥补HTML标签的不足,规范自定义标签的使用而诞生的.使用JSTL标签的目的是不希望在JSP中出现Java逻辑代码. 二.JSTL标签库的分类 1.核 ...

  10. 1129: 零起点学算法36——3n+1问题

    1129: 零起点学算法36--3n+1问题 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 4541 ...