一、paramiko模块安装
Python实现ssh登陆需要使用paramiko模块,完整安装paramiko主要需要安装3个模块,分别是:ecdsa、paramiko、pycrypto。
安装过程这里就不详细说了,可以参考
安装paramiko模块填坑过程记录
解释两点:
1.本次只是使用ssh验证用户名、密码方式登陆,所以只需安装paramiko模块,ecdsa、pycrypto可以不安装。
2.windows全部安装paramiko需要,Visual Studio 2015(或者更新的版本),空间要求4G+好大好麻烦,而本例中不需要安装。
二、paramiko模块使用
Paramiko是用python语言写的一个模块,远程连接到Linux服务器,查看上面的日志状态,批量配置远程服务器,文件上传,文件下载等。
定义调用参数:
host = "120.24.239.214"
port = 22
timeout = 30
user = "root"
password = "******"
登陆服务器并执行命令:
# -*- coding:utf-8 -*-
import paramiko
def sftp_exec_command(command):
try:
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(host, 22, user, password)
std_in, std_out, std_err = ssh_client.exec_command(command)
for line in std_out:
print line.strip("\n")
ssh_client.close()
except Exception, e:
print e
if __name__ == '__main__':
sftp_exec_command("ls -l")
上传文件:
# -*- coding:utf-8 -*-
import paramiko
def sftp_upload_file(server_path, local_path):
try:
t = paramiko.Transport((host, 22))
t.connect(username=user, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(local_path, server_path)
t.close()
except Exception, e:
print e
if __name__ == '__main__':
sftp_upload_file("/root/bug.txt", "D:/bug.txt")
下载文件:
# -*- coding:utf-8 -*-
import paramiko
def sftp_down_file(server_path, local_path):
try:
t = paramiko.Transport((host, 22))
t.connect(username=user, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get(server_path, local_path)
t.close()
except Exception, e:
print e
if __name__ == '__main__':
sftp_down_file("/root/test.txt", "D:/text.txt")
详细paramiko模块使用参考
python模块之 paramiko
可实现基于密码,证书等登陆方式。
三、登陆远程服务器,执行巡检
输入用户名,密码登陆远程服务器,执行巡检,输入密码三次错误则报错执行下一主机登陆。
执行巡检脚本为shell脚本,在server.txt中写入巡检内容。结果输出至d:\xunjian目录(需提前建立),文件为 主机名_日期.log格式。
#-*- coding:utf-8 -*-
import paramiko
import datetime
import os
##读取当前路径
base_dir=os.getcwd()
##命令开始执行时间
starttime=datetime.datetime.now()
print(" -------------------------------------------------------------")
print("| |")
print(" startime: ",starttime)
print("| |")
print(" -------------------------------------------------------------")
##定义三次登陆
def ssh2(ip, username, cmd):
for n in range(3) :
try:
passwd = input('请输入主机(%s) %s用户密码:' % (ip, username))
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, 22, username, passwd, timeout=5)
# for m in cmd:
# stdin, stdout, stderr = ssh.exec_command(m)
# out = stdout.readlines()
# return out
stdin, stdout, stderr = ssh.exec_command(cmd)
out = stdout.read()
return out
break
except Exception as e:
if n < 2:
print('%s\tError\t%s' % (ip, e))
print('输入密码错误请重新输入!')
else:
out = bytes('\033[0;31m主机登陆失败,继续下一主机\033[0m', encoding='utf-8')
return out
def linux_check(servertable, iptable):
##注意路径前面的r,否则有些文件会当作转义字符处理
##读取命令脚本
cmd_filepath=base_dir+r"\server.txt"
cmd_file=open(cmd_filepath,"r")
cmd=cmd_file.read()
##读取IP地址列表
ip_filepath=base_dir+r"\ip.txt"
ip_file=open(ip_filepath,'r')
while 1:
ipinfo=ip_file.readline()
if not ipinfo :
break
else :
##读取IP,用户名,密码
infos = ipinfo.split(',')
hostname= infos[0]
hostip = infos[1]
username = infos[2].strip('\n')
today = datetime.date.today().strftime('%Y%m%d')
filename = hostname + '_' + today
f = open('d:\\xunjian\\%s.log' % (filename), 'w')
print(" -------------------------------------------------------------")
print("| |")
print(" ",hostname,hostip)
print("| |")
print(" -------------------------------------------------------------")
a = ssh2(hostip, username, cmd)
print(a.decode())
f.writelines(a.decode())
endtime = datetime.datetime.now()
f.writelines('check complete.................%s...............' % (endtime))
f.close()
if __name__ == '__main__':
a=linux_check()
##命令执行完成时间
endtime=datetime.datetime.now()
print(" -------------------------------------------------------------")
print("| |")
print(" endtime: ",endtime)
print("| |")
print(" -------------------------------------------------------------")
print(" -------------------------------------------------------------")