本例子尝试使用Perl脚本借助Expect模块实现如下目的:

  • 登陆多台设备

设备登陆信息按如下格式存放于文件中。

$ cat hosts.txt
192.168.30.7:node1:telnet:bee1:123456
192.168.30.66:node2:ssh:bee2:123456
  • 在每台设备上批量执行命令

要执行的命令集合按如下格式存放于文件中。

$ cat cmds.txt
date
w
ifconfig
more mylog.txt
  • Perl脚本实现,使用了Expect模块

借助Expect模块实现登陆,执行命令,捕获命令回显,取日志,自动回复more分页,ping探测主机等功能。

脚本中的语句形式可供参考。

  • 脚本如下:
#! /usr/bin/perl

#安装模块
#cpan
#install Expect
#install Net::Ping
#perl -MCPAN -e "install autodie" use utf8;
use Expect;
use autodie;
use Net::Ping; #0为关闭本地回显
#$Expect::Log_Stdout=0;
$ENV{TERM}="xterm";
#不进行缓冲直接进文件
#$|=1; #cmds.txt的文件格式:
#一行一条命令
my @cmds;
my $cmds_file="./cmds.txt";
open CMDS,"<",$cmds_file or die "Can't open file $cmds_file: $!\n";
print "commands to run: \n";
while(<CMDS>){
print "$_";
chomp;
push @cmds,$_;
}
close CMDS;
print "=============================\n"; mkdir 'log' unless -e 'log';
chomp(my $now=`date +%y%m%d`);
my $exp=Expect->new;
#$exp->raw_pty(1); #hosts.txt的文件格式:
#IPv4地址:主机名:登陆方式(ssh/telnet):用户名:密码
my $hosts_file="./hosts.txt";
open HOSTS,"<",$hosts_file or die "Can't open file $hosts_file: $!\n";
while(<HOSTS>){
chomp;
@host=split /:/;
if(&ping_host(@host)){
&login_host(@host);
}
}
close HOSTS;
print "Loging finished!\n"; #子程序
sub login_host{
print "login to $_[1]($_[0])...\n";
my $user=$_[3];
my $passwd=$_[4];
my $ahost=$_[1]; if($_[2] =~ /ssh/i){
$exp=Expect->spawn("ssh -l $user $_[0]") or die "Can't login to $_[1]($_[0]): $!\n";
$exp->expect(3,
[ #使用正则来表达包含关系
qr/connecting\s\(yes\/no\)\?/i,
sub {
my $self=shift;
$self->send("yes\n");
exp_continue;
}
],
[
qr/password:/i,
sub {
my $self=shift;
$self->send("$passwd\n");
exp_continue_timeout;
}
]
);
#取log
$exp->log_file("log/$_[1]-$now.log", "w");
$exp->send("\n"); foreach (@cmds){
$exp->send("$_\n");
$exp->expect(2,
[ #使用正则来表达包含关系
qr/\[>#$\]/,
sub {
my $self=shift;
$self->send("\n");
exp_continue_timeout;
}
],
[
qr/--More--/i,
sub {
my $self=shift;
$self->send(" ");
exp_continue;
}
]
);
}
#关闭log
$exp->log_file(undef);
#退出登陆
$exp->send("exit\n") if ($exp->expect(undef,'-re' => '[>#$]')); #undef是痴等
print "\nLogout from $_[1]($_[0])\n";
}else{
$exp=Expect->spawn("telnet $_[0]") or die "Can't login to $_[1]($_[0]): $!\n";
$exp->expect(30,
[ #使用正则来表达包含关系,否则就是精确匹配
qr/$ahost login:/i,
sub {
my $self=shift;
$self->send("$user\n");
exp_continue;
}
],
[
qr/Password:/i,
sub {
my $self=shift;
$self->send("$passwd\n");
exp_continue_timeout;
}
]
);
#取log
$exp->log_file("log/$_[1]-$now.log", "w");
$exp->send("\n"); foreach (@cmds){
$exp->send("$_\n");
$exp->expect(2,
[ #使用正则来表达包含关系,否则就是精确匹配
qr/\[>#$\]/,
sub {
my $self=shift;
$self->send("\n");
exp_continue_timeout;
}
],
[
qr/--More--/i,
sub {
my $self=shift;
$self->send(" ");
exp_continue;
}
]
);
}
#关闭log
$exp->log_file(undef);
#退出登陆
$exp->send("exit\n") if ($exp->expect(undef,'-re' => '[>#$]')); #undef是痴等
print "\nLogout from $_[1]($_[0])\n";
}
} sub ping_host{
$p=Net::Ping->new("icmp");
if($p->ping($_[0])){
print "$_[1]($_[0]) is alive\n";
return 1;
}else{
print "$_[1]($_[0]) is die\n";
return 0;
}
}

Perl脚本通过Expect登陆多台设备批量执行命令并Log的更多相关文章

  1. 【Shell实战】批量在多台服务器上执行命令

    功能说明:批量在多台服务器上执行命令 #!/bin/bash # ========================================== # 功能:批量在多台服务器上执行命令 # 方法: ...

  2. shell脚本批量执行命令----必需判断上一步执行结果--没有捷径

    # 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...

  3. expect 批量执行命令

    在跳板机上执行脚本,登录到远程机器分区格式化挂载命令 #!/bin/bashpasswd='engine'/usr/bin/expect <<-EOFset time 40spawn ss ...

  4. windows 批量执行命令的脚本

    因为老板一个电话,我的国庆节就没了....,老板要我写个东西,能批量执行500台windows的命令并返回结果,虽然完成以后是非常的简单,但是因为我走了很多弯路,一开始想用powershell来写,后 ...

  5. python实现Telnet远程登陆到设备并执行命令

    #encoding=utf-8 import telnetlib import time def do_telnet(Host, username, password, finish, command ...

  6. shell 脚本实战笔记(8)--ssh免密码输入执行命令

    前言: ssh命令, 没有指定密码的参数. 以至于在脚本中使用ssh命令的时候, 必须手动输入密码, 才能继续执行. 这样使得脚本的自动化执行变得很差, 尤其当ssh对应的机器数很多的时候, 会令人抓 ...

  7. shell脚本安装python、pip-----非交互式的--批量执行函数

    首先把pip-.tgz 安装包放在 /usr/local 下面,按照顺序先安装pip,再安装python.不要先安装或只安装python,否则很容易出错, cat >>pip-python ...

  8. CentOS 下运维自动化 Shell 脚本之 expect

    CentOS 下运维自动化 Shell脚本之expect 一.预备知识: 1.在 Terminal 中反斜杠,即 "" 代表转义符,或称逃脱符.("echo -e与pri ...

  9. linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)

    之前介绍过ansible的使用,通过ssh授权批量控制服务器集群 但是生成密钥和分发公钥的时候都是需要确认密码的,这一步也是可以自动化的,利用ssh + expect + scp就可以实现,其实只用这 ...

随机推荐

  1. 几种Android混淆和逆向工具介绍

    针对Android面临的安全风险,一些防止逆向的方法应运而生.代码混淆在X86架构上曾经被广泛研究,他被用于保护软件的只是产权,但是恶意软件也常常使用他来对抗杀毒软件或者对抗逆向分析者,代码混淆可以给 ...

  2. (10.1)Python学习笔记二

    1.在项目工程中要模块化测试一个开发的功能,在测试通过后交付给项目组其他人员继续开发.要保证代码开发的性能和效率以及可扩展性. 2.项目工程中的文件夹分类要功能模块明确清晰,在python中引入某一个 ...

  3. postgresql批量删除表

    CREATE FUNCTION del_ora_table() RETURNS void AS $$ DECLARE tmp ); DECLARE names CURSOR FOR select ta ...

  4. 微信小程序 button 组件

    button 组件 拥有强大的功能 自身可以拥有很多跟微信风格的样式,且是 表单 和 开放的能力 重要的 按钮 button 的属性: size: 类型 字符串 按钮的大小 属性值:default 默 ...

  5. kubernetes-traefik(二十一)

    参考文档:http://traefik.cn/ traefik和ingress的对比 ingress: 使用nginx作为前端负载均衡,通过ingress controller不断的和kubernet ...

  6. MySQL5.6transportable tablespace

    https://blog.csdn.net/xiaoyi23000/article/details/53150776

  7. OGG-DDL复制

    http://blog.sina.com.cn/s/blog_96d348df0102vg6q.html OGG目前只支持Oracle和TeraData的ddl复制,Oracle数据库能够支持除去数据 ...

  8. dp基础大概 (8.6)

    一些前言: 据说动态规划会用排序,数据结构来进行乱搞优化操作 动态规划滴核心是个啥呢?状态表示和状态转移 设状态:哪些因素会影响到最终答案,就把哪些因素用数组的维度表示出来 要充分描述,也要简洁 举个 ...

  9. 设计模式-Runoob:设计模式

    ylbtech-设计模式-Runoob:设计模式 1.返回顶部 1. 设计模式 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发 ...

  10. 004-spring-data-elasticsearch 3.0.0.0使用【二】-spring-data之定义方法、创建repository实例、从聚合根发布事件

    续上文 1.4.定义方法 存储库代理有两种方法可以从方法名称派生特定于存储的查询.它可以直接从方法名称派生查询,或者使用手动定义的查询.可用选项取决于实际store.但是,必须有一个策略来决定创建什么 ...