Perl+Expect登陆多台设备批量执行命令+Log

Expect.pm:Expect Perl模块的官方源代码 立即下载
尝试使用Perl脚本借助Expect模块实现如下功能:
  1. 登陆多台设备

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

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

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

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

借助Expect模块实现登陆,执行命令,捕获命令回显,取日志,自动回复more分页,ping探测主机等功能。脚本中的语句形式可供参考。

  1. 脚本如下:
#! /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"); #需要root权限
    if($p->ping($_[0])){
        print "$_[1]($_[0]) is alive\n";
        return 1;
    }else{
        print "$_[1]($_[0]) is die\n";
        return 0;
    }
}

如果没有root权限
ping_host子程序可以替换为如下调用系统ping命令的方法

use Net::Ping::External qw(ping);
...

sub ping_host{
	my $alive = ping(host => $_[0]);
    if($alive){
        print "$_[1]($_[0]) is alive\n";
        return 1;
    }else{
        print "$_[1]($_[0]) is die\n";
        return 0;
    }
}
Perl Expect参考手册(英文) 这是从Expect模块的正式manual里提取出来的,虽然看起来有点费眼,但是还是很有用的。网上有关Expect的信息不算很多,这个可以做很好的补充。 立即下载

相关推荐

Perl批量远程执行指令脚本

Perl批量远程执行指令脚本 批量远程执行命令的小工具 1.支持把主机分组执行命令 2.支持切换用户来执行命令 3.支持修改用户密码、切换用户的密码、Root密码 4.支持日志记录操作指令、屏幕输出 5.支持断线重连。因为是单进程单线程的,所以有可能执行到后面的机器SSH连接已断开。 --- 1.语言字符需要zh_CN.UTF-8 2.需要Perl >= 5.10.1 3.需要两个模块:XML::Simple.pm, Net::SSH::Expect.pm(已经集成在文件夹下, 无需安装)

Perl的Expect模块学习

Expect模块可以用来向需要交互执行的程序输入必要的信息。以脚本形式实现交互式应用程序的语言。 代码: $exp = new Expect; #new一个Expect. $exp->spawn($command,@params); #fork和exec一个新进程用来执行$command命令. $exp->expect($timeout,$content

4723

Screenshot_2026-11-03-16-23-09-34.jpg

Screenshot_2026-11-03-16-23-09-34.jpg

Perl脚本通过Expect登陆多台设备批量执行命令并Log

本例子尝试使用Perl脚本借助Expect模块实现如下目的: 登陆多台设备 设备登陆信息按如下格式存放于文件中。 $ cat hosts.txt 192.168.30.7:node1:telnet:bee1:123456 192.168.30.66:node2:ssh:bee2:123456 在每台设备上批量执行命令 要执行的命令集合按如下格式存放于文件中。 $ cat cmds...

banzhan2888的博客 375

研发流程后端开发工具,提示功能开发效率

后端开发工具

Expect and using Expect with PERL

EXPECT: A TCL based Toolkit for Automating Interactive Tasks. Leveraging the task specific capabilities of Expect with the power and flexibility of PERL. Presented to Philadelphia PERLMongers, September 9, 2002.

Expect模块安装 Perl脚本

一、Expect模块安装 通过安装Perl的Expect模块可以方便的实现远程主机自动登入和执行命令的功能。由于Expect模块依赖于IO::Tty模块,所以要使用Expect模块需要安装这2个模块: (1)IO-Tty-1.10 (2)Expect-1.21 具体的安装模块很简单,和以前一样:perl Makefile.PL/make/make test/make install。

boyishachang的专栏 1673

gRPC之gRPC开发流程与入门案例

gRPC之gRPC开发流程与入门案例

YIYIYI 3759

Perl Expect模块

Expect是Unix系统中用来进行自动化控制和测试的软件工具,由Don Libes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet、ftp、Passwd、fsck、rlogin、tip、ssh等等.该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中.   当然Perl也集成了Expect...

佼佼者 638

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7690

零基础玩转IndexTTS2:5分钟搭建个人语音克隆工具(支持B站同款情感语音)

本文详细介绍了如何零基础使用IndexTTS2快速搭建个人语音克隆工具,支持B站同款情感语音。IndexTTS2作为自回归零样本TTS系统,突破传统技术限制,实现精准时长控制和丰富情感表达。通过HuggingFace在线演示,用户可轻松克隆音色并调节情感参数,适用于自媒体配音、有声书朗读等场景。

purple的博客 919

PERL Expect

PERL Expect.pmExpect.pm 模块:主要用来和另外一个server进行交互的,比如ftp,telnet等等。在写一些监控脚步上,也会经常用到。我所用到的方法很简单,spawn($command,@params),Forks and execs $command. Returns an Expect object upon success or undef if t

(Andrew)的专栏 3877

CPRI原理及应用--基本原理

本文主要介绍CPRI的基本原理,包括CPRI的发展历程、CPRI基本协议、速率、帧结构、时延模型等

u014035968的博客 2万+

Perl脚本中Expect模块的学习使用

Expect模块可以用来向需要交互执行的程序输入必要的信息。以脚本形式实现交互式应用程序的语言。代码:$exp = new Expect;new一个Expect.$exp->spawn($command,@params);fork和exec一个新进程用来执行$command命令.$exp->expect(timeout,timeout,content);‘-re’.在timeout内,期待出现包含t

jichenchen1990的专栏 4666

在 FlexSim 中建 AGV 小车模型时,如果设定“每次充电需要 2 小时才能充满”,应该如何配置 AGV 的充电功能?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 881

从 AI 助手到 ADT 自动化桥梁:全面解析 Vibing Steampunk 的定位、能力边界与典型使用场合

Vibing Steampunk是一个面向SAP ABAP开发的AI自动化工具集,它通过ADT API将SAP开发能力系统化地暴露给AI助手和命令行工作流。该工具支持ECC、S/4HANA等所有启用ADT的系统,提供代码读取、修改、测试、调试等全流程自动化能力。核心功能包括AI调试、上下文压缩、ABAP语言服务、Lua脚本自动化等,并内置多重安全控制。其分层架构兼容标准ADT和WebSocket扩展,既适合AI驱动开发,也支持传统DevOps自动化,特别适用于老系统代码考古、知识接力和复杂问题诊断场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 152

perl下利用Expect模块实现ssh自动登录

perl下利用Expect模块实现ssh自动登录

bobo now~ 504

知识存储之Apache Jena

知识图谱的存储可以分为基于表结构的存储和基于图结构的存储。1️⃣基于表结构的存储基于表结构的存储利用二维的数据表对知识图谱中的数据进行存储。根据不同的设计原则,知识图谱可以具有不同的表结构:💨知识图谱实质上是一个个的三元组,一种简单直接的存储方式是设计一张三元组表用于存储所有三元组,有不少比较成熟的产品利用该形式存储知识图谱,包括Jena、Oracle、Virtuoso等。💨为每种类型构建一张表,同一类型的实例存放在相同的表中。

Puzzle的博客 6065

perl的expect使用方法,实现非交互式登录

perl的expect基本使用方法.

(Andrew)的专栏 3606

第二篇:APS智能排产实战:OR-Tools与coptpy从入门到案例

专注于具体的技术实现,包括 OR-Tools 和 coptpy 的详细使用指南、建模技巧、日志解读,以及一个完整的两阶段生产排程案例。适合准备动手开发 APS 系统的工程师和研究者。

算法工程师 454

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

[Perl] use Expect

Expect模块可以用来向需要交互执行的程序输入必要的信息。相当于expect脚本的Perl语言实现。 spawn函数——对应expect脚本中的spawn 语法:Expect->spawn($cmd,@param); 参数:LIST或program LIST形式。 功能:调用exec命令执行程序。 返回值:对象本身。 expect函数——对应expect脚本中的expect 语法:

凡星闪点 3744

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

使用 Perl 脚本实现交互式命令行程序的管理与测试自动化

<br /><br />概述<br />交互式程序通常需要用户手动完成一些操作,因此常常会成为系统管理自动化和测试自动化中的障碍。最早出现在 Unix 上的 Expect 语言可以用来和 passwd/ssh/telnet/ftp 等命令行程序进行交互,将用户从这些手工操作中解放出来。作为 Tcl 语言的扩展,Expect 最初由 Tcl 编写,但是现在已经有了 Perl 和 Python 的实现。Perl 作为最为流行的脚本语言之一,整合了 C/sh/sed/awk 的优点且和系统结合紧密,已成为系统管理

ace_fei的专栏 2670

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Perl Net::SSH::Expect.pm 包详解

Net::SSH::Expect.pm  new(): 以哈希的方式指定参数: 'host'=> 'user' => 'password' => 'port' => 'raw_pty'=> 创建pty 1. login() 返回所有的结果;可以根据返回结果判断是否登陆成功; 2.send() 发送命令,命令输出结果会保存在缓存中; 3.before()

天纵神武 2670

perl的expect和xml模块简单使用

Expect.pm 模块:主要用来和另外一个server进行交互的,比如ftp,telnet等等。在写一些监控脚步上,也会经常用到。我所用到的方法很简单,spawn($command,@params),Forks and execs $command. Returns an Expect object upon success or undef if the fork was unsuccessf...

weixin_34360651的博客 155
上一篇: Perl学习笔记-10
下一篇: XML与XPath的小贴士
beeworkshop
博客等级 码龄25年 103粉丝 299原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值