https://www.jianshu.com/p/0194cbd70d39

https://www.cnblogs.com/saneri/p/10819348.html  参考

expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

expect自动交互流程:

  spawn启动指定进程---expect获取指定关键字---send向指定程序发送指定字符---执行完成退出.

expect 最关键、常用的四个命令:

命令 说明
send 用于向交互对象发送字符串
expect 从交互对象接收字符串
spawn 它主要的功能是给运行进程加个壳,用来传递交互指令
interact 执行完成后保持交互状态,把控制权交给控制台,这个时候便可以手工操作。如果没有该命令,命令完成后即退出。

  其他命令:

    exp_continue  :

    set timeout : 设置超时时间,计时单位是:秒,timeout -1 为永不超时。

    $argv 参数数组: 其中通过 [lindex $argv n] 可以获得第 n 个参数的值,调用脚本  ./xxx.sh  root   123456   192.168.199.123   分别传参数到 对应的变量

set username [lindex $argv 0] 
set password [lindex $argv 1] 
set hostname [lindex $argv 2] 
    

1. 登录远程host并且不退出

  执行用  expect  xxx.sh  或者  ./xxx.sh   ,不能用 sh xxx.sh

#!/usr/bin/expect

set timeout
# 跳板机1
set host "10.17.234.145"
set username "dfs"
set password "qwe200" set host1 "39.17.121.187"
set username1 "scdd"
set password1 "qwe100" spawn ssh $username@$host
expect "*assword:*" {send "$password\n"}
expect "*]*" {send "ssh -p 22222 $username1@$host1\n"}
expect "*assword*" {send "$password1\n"}
expect "*]*" {send "su\n"}
expect "*:*" {send "$password1\n"}
interact

  interact  会使得最后的 终端停留在 登录上去的 host上。

  expect 传入参数    ./xxx.sh  234

#!/usr/bin/expect
set timeout set host [lindex $argv ] spawn ssh 192.168..$host expect {
"*yes/no*" {send "yes\r";exp_continue}
"*assword*" {send "qwe123\r"}
} interact # 用这个不会退出
#expect eof 看到好多自动登录用的 这个,但是这个会 自动登出,不会停留在登录的host上。
exp_continue  附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。我把这个理解为 类似 if,如果能匹配到前面的就 send ,不能就匹配下面的。

2. 不登录远程执行命令

  这种 看 需求的复杂情况,如果命令比较多,就写到文件再 scp 传到远程,再 ssh 远程执行。

  一般情况 看远程的安全级别,如果不高,可以 先自动设置 ssh 免密登录, 后续的 scp  ssh  都不需要 密码就可以执行。

  先看自动免密设置:

  下面的  expect -c 是 单条命令交互,暂时还没有 发现  -c 可以多条的交互,这种单条 适合 执行 一条命令。

#!/bin/bash

PORT=
PASSWORD=qweasd SERVERS="172.16.79.114 172.16.79.115 172.16.79.116" ## 实现免密登录配置的函数
auto_ssh_copy_id() {
expect -c "set timeout -1;
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$; ## 这里要注意,使用'或\'不可行
expect {
*(yes/no)* {send -- yes\r;exp_continue;}
**word:* {send -- $\r;exp_continue;}
eof {exit ;}
}";
} ## 循环执行,配置主机到从节点所有免密
ssh_copy_id_to_all() {
for SERVER in $SERVERS ## 取值需要加$
do
auto_ssh_copy_id $SERVER $PASSWORD
done
} # ## 调用循环配置函数
# ssh_copy_id_to_all # 然后下面就可以 操作 scp ssh

  

  如果安全要求高,不允许免密登录的,那就只有 expect 多命令交互了。

#!/bin/bash
PORT=22
PASSWORD=qweasd SERVERS="172.16.79.114 172.16.79.115 172.16.79.116"
for SERVER in ${SERVERS[@]}
do
# 把命令放到文件里
  ./devconfig

  # 先 scp 传到远程
expect -c "
spawn scp ./devconfig root@$SERVER:/home
expect {
*(yes/no)* {send -- yes\r;exp_continue;}
**word:* {send -- $PASSWORD\r;exp_continue;}
eof {exit ;}
}";   # 再 ssh 远程执行
expect <<-EOF
spawn ssh -p$PORT root@$SERVER
  expect {
   "*yes/no" { send "yes\r"; exp_continue }
   "*assword:" { send "$PASSWORD\r" }
   }
   expect "*#"
   send "sh /home/devconfig\r"
   expect "*#"
   send "rm -rf /home/devconfig\r"
   expect "*#"
   send "exit\r"
   expect "*#"
  EOF done ## 这里的远程执行 也可以 采取 expect -c 单条命令执行

