expect介绍:

最近想写一个自动化安装脚本,涉及到远程登录、分发文件包、远程执行命令等,其中少不了来回输入登录密码,交互式输入命令等,这样就大大降低了效率,那么有什么方法能解决呢?不妨试试expect:

  • expect是一款自动化的脚本解释型的工具。
  • expect基于tcl脚本,expect脚本的运行需要tcl的支持。
  • expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。
  • expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。

远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。

expect安装

一般机器不会自带expect和tcl需要手动安装。

[root@bqh-nfs- ~]# yum install expect tcl -y
[root@bqh-nfs- ~]# rpm -qa expect tcl
expect-5.44.1.15-.el6_4.x86_64
tcl-8.5.-.el6.x86_64

expect基础知识

expect脚本

脚本开头

expect脚本一般以#!/usr/bin/expect -f开头,类似bash脚本。

常用后缀

expect脚本常常以.exp或者.ex结束。

expect主要命令

  • spawn 新建一个进程,这个进程的交互由expect控制
  • expect 等待接受进程返回的字符串,直到超时时间,根据规则决定下一步操作
  • send 发送字符串给expect控制的进程
  • set 设定变量为某个值
  • exp_continue 重新执行expect命令分支
  • [lindex $argv 0] 获取expect脚本的第1个参数
  • [lindex $argv 1] 获取expect脚本的第2个参数
  • set timeout -1 设置超时方式为永远等待
  • set timeout 30 设置超时时间为30秒
  • interact 将脚本的控制权交给用户,用户可继续输入命令
  • expect eof 等待spawn进程结束后退出信号eof

expect命令分支

expect命令采用了tcl的模式-动作语法,此语法有以下几种模式:

单一分支语法

set password
expect "*assword:" { send "$password\r" }

当输出中匹配*assword:时,输出password变量的数值和回车。

多分支模式语法

set password
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"*assword:" { send "$password\r" }
}

当输出中包含(yes/no)?时,输出yes和回车,同时重新执行此多分支语句。

当输出中匹配*assword:时,输出password变量的数值和回车。

自动远程登录脚本:bqh-nfs-123机器免输密登录bqh-back-124机器上

[root@bqh-nfs- scripts]# vim test.exp 

#!/usr/bin/expect -f            #expect的路径,which expect查询获取
set timeout 20 #连接超时
set host "192.168.0.124"
set password ""
spawn ssh root@$host #登录服务器用户+地址
expect { #等待接受进程返回的字符串
"yes/no" {send "yes\n";exp_continue} #等待输入yes
"password:" {send "$password\n"} #等待输入密码
}
interact #将脚本的控制权交给用户,用户可继续输入命令

执行结果如下:

expect脚本远程执行命令:

[root@bqh-nfs- scripts]# vim test.exp 

#!/usr/bin/expect -f
set timeout
set host "192.168.0.124"
set password ""
spawn ssh root@$host
expect {
"yes/no" {send "yes\n";exp_continue}
"password:" {send "$password\n"}
}
expect "]*"
send "/application/nginx/sbin/nginx\n"
expect "]*"
send "lsof -i:80\n"
expect "]*"
send "echo 1147076062 >1.log\n"
expect "]*"
send "cat 1.log\n"
expect "]*"
send "exit\n"

执行结果如下:

expet脚本传参执行命令:

[root@bqh-nfs- scripts]# cat test1.exp
#!/usr/bin/expect set user [lindex $argv ]
set host [lindex $argv ]
set passwd ""
set cmd [lindex $argv ]
spawn ssh $user@$host expect {
"yes/no" { send "yes\n"}
"password:" { send "$passwd\n" }
} expect "]*"
send "$cmd\n"
expect "]*"
send "exit\n"

执行结果如下:

