perl远程执行多台服务器shell命令

简介:
  在生成环境中通常运维需要执行非常多的重复命令,一台可能还好 多台就杯具了。尤其有时候要批量去更新多台服务器的文件,或者是删除。
   一个好运维都是懒惰的,所以自己写了个perl脚本可以远程去执行shell命令,很灵活。2个配置文件,一个管理服务器信息,一个放所需要执行的命令。
code:
#!/usr/bin/perl 
use strict; 
use Net::SSH::Expect; 
my @ssh_list; 
my $ssh_txt='ip_list.txt'; 
my $command_txt='command_txt.txt'; 
open FH,$ssh_txt; 
        while(<FH>){ 
        @ssh_list=split; 
        print "正在登陆".$ssh_list[0]."...\n"; 
        &ssh_conn("$ssh_list[0]","$ssh_list[1]","$ssh_list[2]","$ssh_list[3]"); 
        } 
        close    FH; 

sub    ssh_conn(){ 
                my($host,$port,$user,$pass) = @_; 
                my $ssh = Net::SSH::Expect->new( 
                                host        =>            $host, 
                                port        =>            $port, 
                                user        =>            $user, 
                                password                =>$pass, 
                                no_terminal         =>0, 
                                raw_pty =>1, 
                                timeout =>            3, 
                                ); 
                                                $ssh->debug(0); 
                                                $ssh->run_ssh() or die "SSH process coundn't start:$!"; 
                                                $ssh->waitfor( '\(yes\/no\)\?$', 1 ); #交互式修改密码,给予2秒的时间 
                                                $ssh->send("yes\n"); 
                                                $ssh->waitfor( 'password:\s*$/', 1); 
                                                $ssh->send("$ssh_list[3]"); 
                                                $ssh->send("su - root"); 
                                                $ssh->waitfor( 'password:\s*$/', 1); 
                                                $ssh->send("$ssh_list[4]"); 
                                                #$ssh->waitfor("#\s*",2); 
                                                open F1,$command_txt; 
                                                while(<F1>){ 


                                                my @command=split/\n/,$_; 
                                                print "$command[0]-->    "; 
                                                $ssh->exec("$command[0]"); 

                                                print "$ssh_list[0]命令执行完毕\n"; 


                                                } 
                                                close F1; 
                                                $ssh->close(); 
下面是2个文件内容。
[root@nagios script]# cat ip_list.txt 
192.168.2.101    22    mcshell     psswd    server1 
192.168.2.102    22    mcshell     psswd    server2 
192.168.2.103    22    mcshell     psswd    server3 
[root@nagios script]# cat command_txt.txt 
touch /home/mcshell/file1 
touch /home/mcshell/file2 
 
执行结果:
当然我这里为了测试方便,用了写的比较简单,大家也可以发挥想象,直接把复杂的shell或者perl密令直接放在command_txt.txt中。同样可以批量处理
 









本文转自 mcshell 51CTO博客,原文链接:http://blog.51cto.com/mcshell/988791,如需转载请自行联系原作者

目录
相关文章
|
5月前
|
安全 Linux Shell
使用SCP命令在CentOS 7上向目标服务器传输文件
以上步骤是在CentOS 7系统上使用SCP命令进行文件传输的基础,操作简洁,易于理解。务必在执行命令前确认好各项参数,尤其是目录路径和文件名,以避免不必要的传输错误。
520 17
|
6月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
983 21
|
8月前
|
JSON API 数据安全/隐私保护
使用curl命令在服务器上执行HTTP请求
总的来说,curl是一个非常强大的工具,它可以让你在命令行中发送各种类型的HTTP请求。通过学习和实践,你可以掌握这个工具,使你的工作更加高效。
602 30
|
9月前
|
弹性计算 人工智能 运维
摆脱繁琐命令-让运维更加流畅-阿里云ECS操作系统控制台运维篇
阿里云操作系统控制台提供了便捷的服务器监控与管理功能,简化了运维工作。通过将多台服务器纳入统一监控平台,用户可以快速查看CPU、内存、磁盘和网络等关键资源的使用情况,避免了逐一远程连接查询的繁琐操作。此外,该工具支持自动化数据汇总,极大地方便了日报、周报和月报的编写。测试过程中,系统展示了良好的稳定性和响应速度,尤其在网络抖动和大文件健康状态测试中表现出色。整体体验流畅,显著提升了运维效率。 操作系统控制台地址:[点击访问](https://alinux.console.aliyun.com/)
312 26
摆脱繁琐命令-让运维更加流畅-阿里云ECS操作系统控制台运维篇
|
9月前
|
Java 网络安全 Apache
SshClient应用指南:使用org.apache.sshd库在服务器中执行命令。
总结起来,Apache SSHD库是一个强大的工具,甚至可以用于创建你自己的SSH Server。当你需要在服务器中执行命令时,这无疑是非常有用的。希望这个指南能对你有所帮助,并祝你在使用Apache SSHD库中有一个愉快的旅程!
540 29
|
8月前
|
存储 Unix Shell
Shell 输出命令完全指南:echo 与 printf 的深度剖析
本文深入解析了 Shell 编程中 `echo` 和 `printf` 两个核心输出命令的用法与区别。`echo` 简单易用,适合基础输出;`printf` 功能强大,支持复杂格式化。文章从语法、转义序列、高级技巧到实际应用场景(如日志记录、进度显示)逐一讲解,并对比两者的性能与适用场景,帮助开发者根据需求灵活选择。最后通过进阶技巧和常见问题解答,进一步提升对两者的掌握程度。
396 1
|
9月前
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
649 17
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。