Python利用paramiko实现ssh登陆服务器三次密码验证-1

Python利用paramiko实现ssh登陆服务器三次密码验证-1

2018年11月19日 14:27:25 阅读数 684

一、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(" -------------------------------------------------------------")

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值