expect脚本远程登录、远程执行命令和脚本传参简单用法的更多相关文章

  1. [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)

    转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...

  2. python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)

     -*-          paramiko.util.log_to_file(         ssh = paramiko.SSHClient()          ssh.set_missing ...

  3. python批量操作Linux服务器脚本,key登录(执行命令、上传、下载)(二)

       -*-   2 #批量操作linux服务器(执行命令,上传,下载)   3 #!/usr/bin/python   4 import paramiko   5 import datetime   ...

  4. 使用paramiko远程登录并执行命令脚本

    #!/usr/bin/env python #coding=utf-8 import paramiko, getpass,sys,traceback class ssh_utils(): def lo ...

  5. shell 结合expect实现ssh登录并执行命令

    #!/bin/bash ips=( '127.0.0.1' ) ;i<${#ips[*]};i++)) do expect <<EOF #这里的 expect <<EOF ...

  6. Linux命令之远程登录与执行远程主机命令

    实现远程登录的命令 ssh.telnet.rlogin (1)ssh命令 ssh命令是openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器.ssh命令用于远程登录上Li ...

  7. Python 实现远程服务器批量执行命令

    paramiko 远程控制介绍 Python paramiko是一个相当好用的远程登录模块,采用ssh协议,可以实现linux服务器的ssh远程登录.首先来看一个简单的例子 import parami ...

  8. linux下远程服务器批量执行命令及SFTP上传文件 -- python实现

    之前写过一个python远程执行命令的脚本,但在一个性能测试中,要将程序批量分发到不同服务器,程序无法使用,再将之前的脚本更新,加入批量上传的功能.之前脚本地址:http://www.cnblogs. ...

  9. linux 命令行远程登录 后台运行命令的方法

    linux 命令行远程登录 后台运行命令的方法 http://blog.csdn.net/isuker/article/details/55061595 Linux 技巧:让进程在后台可靠运行的几种方 ...

随机推荐

  1. spring @Autowired注入map

    注入map,平常一般不会这么做,今天看一段老代码时发现有这么个用法.补习一下. @Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会 ...

  2. osg::Node源码

    /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This library is open source ...

  3. springMVC和struts2有什么不同?为什么要用springMVC或者struts2?让你实现一个MVC框架大概如何设计?

    [问题一:不同] (1)框架机制 1.Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用S ...

  4. 修改 commit 历史

    修改 commit 历史 参考:修改 git 历史提交 commit 信息(重写历史)git 修改已提交的内容 git init echo t.md>.gitignore git add .gi ...

  5. [LeetCode] 489. Robot Room Cleaner 扫地机器人

    Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or blocked. Th ...

  6. 【嵌入式硬件Esp32】安装MQTT服务器(Windows) 并连接测试

    对于不知道MQTT的肯定会问MQTT是干什么的....... 现在我有一个项目需求, 看到这个项目第一想法肯定需要一个服务器,所有的wifi设备和手机都去连接这个服务器,然后服务器进行信息的中转,类似 ...

  7. laravel 配置自动加载多路由文件

    在 app\Providers\RouteServiceProvider文件下增加方法&注册: 增加之后就可以在routers下建立api文件夹,在里面添加路由了

  8. 基于thinkphp5框架做一个可以区别开发、测试、生产三种环境的配置加载

    在日常的开发测试中我们经常会遇到本地开发和测试或者线上配置参数不同的场景,必要你要是使用一个三方的支付,它的本地测试和线上的key值或者账号存在不同.最基本的做法是本地用测试参数,提交到测试的时候再改 ...

  9. 2、Maven的简介和配置

    1.下载Maven  apche-maven-3.5.2 2. 三.maven简介 1.基于Ant的构建工具,Ant有的功能Maven都有,额外添加了其他的功能 2.运行原理图 2.1本地仓库:计算机 ...

  10. TCP/IP学习笔记15--IP分割处理与再构成处理,路径MTU发现

           家庭应该是爱.欢乐和笑的殿堂.--日 木村久一        IP属于网络层,下一层时数据链路层,在数据链路层,不同类型的数据链路的最大传输单元(MTU)都不尽相同.例如,连接两个路由器 ...