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 格式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用多种方法执行cmd命令。其中一种方法是使用os.system(cmd)函数。这个函数可以简单地执行cmd命令,但无法获取控制台输出的内容,只返回命令的退出状态。如果命令执行成功,返回值为0。例如,可以使用以下代码执行cmd命令并获取返回值: ```python import os retValue = os.system("cmd命令") print(retValue) ``` 另一种方法是使用subprocess模块。subprocess模块提供了更高级、更强大的功能来执行命令,并且可以获取控制台输出的内容。可以使用subprocess.run()函数执行指定的命令,并等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。例如,可以使用以下代码执行cmd命令并获取输出: ```python import subprocess result = subprocess.run("cmd命令", shell=True, capture_output=True, text=True) print(result.stdout) ``` 请注意,上述代码中的"cmd命令"应替换为您要执行的实际命令。使用subprocess模块可以更灵活地执行和处理命令,因此在大多数情况下,推荐使用subprocess模块来执行cmd命令。 #### 引用[.reference_title] - *1* *3* [Python 执行cmd命令的3种方法简单示例,并获取返回信息、执行命令结果(成功 or 失败)](https://blog.csdn.net/qq_33704787/article/details/124755072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [一文看懂python如何执行cmd命令](https://blog.csdn.net/Rocky006/article/details/131154694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值