Python批量运维之执行命令(ssh登录)

前言

最近由于工作的原因,需要给客户安装防护软件,由于对方大部分机器都是Linux系统并且未使用运维管理类的软件。因此需要人工一台台登录执行命令(数量大约2000台),但所幸的是软件的安装部署已集成脚本,只需要执行./ 执行即可。

前后写过两次脚本,第一次由于没有考虑到root账号不能直接ssh登录,无法正常执行安装。因此第二次增加了执行su -l后自动填入密码切换至root权限后再执行。

坏境

Windows 2012 + Python2.7 + paramiko模块
此环境为申请到的堡垒机,其他设备不能直接接入内网。
(由于paramiko模块并非Python自带,需要pip或者手动安装,鉴于机器处在物理隔离的环境中,因此选择手动安装。)

用法

根据客户给出的系统密码表excel,将机器信息整理成以下格式并保存为txt(ip:user:pass:port:root_pw)程序会自动读取txt内容,然后进行登录->切换权限->执行命令。

##################(晚点填)###################

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# -*- coding: UTF-8 -*-
import time
import paramiko

cmdtext = 'uname -r'#要执行的命令

def verification_ssh(host,username,password,port,root_pwd,cmd):

s=paramiko.SSHClient()
s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname = host,port=int(port),username=username, password=password)
if username != 'root':
ssh = s.invoke_shell()
time.sleep(0.1)
ssh.send('su -\n')
buff = ''
while not buff.endswith('Password: '):
resp = ssh.recv(9999)
buff +=resp
ssh.send(root_pwd)
ssh.send('\n')
buff = ''
while not buff.endswith('# '):
resp = ssh.recv(9999)
buff +=resp
ssh.send(cmd)
ssh.send('\n')
buff = ''
while not buff.endswith('# '):
resp = ssh.recv(9999)
buff +=resp
s.close()
result = buff
else:
stdin, stdout, stderr = s.exec_command(cmd)
result = stdout.read()
s.close()
return result
if __name__ == "__main__":
for i in open('ssh.txt'):
if '#' in i[0]:
pass
else:
ssh_list = i.strip().split(':')
try:
result = verification_ssh(host=ssh_list[0], username=ssh_list[2],password=ssh_list[3],port=ssh_list[1],root_pwd=ssh_list[4],cmd=cmdtext)
if 'Install G01 success' in result:# 判断是否安装成功
print ssh_list[0],'Install G01 Success!'
with open('install_log.txt','a') as f:
text = ssh_list[0]+"-----------------------\n"+result+"-----------------------\n"
f.write(text)
elif 'FAILED' in result:#判断相关服务未启动
print ssh_list[0],'FAILED'
with open('FAILED_log.txt', 'a') as f:
text = ssh_list[0] + "-----------------------\n" + result + "-----------------------\n"
f.write(text)
else:
print ssh_list[0],'Install Error'#判断安装失败
with open('error.txt', 'a') as f:
text = ssh_list[0] + "-----------------------\n" + result + "-----------------------\n"
f.write(text)
except:#无法ssh
print ssh_list[0],'ssh error'
with open('no_ssh.txt','a') as f:
text = ssh_list[0]+'\n'
f.write(text)

交个朋友
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

吹吹牛吗?

微信