天天看点

Python——异常和paramiko的简单远程连接操作

一、异常

1.异常的捕获和返回

"""
try:
    尝试执行的代码
except:
    出现错误的处理
"""
try:
    num = int(input('请输入一个数字: '))
except:
    print('请输入正确的整数')
           
Python——异常和paramiko的简单远程连接操作
"""
举个简单的例子
题目要求:
    1.提示用户输入一个整数
    2.使用8来除以用户输入的数
try:
    尝试执行的代码
except 错误类型1:
    出现错误1的处理方式
except 错误类型2:
    出现错误2的处理方式
finally
    不管有没有错误都执行
"""
try:
    num = int(input('请输入一个整数: '))
    result = 8 / num
    print(result)

except ValueError:
    print('输入的值不是合法的整数')

except ZeroDivisionError:
    print('0不能做除数')

except Exception as r:
    print('未知错误 %s' %(r))				##暂时不知道怎么制造这种错误

finally:
    print('~~~~~~~~~~~~')
           
Python——异常和paramiko的简单远程连接操作

2.主动抛出异常

"""
需求: 提示用户输入密码,如果长度小于8位就抛出异常,符合要求就输出密码
"""
def input_passwd():
    pwd = input('请输入密码: ')

    if len(pwd) >= 8:
        return pwd

    print('主动抛出异常')
    ex = Exception('密码长度不足!')
    raise ex

try:
    print(input_passwd())
except Exception as r:
    print(r)
           
Python——异常和paramiko的简单远程连接操作
Python——异常和paramiko的简单远程连接操作

二、paramiko远程连接

1.paramiko远程密码连接

"""
基于ssh用于连接远程服务器做操作:
远程执行命令
上传/下载文件
"""
import paramiko
#创建一个ssh对象
client = paramiko.SSHClient()
"""
The authenticity of host '172.25.254.221 (172.25.254.221)' can't be established.
ECDSA key fingerprint is 4c:98:51:43:65:46:66:fd:af:5b:ea:cc:d9:97:c0:74.
Are you sure you want to continue connecting (yes/no)?
"""
#自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
client.connect(
    hostname='172.25.254.221',
    username='root',
    password='redhat'
)
#执行命令操作
#标准输入 标准输出 标准错误
stdin,stdout,stderr = client.exec_command('route -n')

#获取命令的执行结果,utf-8(编码格式)
print(stdout.read().decode('utf-8'))

#关闭连接
client.close()
           
Python——异常和paramiko的简单远程连接操作

2.批量连接主机

from paramiko.ssh_exception import NoValidConnectionsError,AuthenticationException

def connect(cmd,hostname,user,password):
    import paramiko

    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        client.connect(
            hostname=hostname,
            username=user,
            password=password
        )
        stdin, stdout, stderr = client.exec_command(cmd)
        a = stdout.read().decode('utf-8')
        print(stdout.read().decode('utf-8'))
        return a
    except NoValidConnectionsError as e:
        return '主机%s连接失败' %(hostname)
    except AuthenticationException as e:
        return '主机%s密码错误' %(hostname)
    except Exception as e:
        return '未知错误:',e
    finally:
        client.close()

with open('/home/kiosk/passwd') as f:			##文件格式按照下面的要求书写(ip:用户名:密码)
    for line in f:
        hostname,username,password = line.strip().split(':')
        res = connect('hostname',hostname,username,password)
        # print(hostname.center(50,'*'))
        print('主机名:', res)
           
Python——异常和paramiko的简单远程连接操作

3.文件的上传和下载

'''给远程主机上传一个文件'''
from paramiko.ssh_exception import NoValidConnectionsError,AuthenticationException
import paramiko

def put(hostname,password,local_name,remote_name):

    try:
        transport = paramiko.Transport((hostname,22))
        transport.connect(username='root',password=password)
        sftp = paramiko.SFTPClient.from_transport(transport)

    except AuthenticationException as e:
        return '主机%s密码错误' %(hostname)
    except Exception as e:
        return '未知错误: ',e
    else:
        sftp.put(local_name,remote_name)       ##上传文件
        try:
            # 如果远程主机有这个文件则返回一个对象,否则抛出异常
            sftp.file(remote_name)
            print("上传成功.")
        except IOError:
            print("上传失败!")
    finally:
        transport.close()

put('172.25.254.221','redhat','/home/kiosk/passwd','/mnt/test')	##远程主机ip,密码,本地文件,上传后的文件保存位置
           
Python——异常和paramiko的简单远程连接操作
'''从远程主机下载文件'''
from paramiko.ssh_exception import NoValidConnectionsError,AuthenticationException
import paramiko
import os

def get(hostname,password,remote_name,local_name):

    try:
        transport = paramiko.Transport((hostname,22))
        transport.connect(username='root',password=password)
        sftp = paramiko.SFTPClient.from_transport(transport)

    except AuthenticationException as e:
        return '主机%s密码错误' %(hostname)
    except Exception as e:
        return '未知错误: ',e
    else:
        #sftp.put(local_name,remote_name)       ##上传文件
        sftp.get(remote_name,local_name)      ##下载文件
        if os.path.exists(local_name):
            print('下载成功.')
        else:
            print('下载失败')
    finally:
        transport.close()

get('172.25.254.221','redhat','/mnt/test','/home/kiosk/test111.txt')
           
Python——异常和paramiko的简单远程连接操作
'''
sftp是安全文件传输协议,提供一种安全的加密方法,
sftp是SSH的一部分,SFTPClient类实现了sftp客户端,通过已建立的SSH通道传输文件,与其他的操作,常用的命令如下:
'''
           
sftp.close() 关闭sftp
sftp.file(filename, mode=‘r’, bufsize=-1) 读取文件
sftp.from_transport(s) 创建客户端通道
sftp.open(filename, mode=‘r’, bufsize=-1) 在远程服务器打开文件
sftp.put(localpath, remotepath, callback=None) localpath文件上传到远程服务器remotepath
sftp.get(remotepath, localpath, callback=None) 从远程服务器remotepath拉文件到本地localpath
sftp.remove(path) 删除文件