[TOC]1.概述一开始我并不想写Paramiko,因为我觉得之前关于Netmiko模块的文章更适合网络工作者。后来发现paramiko包含SFTP功能,所以还是有必要写告诉你吧,毕竟我们需要经常在设备上下载配置,上传版本/升级版本,而且SFTP比FTP和TFTP更安全.因此,您不需要使用其他工具来上传和下载,使用'Python'来帮助您完成。SSH和SFTP都使用相同的端口号22。如果你更看重数据的安全传输,那么SFTP是首选,而不是FTP和TFTP。实验环境说明:一台Cisco路由器,用于SSH登录;用于SFTP上传/下载的华为交换机;PyCharm专业版2。Paramiko的基本使用2.1SSHClientconnect()函数关键参数介绍:用途:用于连接远端Host,其中'hostname'为必填参数。常用参数hostname//远程主机,可以填写IP和域名port=SSH_PORT//默认为22端口username=None//用于登录远程主机的用户名password=None//用于登录totheremoteThehostusedpasswordpkey=None//使用私钥进行身份认证,也叫'免密码'登录key_filename=None//使用私钥文件名timeout=None//tcp连接超时allow_agent=True//DefaultAllowconnectiontosshagentlook_for_keys=True//默认在~/.ssh中搜索私钥文件,默认为TrueAllowcompress=False//默认不开启压缩load_system_host_keys()函数:目的:用于加载主机密钥,密钥保存在“known_hosts”文件中。filename=None//默认加载“~/.ssh/known_hosts”文件。set_missing_host_key_policy()函数:目的:用于检查远程主机是否在本地'hostkeys'中有记录以及使用哪个策略。#目前支持三种策略:1.AutoAddPolicy//自动将主机名和主机密钥添加到本地HostKeys对象中,与load_system_host_key的配置无关。即当建立新的ssh连接时,不需要输入yes或no进行确认。2.WarningPolicy//用于记录未知主机密钥的python警告。并接受它,功能类似于AutoAddPolicy,但会提示是新连接3.RejectPolicy//自动拒绝未知主机名和密钥,取决于load_system_host_key的配置。这是默认选项exec_command()函数:用途:用于在远程主机上执行命令并返回输入、输出和错误信息。command//执行的命令stdin,stdout,stderr//分别表示输入,输出,错误()#加载系统HostKeyskeyssh.load_system_host_keys()#自动添加策略保存远程主机的hostname和key信息。如果不添加,本地knows_hosts文件中没有记录的hosts将无法连接,默认拒绝ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接远程主机ssh.connect('192.168.0.101',port=22,username='admin',password='Admin@123')#执行命令stdin,stdout,stderr=ssh.exec_command('showipintbr')print(stdout.read().decode('utf-8'))#关闭连接ssh.close()if__name__=='__main__':ssh_client()执行代码返回结果如下:2.2.2用户名密码登录(传输方式)defssh_client():#创建实例化ssh=paramiko.SSHClient()#transport封装t=paramiko.Transport('192.168.0.101',22)t.connect(username='admin',password='Admin@123')ssh._transport=t#加载系统HostKeys密钥ssh.load_system_host_keys()#自动添加策略并保存远程主机的主机名和密钥信息,如果不添加,那么本地不知道_hosts文件中记录的host将无法连接,默认拒绝ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#执行命令stdin,stdout,stderr=ssh.exec_command('showipintbr')print(stdout.read().decode('utf-8'))#关闭连接ssh.close()if__name__=='__main__':ssh_client()执行代码返回结果如下:结果同上,输出相同2.2.3通过用户名和密钥登录Cisco路由器公钥配置:usernameadminprivilege15passwordadmin@123ipdomainnamecisco.comcryptokeygeneratersamodulus1024ipsshversion2ipsshpubkey-chainusernameadminkey-hashssh-rsa560DE41351E4ACF??986singvis@DESKTOP-IQ964AEendendlinevty04exec-timeout50loggingsynchronousloginlocaltransportinputsshprivilegelevel15pythoncode:importparamikodefssh_client():#私钥的绝对路径private=paramiko.RSAKey.from_private_key_file(r'C:\Users\singvis\Documents\Identity')#创建实例化ssh=paramiko.SSHClient()#加载系统HostKeys密钥ssh.load_system_host_keys()#自动添加策略,保存远程主机的主机名和密钥信息,如果不添加,那么本地knows_hosts文件中没有记录的hosts将无法连接,默认拒绝接受ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接到远程主机,这里不需要密码,就是私钥文件ssh.connect('192.168.0.101',port=22,username='admin',pkey=private)#executecommandstdin,stdout,stderr=ssh.exec_command('showipintbr')print(stdout.read().decode('utf-8'))ssh。关闭()我f__name__=='__main__':ssh_client()使用密钥通过SecurityCRT登录192.168.0.101,不用输入密码,直接登录即可:说明:密钥生成路径:tools->creatpublickey(这次通过SecurityCRT)2.3SFTPClient关键参数介绍SFTPClient作为sftp客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,如上传、下载、权限、状态等from_transport(cls,t)//创建连接的SFTP客户端通道put(localpath,remotepath,callback=None,confirm=True)//上传本地文件到远程主机get(remotepath,localpath,callback=None)//下载文件从远程主机到本地mkdir()//创建目录remove()//删除目录rename()//重命名目录stat()//检查文件状态listdir()//列出目录文件2.4SFTPClient常用实例以华为交换机为例。交换机配置如下:rsalocal-key-paircreate#stelnetserverenablesftpserverenable#aaalocal-useradminpasswordsimpleAdmin@123local-useradminprivilegelevel15local-useradminservice-typeterminalssh#sshauthentication-typedefaultpasswordsshuseradminauthentication-typepasswordsshuseradminservice-typeallsshuseradminsftp-directoryflash:/#user-interfacevty04authentication-modeaaaprotocolinboundsshPython代码如下:importparamikodefsftp_put():#文件路径local_file=r'D:\test\123.txt'remote_file='flash:/123.txt't=paramiko.Transport('192.168.0.200',22)t.connect(username='admin',password='Admin@123')sftp=paramiko.SFTPClient.from_transport(t)sftp.put(local_file,remote_file)t.close()defsftp_get():local_path=r'D:\test\vrpcfg.zip'remote_path='flash:/vrpcfg.zip't=paramiko.Transport('192.168.0.200',22)t.connect(用户名='admin',password='Admin@123')#sftp=paramiko.SFTPClient.from_transport(t)sftp.get(remote_path,local_path)t.close()if__name__=='__main__':sftp_put()sftp_get()执行代码返回结果如下:3.完整代码#!/usr/bin/envpython#coding:utf-8#欢迎关注微信公众号:点满技术#这里靠谱,有价值,共同成长,网络攻城狮专属):#私钥文件的存放路径#private=paramiko.RSAKey.from_private_key_file(r'C:\Users\singvis\Documents\Identity')#创建一个实例化的ssh=paramiko.SSHClient()#加载系统SSH密钥ssh.load_system_host_keys()#自动添加策略保存服务器的主机名和密钥信息。如果不添加,本地knows_hosts文件中没有记录的hosts将无法连接,默认拒绝ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接设备try:ssh.connect(hostname=host,username=user,timeout=5,compress=True,password=pwd#pkey=private,#keyconnectioncanbeused)print(“连接到主机{}.....format(host))除了NoValidConnectionsError:print('Thereisaproblemwithaconnection')exceptAuthenticationException:print('Usernameorpasswordiswrong')exceptExceptionase:print('Othererrorissues{}'.format(e))finally:#Activate交互式shellchan=ssh.invoke_shell()time.sleep(1)forcmdincmds:chan.send(cmd.encode())#绝对必须有一个回车'Enter'操作chan.send(b'\n')time.sleep(2)r=chan.recv(40960).decode()如果冗长:print(r)chan.close()ssh.close()defsftp_get(ip,user,pwd,local_file,remote_file,port=22):try:t=paramiko.Transport(ip,port)t.connect(username=user,password=pwd)sftp=paramiko.SFTPClient.from_transport(t)sftp.get(remote_file,local_file)t.close()exceptexceptase:print(e)defsftp_put(ip,user,pwd,local_file,remote_file,port=22):尝试:t=paramiko.Transport(ip,port)t.connect(username=user,password=pwd)sftp=paramiko.SFTPClient。from_transport(t)sftp.put(local_file,remote_file)t.close()exceptExceptionase:print(e)if__name__=='__main__':'''不要运行的,请注解掉,前面加'#'符号'''ip='192.168.0.101'user='admin'pwd='Admin@123'#local_file=r'D:\test\123.txt'#remote_file='flash:/vrpcfg.zip'#sftp_get(ip='192.168.0.200',user=user,pwd=pwd,remote_file=remote_file,local_file=r'D:\test\vrpcfg.zip')#sftp_put(ip='192.168.0.200',user=user,pwd=pwd,local_file=local_file,remote_file='flash:/123.txt')cmds=['terminallength0','showversion','showipintbr','showiproute']#cmds=['dispipintbr','dispdevice','dispclock']ssh_client(ip,user,pwd,cmds)参考资料:Cisco路由器和交换机的SSH配置如果喜欢我的文章,请关注我的公众号:滴滴科技,扫码关注,不定期分享