expect -c "
  spawn ssh root@$SERVER sh /home/devconfig
  expect {
  *(yes/no)* {send -- yes\r;exp_continue;}
  **word:* {send -- $PASSWORD\r;exp_continue;}
  eof {exit 0;}
  }";



linux 的 expect 自动交互的更多相关文章

  1. SSH批量管理 expect自动交互

    SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html # SSH批量管理 # expect自动交互 ########### ...

  2. linux中实现自动交互的3中方法

    本文参考了 http://os.51cto.com/art/200912/167898.htm 有些命令例如ftp需要交互,有三种方法可以实现. 方法一(重定向)简单直观,也经常有实际应用,但是在自动 ...

  3. 脚本_使用expect自动交互远程主机安装软件

    #!bin/bash#功能:使用expect工具自动交互密码,远程到其它主机,安装httpd软件#作者:liusingbon#删除~/.ssh/known-hosts后,ssh远程任何主机,系统都会询 ...

  4. Linux Expect自动交互脚本

    https://likegeeks.com/expect-command/ In the previous post, we talked about writing practical shell ...

  5. Linux Shell 自动交互功能

    需求背景:   近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大 ...

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

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

  7. Expect自动化交互程序

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

  8. linux自动交互工具expect,tcl安装和安装包,以及自动互信脚本

    linux自动交互工具expect,tcl安装,以及自动互信脚本 工作中需要对几十台服务器做自动互信,无意中发现expect命令,研究一番. 在网上找了许多资料也没有安装成功,摸索着总算成功了.现分享 ...

  9. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

随机推荐

  1. windows系统下mount创建的.vhd

    自己无聊时候分出了几个磁盘用来练习,存放个人东西,cdef盘除了c盘都是随便乱存的(粗心-_-),于是分出了两个20G的vhd文件,但是每次开机都要去d盘点击挂载太麻烦,现在分享自己的方法. 创建mo ...

  2. Vue生命周期钩子---3

    vue生命周期流程图:4张图 : 生命周期的解析和应用: Vue 实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom→渲染.更新→渲染.卸载等一系列过程,我们称这是 Vue ...

  3. Python字符串内置方法使用及年龄游戏深入探究

    目录 作业 ==程序代码自上往下运行,建议自上而下的完成下列任务== 作业 使用代码实现以下业务逻辑: 写代码,有如下变量name = " aleX",请按照要求实现每个功能: 移 ...

  4. 好用的代码统计小工具SourceCounter(下载)

    SourceCounter下载链接 https://pan.baidu.com/s/12Cg51L0hRn5w-m1NQJ-Xlg 提取码:i1cd 很多时候我们需要统计自己所写的代码的数量.举个栗子 ...

  5. layui中form表单渲染的问题

    layui 官网的这部分文档介绍:http://www.layui.com/doc/modules/form.html#render 注意:针对的是表单元素,input select  textare ...

  6. 【转】java MessageDigest类的作用 :提供信息摘要 算法( MD5 或 SHA 等)的功能

    一.结构和概述: java.lang.Object java.security.MessageDigestSpi java.security.MessageDigest 声明:public abstr ...

  7. jQuery与IE兼容性问题处理

    jQuery虽然是兼容所有主流的浏览器,但实际应用中也会存在很多兼容性的问题.使用IE11+jquery-3.2.1.min.js遇到的问题如: 对象不支持indexOf 在低版本中,1.8写法如下: ...

  8. WIN7快速打开hosts方法

    WIN7快速打开hosts方法 1直接运行C:\Windows\System32\drivers\etc\hosts 浏览选择notepad++打开即可 2打开notepad++打开 C:\Windo ...

  9. rpc和webservice的关系简述

    RPC(Remote Procedure Call,远程过程调用)是一个很大的概念.它是一种通过网络从远程计算机程序上跨语言跨平台的请求服务.RPC能省略部分接口代码的开发,可以跨机器之间访问对象(J ...

  10. 【题解】Norma [COCI2014] [SP22343]

    [题解]Norma [COCI2014] [SP22343] 传送门:\(\text{Norma [COCI2014]}\) \(\text{[SP22343]}\) [题目描述] 给定一个整数 \( ...