`
zhengdl126
  • 浏览: 2539187 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

expect

 
阅读更多

whereis expect

 

 

 

-c 选项用来标明需要在执行脚本内容之前来执行的命令。这条命令(-c选项后的命令)应该用引号括起来,以免在执行时被shell分开解释
-c选项可能会被反复使用。多条命令可以使用同一个”-c”,命令之间需要用分号隔开。这些命令会按照它们出现的先后顺序执行。(在Expectk中,”-c”相当于”-command”)。

-d 选项允许输出调试性信息 。这些信息主要报告像expect和interact等命令执行时的内部行为。这个选项与写在脚本开头的

- f 选项指明从哪个文件中读取命令。这个选项是可选的,因为只有当使用”#!”时它才有可能被用到。而其他选项可以写在命令行中。(在Expectk中,它相当于”-file”)。

 

 

set timeout命令设置后面所有的expect命令的等待响应的超时时间为$tout(-l参数用来关闭任何超时设置)。

 

 

 

#!/bin/bash

expect -c  "

set timeout 100 

spawn /usr/bin/scp -r $bakpath  root@192.168.101.49:/ var /www/html/ip_logs 

expect "*password*"   

send "'123456'\\r"  

expect eof;"  

rm  $bakpath /log_ $DATE .tar.gz 

 

 

 

 

 

 

#!/bin/expect

spawn ./interactive.sh   需要自动化哪一个命令

expect "Enter number:"  提供需要等待的消息

send 1\n"                        发送的消息

expect "Enter name:"

send "hello\n"

expect eof              命令交互结束

 

 

 

-d参数调试Expect脚本:

# /usr/bin/expect -d sample_login.exp root 111111

 

 

 

==================== expect+[sh]for 循环执行远程主机命令

update.sh

all_web_ips="192.168.1.174 192.168.1.34"

#平滑集群内从web
for IP in $all_web_ips; do
    $cur_path/hub_exp.exp $IP root 123456
done

 

#hub_exp.exp

#!/usr/bin/expect -f
# ====================================================================
# hub_exp.exp
# 集群内所有web交互执行
# Usage: /usr/local/shell/automation/hub_exp.exp 192.168.1.174 root 123456
# Author: zheng.dl
# 参数说明:
# $1 完全ip地址
# $2 expect账户
# $3 expect密码
# ====================================================================

set HOST [lindex $argv 0]
#set USER "root"
#set PASSWD "123456"
set USER [lindex $argv 1]
set PASSWD [lindex $argv 2]
set timeout 20

#puts $PASSWD
#exit
spawn ssh $USER@$HOST
#sleep 13
expect_before "no)?" {
send "yes\r" }
sleep 5

# 输入密码
expect "password:"
send "$PASSWD\r"


#如果想直接进入交互模式,可以直接用下面这句
#interact


#expect -timeout 1
sleep 2

expect "*$*"
send "sudo /usr/local/nginx/sbin/nginx -s reload;sudo kill -USR2 `cat /dev/shm/pid/php-fpm.pid`\r"
expect "*$*"

expect "*#*"
send "sudo /usr/local/nginx/sbin/nginx -s reload;sudo kill -USR2 `cat /dev/shm/pid/php-fpm.pid`\r"
expect "*#*"


exit

 

 

 

 

 

 

 

============================= expect自动和交互式任务进行通信

 

 

 

 

 

 

我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。

  Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年 开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。 :)

  Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。

  二、Expect工作原理

  从最简单的层次来说,Expect的工作方式象一个通用化的Chat脚本工具。Chat脚本最早用于UUCP网络内,以用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。

  Chat脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。例如下面的 Chat脚本实现等待标准输出出现Login:字符串,然后发送somebody作为用户名;然后等待Password:提示符,并发出响应 sillyme。

  引用:Login: somebody Password: sillyme

  这个脚本用来实现一个登录过程,并用特定的用户名和密码实现登录。

  Expect最简单的脚本操作模式本质上和Chat脚本工作模式是一样的。

 

 

 

Php代码
  1. 利用expect脚本进行项目的自动远程部署   
  2. 基本原理是  
  3. 1.首先进行本地的打包,如排除不必要的项目文件和临时文件,根据服务器的不同进行配置文件的个性化修改和拷贝  
  4. 2.然后通过scp等方式将压缩包传到远程部署服务器上  
  5. 3.在远程服务器上进行部署操作  
  6. 以上步骤均通过交互式的脚本进行,减少人工干预,通过CI系统(如hudson)可以实现一键编译发布或自动联编发布的效果  
  7.   
  8. 要注意的是脚本被调用的用户和远程操作的权限是否正确。  
  9. 处于安全考虑,建议不要在脚本中进行su等获取其他用户权限的操作,而是指定脚本本地和远程的操作用户和权限。  
  10. 比如,hudson是www用户启动运行,部署脚本也最好赋予www用户的所有和执行权。  
  11. 另如,远程php服务器使用www启动运行,部署脚本直接使用www用户进行远程拷贝和部署。  
  12.   
  13. 以下是脚本  
  14.   
  15. #!/usr/bin/expect  
  16. ###########################################  
  17. ##将项目远程部署到测试服务器上#  
  18. ##  
  19. ###########################################  
  20.   
  21.   
  22. #-----------设置脚本变量和参数----------------  
  23.   
  24. set sitename [lindex $argv  0]  
  25. set remotehost    [lindex $argv  1]  
  26. set remoteip [lindex $argv  2]  
  27. set buildnumber [lindex $argv  3]  
  28. #ssh的用户名  
  29. set username "www"   
  30. #ssh的密码  
  31. set passwd "123456"   
  32. set enddate [timestamp -format %Y%m%d]  
  33. set timeout 300  
  34.   
  35.   
  36. #------------------本地打包------------------------------------------------------  
  37. #---------------根据部署的服务器不同个性化打包不同的项目配置文件-----------------  
  38. system mkdir  -p ./tmp  
  39. system rm -fR ./tmp/*  
  40. system cp -r ./Application/$sitename  ./tmp/  
  41. system cp -r ./Configuration/$remotehost / $sitename /* ./tmp/ $sitename /application/config/  
  42. cd ./tmp/$sitename   
  43. #注意排除项目文件和svn文件  
  44. system tar -zcf $enddate \_ $buildnumber .tar.gz  --exclude-caches --exclude=web.config --exclude=.svn --exclude= '.buildpath|.config|.setting|.project'  *  
  45.   
  46.   
  47. #---------------将打包的文件通过scp拷贝到测试服务器上----------------  
  48.   
  49. spawn scp $enddate \_ $buildnumber .tar.gz  $username @ $remoteip :/wwwroot/  
  50. expect {  
  51.         "*(yes)*"  {  
  52.                 send "yes\r"   
  53.         exp_continue  
  54.         }  
  55.     "*password:*"  {  
  56.                 send "$passwd\r"   
  57.         exp_continue  
  58.         }  
  59.     eof {}  
  60. }  
  61.   
  62.   
  63. #-----------------------远程执行部署流程---------------------  
  64.   
  65. spawn ssh $username @ $remoteip   
  66. expect {  
  67.         "*(yes)*"  {  
  68.                 send "yes\r"   
  69.         exp_continue  
  70.         }  
  71.     "*password:*"  {  
  72.                 send "$passwd\r"   
  73.         exp_continue  
  74.         }  
  75.     "www@*"  {  
  76.         send "mkdir -p /wwwroot/$sitename/$enddate\_$buildnumber\r"   
  77.         sleep 1  
  78.         send "cd /wwwroot/$sitename/$enddate\_$buildnumber \r"   
  79.         sleep 1  
  80.         send "tar -zxf ../../$enddate\_$buildnumber.tar.gz \r"   
  81.         sleep 1  
  82.         send "rm -f /webdata1/$sitename \r"   
  83.         sleep 1  
  84.         send "ln -s /wwwroot/$sitename/$enddate\_$buildnumber /webdata1/$sitename \r"   
  85.         sleep 1  
  86.         send "rm -f ../../$enddate\_$buildnumber.tar.gz \r"   
  87.         sleep 1  
  88.         send "exit\r"   
  89.         exp_continue  
  90.     }  
  91.     eof {}  
  92. }  
  93.   
  94. #-------------------本地清理----------------------  
  95. cd ../  
  96. system rm -Rf *  
  97.   
  98.   
  99. exit   
  100. 供参考。。  
 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    linux expect安装及expect,tcl安装包

    Linux Expect 是一个强大的自动化工具,它允许用户编写脚本来自动处理需要交互的程序,比如SSH登录、SCP文件传输等。Expect 基于TCL语言,因此在使用之前需要先安装TCL环境。本压缩包提供了Linux Expect的安装教程、...

    Expect 5.21 for windows

    "Expect 5.21 for Windows" 是一个专为Windows操作系统设计的自动化工具,它基于原始的Unix/Linux工具“Expect”。 Expect是一个强大的脚本语言,主要用于自动化与交互式程序的通信,例如telnet、ftp、passwd等。在...

    expect手动安装.zip

    expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。 在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入...

    RHEL 7.8安装expect及使用.docx

    RHEL 7.8 安装 expect 及使用 Expect 是一种免费的编程工具语言,用来实现自动与交互式任务进行通信,而无需人工干预。Expect 是一个用来实现自动交互功能的软件套件。系统管理员可以用它来创建脚本以实现对命令或...

    expect-5.45.zip

    Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。使用它系统管理员的可以创建...

    expect在windows下使用的

    `Expect`是一个强大的脚本工具,主要用于自动化交互式命令行程序。它的工作原理是模仿终端行为,通过发送期望的输入并捕获预期的输出来控制这些程序,尤其适合于自动登录、运行远程命令、自动化系统配置等场景。在...

    expect5.43.0和tcl8.4.11.zip

    在IT领域,`expect`和`TCL`是两种重要的脚本工具,它们在自动化任务执行、系统管理和网络通信中发挥着关键作用。`Expect`是建立在`TCL`基础上的一个扩展,专为自动交互式应用程序设计,如SSH、telnet等。` Expect...

    expect5.45.4.tar

    Introduction to Expect The Expect package was installed in the LFS temporary tools directory for testing other packages. These procedures install it in a permanent location. It contains tools for ...

    ubuntu上expect的安装包

    在Ubuntu操作系统中,`Expect` 是一个非常有用的自动化脚本工具,它允许用户与交互式应用程序进行自动对话,比如在SSH登录、系统管理任务、自动安装软件等方面有着广泛的应用。然而,Ubuntu的默认仓库可能并未包含`...

    expect4j.jar 1.0

    Expect4j is an attempt to rewrite Expect in Java and provide bindings to the TclJava interpreter. The goal is to be able to port existing Tcl code bases that use Expect directly to Java without ...

    expect-5.21 for Windows 附带安装需要的组件ActiveTcl-8.6.12

    《期待已久的expect-5.21与ActiveTcl-8.6.12在Windows上的构建与应用》 在IT领域,自动化测试和脚本编写是不可或缺的一部分,特别是在Unix/Linux环境中,expect工具因其强大的交互性而备受推崇。然而,对于Windows...

    expect及其依赖rpm包(x64)

    `expect`工具正是这样一个强大的自动化脚本工具,尤其在处理交互式协议如SSH(Secure Shell)、FTP(File Transfer Protocol)和TELNET时,它能模拟用户输入,使得自动化过程变得更加简单。本文将深入探讨`expect`...

    linux下expect的安装方法

    Linux下的`expect`工具是一个强大的自动化管理利器,尤其适合处理那些需要交互式输入的脚本任务,比如自动登录、密码输入、脚本自动化等。它基于Tcl语言,通过模拟用户交互来自动化复杂的命令行操作。`expect`的安装...

    14.Shell脚本编程之expect.md

    Expect工具简介 Expect 是一种工具,主要用于实现自动化交互式的操作,它由 Don Libes 开发,基于 Tcl(Tool Command Language)语言。通过使用 Expect,可以将原本需要手动进行的操作,例如 SSH 登录、FTP 登录等...

    expect-5.21-for-win.rar

    《使用Expect 5.21 for Windows:自动化Shell交互脚本的利器》 在Windows操作系统环境中,虽然原生不支持Unix-like的shell脚本,但通过工具如Expect,我们可以实现类似的功能,进行命令行程序的自动化交互。Expect...

    Expect and using Expect with PERL

    ### 使用Expect与Perl进行自动化交互任务 #### 一、什么是Expect? Expect是一种基于TCL工具包的编程语言,专门设计用于自动化交互式任务。它的核心功能在于能够等待某个事件发生,并在该事件发生后执行相应的操作...

    expect所需的全部jar包

    在IT行业中,Expect是一个强大的工具,它主要用于自动化与交互式应用程序的通信,特别是在Unix和Linux环境中。这个"expect所需的全部jar包"包含了 Expect 源码包和所有必要的Java库,使得开发人员能够在Java程序中...

    linux实现交互执行:expect

    为了自动化这些过程,`expect`工具应运而生。`expect`是一个基于TCL(Tool Command Language)的脚本语言,主要用于自动化那些需要用户交互的任务,它能够模拟用户对命令行的输入,极大地提高了工作效率。 `expect`...

    linux/unix下expect5.45+tcl工具安装包、使用说明及范例

    Expect是一个强大的自动化脚本工具,它结合了Tcl语言,使得与交互式应用程序的通信变得简单。本安装包包含的是 Expect 5.45 版本和 Tcl 的集成,它们一起提供了丰富的功能,用于自动化执行那些通常需要人工干预的...

Global site tag (gtag.js) - Google Analytics