使用expect自动化批量向多台机器分文件

自动化运维的过程中,某些时候我们需要受用输入密码,这时候Expect这个工具可以完成。

首先要安装expect,直接yum安装就可以的。

下来我们试试expect这个工具:

使用ssh登陆:

#!/bin/expect                                      #脚本解释器
spawn ssh [email protected]  uptime             #开启expect自动交互,执行ssh命令
expect "*password" {send "123456\n"}               #如果ssh命令输出匹配*password,就发送123456给系统
expect eof                                         #表示交互结束

下来时匹配多个expect:

#!/bin/expect

spawn ssh [email protected]  uptime

expect {                                       #将多个字符放在expect里面,然后spawn执行的过程中进行匹配
  "yes/no" {exp_send "yes\r";exp_continue}      #exp_send和前面的send一样,匹配多个字符串在每次匹配并执行动作后,加上exp_continue
  "*password" {exp_send "123456\n"}
}
expect eof

利用expect响应shell脚本中的多个read读入:

shell脚本:
#!/bin/bash
read -p "plz input your username:" name
read -p "plz input your password:" pass
echo -en "your username $name,your password $pass\n"
~
expect脚本:
#!/bin/expect
spawn sh /root/32.sh
expect {
  "username" {exp_send "xpg\r";exp_continue}
  "password" {exp_send "123456\n"}
}
expect eof
~

18.4.5 send_user命令

相当于echo -n这个命令:

#!/bin/expect
send_user "I AM OLDBOY\n"
send_user "I am who?\n"

18.4.6 exit命令

类似shell中的shell,直接退出expect脚本,除了基本的退出脚本功能之外,还可以利用这个脚本做一些关闭前的清理和提示等工作:

#!/bin/expect
send_user "I AM OLDBOY\n"
send_user "I am who?\n"
exit -onexit {
  send_user "Good bye\n"
}

18.5 Expect程序变量

18.5.1普通变量

定义变量的基本语法如下:

set   变量名   变量值

打印:

puts   $变量名

#!/bin/expect
set password "123456"
puts $password

18.5.2特殊参数变量

在expect里有与shell脚本里的$0,$1,$2等类似的特殊参数变量,用于接收及控制expect脚本传参。

在expect中$argv表示参数数组,可以使用[lindex  $argv n]接收expect脚本传参,n从0开始,分别表示第一个[lindex $argv0] 参数、

例如:

#!/bin/expect
set file [lindex $argv 0]
set user [lindex $argv 1]
set dir  [lindex $argv 2]

puts $argv0
puts $argc
puts $file
send_user "your name is $user;your dir is $dir\n"

18.6 Expect程序中的if条件语句

if { 表达式 } {

指令

}

或者

if { 条件表达式 }  {

指令

}else  {

指令

}

范例18-9 使用if语句判断脚本传参的个数,如果不符合给予提示:

#!/bin/expect
if { $argc != 3 } {
   send_user "usage:expect $argv0 file host dir/n"
   exit -onexit {
   send_user "Good bye bye"
   }
}
set file [lindex $argv 0]
set host [lindex $argv 1]
set dir  [lindex $argv 2]

puts $file
puts $argv0
puts $argc
~

18.7 timeout 关键字

这个关键字是服务于全局的,而不是某一个;和shell中的sleep很像,休息30s。

18.8企业生产场景下expect案例

  1. 开发expect自动交互的脚本:
#!/bin/expect
if { $argc != 2 } {
   send_user "usage:expect $argv0 ip cmd/n"
   exit
   }

set ip   [lindex $argv 0]
set cmd  [lindex $argv 1]
#set dir  [lindex $argv 2]
spawn ssh [email protected]$ip  $cmd
expect {
   "yes/no" {exp_send "yes\r";exp_continue}
   "*password" {exp_send "123456\n"}
}
expect eof

上面是一个,我们向想办法批量执行execpt脚本试试:

用这个脚本调用上面的脚本,就可以实现循环批量

