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. Vue中怎样使用swiper组件?

    我用的VS Code编译器,首先打开终端,进入项目(我是在13-vue文件夹下面的elem中使用) D:\study\web\13-vue\elem> cnpm install vue-awes ...

  2. 2019 蓝桥杯国赛 B 组模拟赛 题解

    标签 ok #include<bits/stdc++.h> using namespace std; /* 求阶乘 去除尾部0 每次求阶乘时:结果去除尾0,并对 1e6取余 */ type ...

  3. 常用的架包对应的maven配置

    <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <grou ...

  4. 【西北师大-2108Java】第三次作业成绩汇总

    [西北师大-2108Java]第三次作业成绩汇总 熟悉PTA平台线上测试环境: 理解用户自定义类的定义: 掌握对象的声明: 学会使用构造函数初始化对象: 使用类属性与方法的使用掌握使用: 掌握pack ...

  5. CF798D Mike and distribution

    CF798D Mike and distribution 洛谷评测传送门 题目描述 Mike has always been thinking about the harshness of socia ...

  6. MongoTemplate 分组分页复合条件查询

    一.前言 最近项目使用MongoDB作为数据主要存取的地方 又是第一次接触MongoDB,也是踩了不少坑... 维护数据无非就是增删改查,而里面最复杂的就是查询了 所以来总结一下有关MongoDB的查 ...

  7. 【转】struts2的ActionInvocation分析(action调度者)

    一个ActionInvocation实例代表一个action的执行状态,持有拦截器和将要执行的action的实例. defaultActionInvocation是其默认实现.下面是定义在该类中的部分 ...

  8. vscode自定义vue模板代码

    File--->preference -->user Snippets-->搜索html.json 编辑 加入以下自定义代码内容 "Html5-Vue": { & ...

  9. ​LeetCode 26:删除排序数组中的重复项 Remove Duplicates from Sorted Array

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. Give ...

  10. Mac终端常用快捷键

    Ctrl + a 跳到行首Ctrl + e 跳到行尾Ctrl + d 删除一个字符,相当于通常的Delete键(命令行若无所有字符,则相当于exit:处理多行标准输入时也表示eof)Ctrl + h ...