小于博客 小于博客
首页
  • Java学习笔记
  • Docker专区
  • 实战教程
  • Shell
  • 内存数据库
  • Vue学习笔记
  • Nginx
  • Php
  • CentOS
  • Docker
  • Gitlab
  • GitHub
  • MySql
  • MongoDB
  • OpenVPN
  • 配置文件详解
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 电影音乐
  • 效率工具
  • 博客相关
  • 最佳实践
  • 迎刃而解
  • 学习周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

小于博客

行者常至,为者常成
首页
  • Java学习笔记
  • Docker专区
  • 实战教程
  • Shell
  • 内存数据库
  • Vue学习笔记
  • Nginx
  • Php
  • CentOS
  • Docker
  • Gitlab
  • GitHub
  • MySql
  • MongoDB
  • OpenVPN
  • 配置文件详解
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 电影音乐
  • 效率工具
  • 博客相关
  • 最佳实践
  • 迎刃而解
  • 学习周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nginx

  • Php

  • CentOS

    • Linux好用命令之w命令
    • Linux好用命令之top命令
    • Linux好用命令之free命令
    • Linux好用命令之lsof命令
    • Linux好用命令之expect命令
      • 1、expect是什么
      • 2、expect的原理
      • 3、入门脚本
      • 4、expect的案例
      • 5、注意事项
    • Linux好用命令之gzip保留原文件解压缩
    • Linux好用命令之dig命令
    • Linux好用命令之rsync命令
    • Linux好用命令之curl劫持请求的三种方式
    • Linux好用命令之base64命令
    • Linux好用命令之figlet命令
    • Linux好用命令之watch命令
    • 使用trash-cli给Linux服务器加一个回收站的功能
    • CentOS-7中tmp目录的清理规则
    • 用yum的方式快速安装lnmp环境(MySQL5-5&5-7,php5-x&7-x)
    • CentOS系统里TCP状态中TIME_WAIT超过3万的分析与建议
    • CentOS-7如何释放主机根分区的磁盘空间
    • 实践一次抓包看到TCP的三次握手与四次挥手及其他
    • CentOS-arm架构下安装docker
    • Logrotate入门了解及生产实践
    • 为什么不建议Linux用root登陆或启动服务
  • Docker

  • GitLab

  • GitHub

  • Mysql

  • MongoDB

  • OpenVPN

  • 配置文件详解

  • Other

  • 运维观止
  • CentOS
小于博客
2021-08-22
目录

Linux好用命令之expect命令

# 1、expect是什么

使用Linux的程序员对输入密码都不会陌生,在Linux下对用户有严格的权限限制,干很多事情越过了权限就得输入密码,比如使用超级用户执行命令,又比如scp、ssh连接远程主机等等。 比如我们要是 到10.20.24.103这台机器上去,就需要输入密码:

$ ssh 10.20.24.103
root@10.20.24.103's password: 
1
2

那么问题来了,如果我们脚本里面有scp的操作,总不可能执行一次scp就输入密码一次,这样就需要一个人盯着脚本运行了。 为了解决这个问题,我们需要一个自动输入密码的功能。

0d7df865c65639bc00243e9e6b303388

# 2、expect的原理

针对这种scp或者ssh命令的功能,可能很多人想到的就是勉密钥登录。这种其实可以但是这种在生产环境不建议这么做,不安全。

至于ssh勉密钥登录的操作可以自行去百度。目前大数据上的分布式处理就是用这种方式来建立主机的互信关系的。

今天我们主要是讲没有建立信任关系下自动输入密码的功能,这个引入今天的主角 expect,使用如下命令进行安装:

$ sudo yum install expect
1

# 3、入门脚本

简单示例如下:

$ cat expect.sh 
#!/usr/bin/expect

set timeout 20
spawn ssh root@10.20.24.103
expect "root"
send "paic1234\n"
interact
1
2
3
4
5
6
7
8

说明 :

  • 第一行是指定执行的模式,我们平时写shell 是用 #!/bin/bash 等等,这个我们执行我们用 #!/usr/bin/expect
  • set timeout 20 这个是用来设置相应的时间,如果里面的脚本执行或者网络问题超过了这个时间将不执行,这个timeout模式是10
  • spawn 表示在expect下面需要执行的shell脚本
  • expect 是捕获执行shell以后系统返回的提示框内容。""这个表示提示框里面是否包括这个内容
  • send 如果expect监测到内容了,那么就将send后的内容发送出去 \n表示回车
  • interact 表示结束expect回话,可以继续输入,但是不会返回终端
$ hostname
SZB-L0032014
$ ./expect.sh 
spawn ssh root@10.20.24.103
root@10.20.24.103's password: 
Last login: Wed Mar  1 08:24:22 2017 from szb-l0032014
$ hostname
SZB-L0032013
1
2
3
4
5
6
7
8

# 4、expect的案例

登录一台机器,将本机的一个文件传到远程机器上

$ cat expect1.sh 
#!/usr/bin/expect

set timeout 20

if { [llength $Extra close brace or missing open braceargv] < 2} {
  puts "Usage:"
  puts "$argv0 local_file remote_path"
  exit 1
}

set local_file [lindex $argv 0]
set remote_path [lindex $argv 1]
set passwd paic1234

set passwderror 0
spawn scp ${local_file} ${remote_path}

expect {
     "password" {
        if { $passwderror == 1 } {
                put "passwd is error"
                exit 2
           }
           set timeout 1000
           set passwderror 1
           send "paic1234\n"
           exp_continue
        }
     "*es/no)?*" {
       send "yes\n"
      exp_continue
     }
    timeout {
      put "connect is timeout"
      exit 3
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 5、注意事项

  • 1、llength argv表示参数的个数2、argv表示参数的个数
  • 2、argv0 表示脚本的名称
  • 3、lindex $argv 0 表示第一个参数,依次类推到n,参数下标是从0开始的
  • 4、if 判断需要用{}括起来
  • 5、if 与后面的{}直接需要有空格
  • 6、expect {},多行期望,匹配到哪条执行哪条,有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}
  • 7、else不能单独放一行,所以else要跟在}后面
  • 8、两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace
  • 9、使用{来衔接下一行,所以if的条件后需要加左花括号{

通过各种脚本发现expect对脚本的格式要求特别高,比如{}直接要空格、else以后需要增加{等等,如果发现不能正常运行,优先检查格式是否有问题

上次更新: 2024/01/11, 14:21:50

← Linux好用命令之lsof命令 Linux好用命令之gzip保留原文件解压缩→

最近更新
01
SpringBoot 快速实现 api 加密!
03-21
02
SpringBoot整合SQLite
03-07
03
SpringBoot配置使用H2数据库的简单教程
02-21
更多文章>
Theme by Vdoing | Copyright © 2017-2024 | 点击查看十年之约 | 豫ICP备2022014539号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式