公司有20台服务器部署在天津、浙江、甘肃等地,每次都要通过vnc或者xshell远程连接过去,,执行一条条命令,完成巡检的过程,耗时较长。后期还有可能在其他地级市增加服务器,有超过百台的可能。耗时更长。于是,使用Python提供的第三方库paramiko模块编写自动化巡检脚本,自动完成整个检查,每次去只需在输出文件中查看结果,节省不少时间。
上代码:
1.导入模块
import paramiko
import datetime
import time
import os
import sys
2.写配置信息
我一般把配置信息写在头部,方便以后代码的修改的维护。如:
3.功能函数
创建ssh对象—->连接远程服务器—–>遍历命令列表——>输出结果
代码如下:
def sshconnection(ip,username,password,commands):
try:
#创建SSH对象
ssh = paramiko.SSHClient()
#允许连接不在Hosts列表中主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
ssh.connect(ip,22,username,password,timeout=360)
outfile.write('%s------------%s---start-------------\n' % (ip,datetime.datetime.now()))
#遍历命令列表命令
for command in commands:
stdin, stdout, stderr = ssh.exec_command(m)
#stdin.write("Y") #简单交互,输入 ‘Y'
outResults = stdout.readlines()
errorResults = stderr.readlines()
#写入输出结果到文件中
if outResults != '':
for outResult in outResults:
outfile.write(outResult)
outfile.write('%s------------%s---end-------------\n' % (ip,datetime.datetime.now()))
for errorResult in errorResults:
errorfile.write(errorResult)
ssh.close()
except Exception,e:
os.system('echo \'find a err\' > /home/error')
print ('%s\tError:%s\n'%(ip,e))
4.写定时函数
定时使用的是最为简单的sleep函数,根据需要定时。
def sleeptime(hour,m,sec):
return hour*3600 + m*60 + sec
5.写守护进程
守护进程是运行在后台的一种特殊进程,独立于控制终端。这些写守护进程的原因就是在终端执行程序,关闭终端后,使进程一直存在,使用while(true)也可以实现。
def creatDaemon():
try:
#第一次fork,生成子进程,脱离父进程
Pid = os.fork()
if Pid > 0 :
sys.exit(0)
except OSError, error:
print('fork #1 failed: %d (%s)'%(error.errno,error.strerror))
sys.exit(1)
#修改工作目录
os.chdir("/")
#设置新的会话连接
os.setsid()
#重新设置文件创建权限
os.umask(0)
try:
#第二次fork,禁止进程打开终端
Pid = os.fork()
if Pid > 0 :
sys.exit(0)
except OSError, error:
print('fork #2 failed: %d (%s)'%(error.errno,error.strerror))
sys.exit(1)
#重定向文件描述符
sys.stdout.flush()
sys.stderr.flush()
Si = file("/dev/null", 'r')
So = file("/dev/null", 'a+')
Se = file("/dev/null", 'a+', 0)
os.dup2(Si.fileno(), sys.stdin.fileno())
os.dup2(So.fileno(), sys.stdout.fileno())
os.dup2(Se.fileno(), sys.stderr.fileno())
至此就可以完成远程连接服务器,并定期执行命令的效果。paramiko是遵循SSH2协议的,vnc同样,所以之前通过vnc远程连接的这里可以使用此脚本。下一篇记录Telnet连接的脚本。
详细代码见 paramiko模块使用
https://github.com/wnn0809/WebLovePy/blob/master/Py/paramiko%E8%BF%90%E7%BB%B4%E8%84%9A%E6%9C%AC)