python批量运行cmd_python 之多主机批量执行命令

当我们有很多台linux服务器的时候,而每台服务器都需要做同一个操作,比如很多节点的集群环境下,要更改一个配置文件,哪怕只是一行,在传统情况下,也需要每台去单独操作。

最近也是有这样的需求,需要操作的机器特别多,所以就写了一个小的程序

看到这里,可能有同学说了,我做了 ssh 免密码登录,可以用shell写个循环也能实现啊。可是当你做ssh的时候,不也是一台一台的操作吗?

其实用 shell 也可以做,并且shell 没有依赖,只不是你要提前把 ssh 免密码登录做好。

而使用 shell 若不做免密码,循环的时候,要输入每台的密码,我曾经在网上搜索过,好像没有什么方法可以把这个交互式做成自动化。

言归正传,本次使用 python ,并且使用 python 的 paramiko 模块,来操作。

paramiko 模块需要 gcc , openssl , pycrypto 等依赖,下面就来安装它。

## debian & ubuntu 平台

apt-get update

apt-get install gcc g++ openssl libssl-dev python-dev python-pip libffi-dev

## centos redhat 等平台,需要先安装 epel 第三方仓库

yum install epel-release

##之后再安装

yum install gcc gcc-c++ openssl openssl-devel python-devel python-pip libffi-devel

并且 paramiko 至少需要 python 2.7 以上的版本才支持。如果你 python 低于这个版本,请自行升级

依赖安装完以后,把 pip 升级到最新版本

pip install –upgrade pip

安装 paramiko

pip install pycrypto

pip install paramiko

请注意,pip 需要root权限,过程若有报错,请看详细情况,一般是上面的依赖没有安装好

目前已经将代码写成命令行操作了,下面直接上代码,然后再说用法

#!/usr/bin/python

# — coding: utf-8 —

import paramiko

from optparse import OptionParser

from sys import argv

def ssh2(ip, port, username, password, cmd):

for hosts in ip:

try:

paramiko.util.log_to_file('paramiko__.log')

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(hosts, port, username, password, timeout=7)

stdin, stdout, stderr = ssh.exec_command(cmd)

cmd_result = stdout.read(), stderr.read()

print '%s –> command has been submitted, results are as follows.' % (hosts)

for o in cmd_result:

print o,

ssh.close()

print "\n"

except Exception, msg:

print hosts, msg

if __name__ == '__main__':

parser = OptionParser()

parser.add_option("–ip",

dest="ipaddr",

help="target host ip address"

parser.add_option("–ipfile",

dest="ipfile",

help="ip list file"

parser.add_option("–port",

dest="port",

help="ssh port number"

parser.add_option("–username",

dest="username",

help="ssh user name"

parser.add_option("–password",

dest="password",

help="ssh password"

parser.add_option("–cmd",

dest="cmd",

help="Commands to execute"

(options, args) = parser.parse_args()

if "–ip" in argv and "–ipfile" in argv:

print "Accept only one argument, use –ip or –ipfile"

exit(1)

if options.ipaddr == None:

ip_list = open(options.ipfile, "r")

ip = ip_list.read().split("\n")[:-1]

ip_list.close()

if options.ipfile == None:

ip_list = options.ipaddr

ip = ip_list.split(",")

cmd = options.cmd

port = int(options.port)

username = options.username

password = options.password

ssh2(ip, port, username, password, cmd)

将代码保存到一个文件,之后执行 python 文件名 -h ,即可以查看帮助,run_cmd.py 是我保存的名字,如下:

root@ainy:~# python run_cmd.py -h

Usage: run_cmd [options]

Options:

-h, –help show this help message and exit

–ip=IPADDR target host ip address

–ipfile=IPFILE ip list file

–port=PORT ssh port number

–username=USERNAME ssh user name

–password=PASSWORD ssh password

–cmd=CMD Commands to execute

root@ainy:~#

-h 查看帮助信息

–help 查看帮助信息

–ip 指定目标主机的IP地址,多个IP地址时,请使用英文状态的逗号分隔

–ipfile ip地址列表文件,可以把IP地址写一个文件里面,一行一个

–port ssh 端口号

–username ssh账号

–password ssh密码

–cmd 需要执行的命令,命令中包含空格,请使用双引号引起来

PS: –ip 参数 和 –ipfile 参数,您必须指定其中一个,程序也只接受一个

示例:

# 单个主机

python run_cmd.py –ip 192.168.1.22 –port 22 –username root –password 123456 –cmd "ls -l"

# 多个主机

python run_cmd.py –ip 192.168.7.19,192.168.7.20,192.168.10.177,192.168.73.145 –port 22 –username root –password 123456 –cmd "ls -l"

# 使用IP地址列表文件

python run_cmd.py –ipfile /root/kvmip.txt –port 22 –username root –password 123456 –cmd "ls -l"

IP 地址列表文件,请使用纯文件文件,并把换行符设置为 unix\linux 格式,否则会出错。

在windows 操作系统上,请不使用 记事本来创建 IP 列表文件,因为其换行符和 linux 不同,windows上您可以使用任何一款代表编辑器,上面可以转换换行符格式

在 linux 系统,您也可以直接使用 vim 等编辑器工具来创建IP列表文件。其换行符默认即是 unix\linux 格式

原文链接:https://blog.csdn.net/weixin_39648492/article/details/110545319

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/8191

(1)
上一篇 2022年10月1日 11:27
下一篇 2022年10月1日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml