使用Python导出MikroTik文件遇错误,寻求解决方案
MikroTik文件导出到本地的Python实现问题
问题描述
尝试用Python将MikroTik设备中的文件导出到本地时,使用Paramiko执行命令出现错误expected end of command (line 1 column 41);尝试TFTP方式也未成功,以下是两段测试代码及问题分析与解决方案。
一、Paramiko实现的问题与修正
原代码及错误
import paramiko from getpass import getpass import time HOST = 'xxx.xx.xx.xx' PORT = 'xx' USER = 'xxx' if __name__ == '__main__': client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) password = getpass('Ingrese su contraseña: ') client.connect(HOST, PORT, username=USER, password=password, banner_timeout=200) stdin, stdout, stderr = client.exec_command('export file=/flash/prueba_export.backup to=C:/mikrotik') time.sleep(1) result = stdout.read().decode() print(result)
报错信息:expected end of command (line 1 column 41)
错误原因
MikroTik的export命令语法不支持直接指定本地路径to=C:/mikrotik,该命令仅用于将设备配置导出到设备自身的文件系统,无法直接推送到本地电脑。
修正方案
先通过export命令将配置导出到MikroTik设备的文件中,再通过SFTP协议将文件下载到本地:
import paramiko from getpass import getpass HOST = 'xxx.xx.xx.xx' PORT = 'xx' USER = 'xxx' REMOTE_FILE = '/flash/prueba_export.backup' LOCAL_FILE = 'C:/mikrotik/prueba_export.backup' if __name__ == '__main__': password = getpass('请输入密码: ') # 建立SSH连接并导出配置到设备文件 ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(HOST, int(PORT), username=USER, password=password, banner_timeout=200) # 执行导出命令(仅导出到设备本地) stdin, stdout, stderr = ssh_client.exec_command('/export file=' + REMOTE_FILE.split('/')[-1]) # 等待命令执行完成 stdout.channel.recv_exit_status() # 通过SFTP下载文件到本地 sftp_client = ssh_client.open_sftp() sftp_client.get(REMOTE_FILE, LOCAL_FILE) # 关闭连接 sftp_client.close() ssh_client.close() print(f"文件已成功下载到 {LOCAL_FILE}")
二、TFTP方式的实现说明
原代码问题
import tftpy # Crea un cliente TFTP client = tftpy.TftpClient('ip', 69) # Descarga el archivo de configuración de Mikrotik client.download('flash/prueba_export.backup', 'C:\\mikrotik/prueba_export.backup') # Cierra la conexión TFTP client.close()
这段代码未考虑MikroTik的TFTP服务配置要求,需要先在MikroTik设备上完成以下配置:
- 启用TFTP服务:执行命令
/ip tftp set enabled=yes root-dir=/flash(指定根目录为设备的flash分区) - 确保设备与本地电脑在同一网络,且防火墙允许TFTP(UDP 69端口)通信
修正后的TFTP客户端代码
import tftpy # MikroTik设备IP和TFTP端口 MIKROTIK_IP = 'xxx.xx.xx.xx' TFTP_PORT = 69 # 设备上的文件路径(相对于TFTP根目录) REMOTE_FILE = 'prueba_export.backup' # 本地保存路径 LOCAL_FILE = 'C:\\mikrotik\\prueba_export.backup' if __name__ == '__main__': try: client = tftpy.TftpClient(MIKROTIK_IP, TFTP_PORT) # 下载文件,注意remote_path是TFTP根目录下的相对路径 client.download(REMOTE_FILE, LOCAL_FILE) print(f"文件已通过TFTP成功下载到 {LOCAL_FILE}") except Exception as e: print(f"TFTP下载失败: {str(e)}")
备选TFTP方案:本地搭建TFTP服务器,让MikroTik上传
如果MikroTik无法作为TFTP服务器,也可以在本地搭建TFTP服务器,让MikroTik主动上传文件:
- 本地用
tftpy启动TFTP服务器:
import tftpy LOCAL_TFTP_DIR = 'C:\\mikrotik' server = tftpy.TftpServer(LOCAL_TFTP_DIR) server.listen('0.0.0.0', 69)
- 在MikroTik上执行上传命令(可通过Paramiko远程执行):
/file print file=prueba_export.backup /file transfer src-path=/flash/prueba_export.backup dst-path=tftp://<本地电脑IP>/prueba_export.backup
内容的提问来源于stack exchange,提问作者mayra
相关产品推荐
相关产品推荐