#!/bin/bash
if [ $# - ne 1 ]
  then
    echo "USAGE:$0 cmd"
    exit
fi

cmd=$1

for i in 136 137
do
  expect /root/4.exp 192.168.116.$i $cmd
done

18.8自动化 批量发送文件 **

下面这两个脚本相结合就能实现

#cat 5.exp
#!/bin/expect

if { $argc != 3 } {
  send_user "plz input:usage $argv0 ip cmd"
  exit
}
set file [lindex $argv 0]
set ip   [lindex $argv 1]
set dir  [lindex $argv 2]

spawn scp -rp $file [email protected]$ip:$dir

expect {
  "yes/no" {exp_send "yes\r";exp_continue}
  "*password" {exp_send "123456\n"}
}
expect eof
#cat 55.sh
#!/bin/bash
if [ $# -ne 2 ]; then
   echo "plz input $0 file dir"
   exit
fi
file=$1
dir=$2
for i in 136 137
do
   expect 5.exp $file 192.168.116.$i $dir
done
~

原文地址:http://blog.51cto.com/11726212/2071941

时间: 2024-10-09 11:24:17

使用expect自动化批量向多台机器分文件的相关文章

一个修改10台机器host文件需求 引发的脚本

#!/bin/bash echo "enter heno's password" read henoPassword echo "enter root's password" read rootPassword for i in 11 12 13 14 15 16 17 18 19 20 21;         do                 ip="192.168.10."$i                 comand="s

linux 从一台机器复制文件到另一台linux机器上去

1.功能说明scp就是security copy,用于将文件或者目录从一个Linux系统拷贝到另一个Linux系统下.scp传输数据用的是SSH协议,保证了数据传输的安全,其格式如下:scp 远程用户名@IP地址:文件的绝对路径 本地Linux系统路径 scp 本地Linux系统文件路径 远程用户名@IP地址:远程系统文件绝对路径名scp使用第一种格式是将远程Linux系统上的某个文件或者目录拷贝到本地Linux系统上来,使用第二种是将本地的某个文件或者目录拷贝到远程Linux系统的某个路径下.

centos7安装rsync及两台机器进行文件同步

安装及配置 yum -y install rsync #启动rsync服务 systemctl start rsyncd.service systemctl enable rsyncd.service #检查是否已经成功启动 netstat -lnp|grep 873 服务端配置 # /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # config

企业实战脚本案例3:批量管理自动化运维100台小规模服务器

批量管理自动化运维100台小规模服务器 目录 1.脚本背景介绍 2.脚本技术需求分析 2.1 SSH免登陆认证 2.2 Expect实现key分发 2.2 PSSH家族命令详解 3.脚本功能及实现过程 3.1 脚本运行环境介绍 3.2 脚本功能介绍 3.3 脚本编写思路 3.4 脚本编写案例 一.脚本背景介绍 在企业中经常会用遇到小规模的集群服务器,在日常的管理中经常会遇到重复性的动作,如更新备上百台服务器上的ssh公钥.备份上百台服务器上的/etc/passwd配置文件等等,通常情况下采用专用

Ansible系列(五):playbook应用和roles自动化批量安装示例

html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary { display: block } audio,canvas,progress,video { display: inline-block; vertical-align: baseline } audio:not([co

自动化批量安装系统

1. 什么是PXE 严格来说,PXE 并不是一种安装方式,而是一种引导方式.进行 PXE 安装的必要条件是在要安装的计算机中必须包含一个 PXE 支持的网卡(NIC),即网卡中必须要有 PXE Client.PXE (Pre-boot Execution Environment)协议可以使计算机通过网络启动.此协议分为 Client端和 Server 端,而PXE Client则在网卡的 ROM 中.当计算机引导时,BIOS 把 PXE Client 调入内存中执行,然后由 PXE Client

自动化批量部署工具Ansible笔记之ansible安装与Inventory文件

一.ansible简介 ansible是一款自动化运维部署工具,与saltstack,pupet等不同的是,ansible没有采用C/S的架构,即没有客户端与服务端之分.这也就意味着,ansible的安装更加方便,管理节点更加灵活(任何一台安装了ansible的机器都可以充当管理节点). ansible提供了丰富的模块来方便的完成管理任务,对于复杂的管理任务来说,ansible通过编写playbook的方式来批量执行.而且ansible也可以并发的执行操作,可以同时在多台机器上执行playboo

expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统、批量远程执行

20.31 expect脚本同步文件 自动同步文件 #!/usr/bin/expect set passwd "rootroot" spawn rsync -av [email protected]:/tmp/12.txt /tmp/ expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r"} } expect eof 执行 [[ema

expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

20.31 expect脚本同步文件#!/usr/bin/expectset passwd "liang.123"spawn rsync -av [email protected]:/tmp/12.txt /tmp/ 将远程的/tmp/12.txt同步到本地的机器上 expect {"yes/no" { send "yes\r"} 第一次会提示yes或no"password:" { send "$passwd\r&q