使用 Junos PyEZ 执行文件系统操作
总结 使用 Junos PyEZ 管理文件和目录、计算校验和以及查看和清理 Junos 设备上的系统存储。
Junos PyEZ 应用程序可以使用该 jnpr.junos.utils.fs
实用程序在 Junos 设备上执行文件系统操作,包括:
-
管理文件
-
管理目录
-
管理磁盘空间
本主题讨论如何使用该实用程序执行一些常见的文件系统操作。
执行文件操作
可以使用 jnpr.junos.utils.fs 实用程序执行常见的文件和目录操作。例如,您可以:
-
查看文件和目录信息
-
创建和删除目录
-
查看、删除以及移动或复制文件
-
计算文件的校验和
本节讨论一些常见操作。有关支持操作的完整列表,请参阅 jnpr.junos.utils.fs 文档。
查看文件列表
可以使用该方法 ls()
查看给定路径上的文件和目录列表。例如:
from jnpr.junos import Device from jnpr.junos.utils.fs import FS from pprint import pprint with Device(host='router1.example.net') as dev: fs = FS(dev) pprint (fs.ls(path='/var/db/scripts/commit'))
user@server:~$ python3 junos-pyez-file-ls.py {'file_count': 3, 'files': {'filter_type_check.py': {'owner': 'root', 'path': 'filter_type_check.py', 'permissions': 771, 'permissions_text': '-rwxrwx--x', 'size': 30070, 'ts_date': 'Oct 25 03:24', 'ts_epoc': '1698229487', 'type': 'file'}, 'services': {'owner': 'root', 'path': 'services', 'permissions': 771, 'permissions_text': 'drwxrwx--x', 'size': 4096, 'ts_date': 'Oct 25 03:25', 'ts_epoc': '1698229535', 'type': 'dir'}, 'services_evpn_commit_script.py': {'owner': 'root', 'path': 'services_evpn_commit_script.py', 'permissions': 771, 'permissions_text': '-rwxrwx--x', 'size': 698, 'ts_date': 'Oct 25 03:25', 'ts_epoc': '1698229535', 'type': 'file'}}, 'path': '/var/db/scripts/commit', 'size': 34864, 'type': 'dir'}
管理文件
该 jnpr.junos.utils.fs
实用程序使您能够在目标设备上执行常见的文件操作。 表 1 概述了这些方法。方法名称与类 Unix 操作系统上的相应命令相同。
方法 |
描述 |
---|---|
|
查看文件。 |
|
复制文件。 |
|
重命名文件。 |
|
删除文件。 |
以下 Junos PyEZ 应用程序连接到 Junos 设备,并使用 cat()
该方法查看文件的内容。如果该文件不存在,应用程序将 None
打印 。
from jnpr.junos import Device from jnpr.junos.utils.fs import FS with Device(host='router1.example.net') as dev: fs = FS(dev) filepath = '/var/db/scripts/commit/filter_type_check.py' print(fs.cat(path=filepath))
以下应用程序连接到 Junos 设备,并将文件从 /var/tmp 目录复制到 /var/db/scripts/op 目录。如果操作成功或False
出现错误,应用程序将True
打印。
from jnpr.junos import Device from jnpr.junos.utils.fs import FS src='/var/tmp/bgp-neighbors.slax' dest='/var/db/scripts/op' with Device(host='router1.example.net') as dev: fs = FS(dev) print(fs.cp(from_path=src, to_path=dest))
从 Junos PyEZ 2.6.8 版开始,您可以为文件复制操作指定路由实例。 routing_instance
包括参数,并指定实例的名称。例如:
fs.cp(from_path=src, to_path=dest, routing_instance='mgmt_junos')
计算校验和
可以使用该方法 checksum()
计算文件的校验和。默认情况下, checksum()
计算 MD5 校验和。若要显式指定算法,请包含 calc
参数并指定以下值之一:
-
MD5
-
SHA256
-
SHA1
以下 Junos PyEZ 应用程序连接到 Junos 设备,使用该方法验证 cat()
文件是否存在,如果文件存在,则计算 SHA256 校验和:
from jnpr.junos import Device from jnpr.junos.utils.fs import FS with Device(host='router1.example.net') as dev: fs = FS(dev) # if file exists, calculate checksum filepath = '/var/db/scripts/commit/filter_type_check.py' if fs.cat(path=filepath) is not None: print(fs.checksum(path=filepath, calc='sha256')) else: print('File not found.')
user@server:~$ python3 junos-pyez-file-checksum.py d5e28ddde10a38b247d491b524b59c022297b01a9d3a00b83b11be5eb7b81be3
管理文件系统存储
您可以使用 jnpr.junos.utils.fs 实用程序来管理文件系统存储,如以下各节所述。
查看文件系统磁盘空间使用情况
您可以使用该方法 storage_usage()
返回有关文件系统的已用空间和可用空间的信息。该方法返回命令的 show system storage
输出。该信息类似于 Unix df
命令输出。
以下 Junos PyEZ 应用程序检索并打印所连接设备的磁盘空间使用情况:
from jnpr.junos import Device from jnpr.junos.utils.fs import FS from pprint import pprint with Device(host='router1.example.net') as dev: fs = FS(dev) pprint(fs.storage_usage())
user@server:~$ python3 junos-pyez-storage-usage.py {'/dev/ada1p2': {'avail': '406M', 'avail_block': 831176, 'mount': '/.mount/var/log', 'total': '475M', 'total_blocks': 973368, 'used': '31M', 'used_blocks': 64328, 'used_pct': '7'}, '/dev/ada1p3': {'avail': '833M', 'avail_block': 1705144, 'mount': '/.mount/var/tmp', 'total': '2.7G', 'total_blocks': 5586168, 'used': '1.6G', 'used_blocks': 3434136, 'used_pct': '67'}, '/dev/gpt/junos': {'avail': '4.3G', 'avail_block': 8989740, 'mount': '/.mount', 'total': '6.0G', 'total_blocks': 12540924, 'used': '1.2G', 'used_blocks': 2547912, 'used_pct': '22'}, ... }
查看目录使用情况
可以使用该方法 directory_usage()
查看给定目录及其子目录的磁盘空间使用情况(可选)。此方法在设备上执行 show system directory-usage path
命令并返回信息。如果未指定深度,Junos PyEZ 将使用默认深度零。该信息类似于 Unix du
命令返回的统计信息。
以下 Junos PyEZ 应用程序打印目录的 /var/tmp
磁盘空间使用情况。
from jnpr.junos import Device from jnpr.junos.utils.fs import FS with Device(host='router1.example.net') as dev: fs = FS(dev) print(fs.directory_usage(path='/var/tmp/'))
user@server:~$ python3 junos-pyez-directory-usage.py {'/var/tmp/': {'size': '16K', 'blocks': 32, 'bytes': 16384}}
清理系统存储
您可以使用该方法 storage_cleanup()
释放 Junos 设备上的磁盘空间。该方法执行该 request system storage cleanup
命令,该命令将轮换日志文件并删除临时文件。
若要仅查看将在清理操作中删除的文件列表,请改用 storage_cleanup_check()
该方法。此方法在设备上执行 request system storage cleanup dry-run
命令,并返回候选文件列表而不删除它们。
以下 Junos PyEZ 应用程序首先执行该 storage_cleanup_check
操作并打印建议删除的文件列表。然后,应用程序查询用户是否要继续存储清理并删除文件。如果用户确认清理操作,应用程序将 storage_cleanup()
执行删除文件的操作,然后打印已删除文件的列表。
from jnpr.junos.utils.fs import FS from pprint import pprint with Device(host='router1.example.net') as dev: fs = FS(dev) print('\n*** Cleanup Check - files to delete ***\n') pprint(fs.storage_cleanup_check()) cleanup = input('\nProceed with storage cleanup ' 'and delete these files [yes,no] (no) ? ').lower() if cleanup in ['yes', 'y']: print('Cleaning up storage.') files = fs.storage_cleanup() pprint(files) elif cleanup in ['no', 'n', '']: print('Cleanup operation canceled.') else: print('Please enter a valid response.')
user@server:~$ python3 junos-pyez-storage-cleanup.py *** Cleanup Check - files to delete *** {'/var/log/ifstraced.0.gz': {'size': 8474516, 'ts_date': 'Feb 7 09:12'}, '/var/log/ifstraced.1.gz': {'size': 8464409, 'ts_date': 'Feb 6 19:17'}, '/var/log/ifstraced.2.gz': {'size': 8476558, 'ts_date': 'Feb 6 05:19'}, '/var/log/ifstraced.3.gz': {'size': 8477741, 'ts_date': 'Feb 5 15:20'}, '/var/log/license.0.gz': {'size': 27591, 'ts_date': 'Feb 7 17:03'}, '/var/log/license.1.gz': {'size': 27802, 'ts_date': 'Feb 7 15:11'}, '/var/log/messages.0.gz': {'size': 189, 'ts_date': 'Feb 7 17:53'}, '/var/log/messages.1.gz': {'size': 173, 'ts_date': 'Feb 7 17:52'}, '/var/log/messages.2.gz': {'size': 128, 'ts_date': 'Feb 7 17:52'}, '/var/log/messages.3.gz': {'size': 190, 'ts_date': 'Feb 7 17:52'}, '/var/log/messages.4.gz': {'size': 173, 'ts_date': 'Feb 7 17:48'}, '/var/log/security.0.gz': {'size': 499, 'ts_date': 'Feb 7 17:53'}, '/var/log/security.1.gz': {'size': 358, 'ts_date': 'Feb 7 17:52'}, '/var/log/security.2.gz': {'size': 305, 'ts_date': 'Feb 7 17:52'}, '/var/log/security.3.gz': {'size': 536, 'ts_date': 'Feb 7 17:52'}, '/var/log/wtmp.0.gz': {'size': 27, 'ts_date': 'Feb 7 17:52'}, '/var/log/wtmp.1.gz': {'size': 27, 'ts_date': 'Feb 7 17:52'}, '/var/tmp/LOCK_FILE': {'size': 0, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/appidd_cust_app_trace': {'size': 0, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/appidd_trace_debug': {'size': 198, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/krt_rpf_filter.txt': {'size': 57, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/netproxy': {'size': 0, 'ts_date': 'Jan 2 11:11'}, '/var/tmp/pfe_debug_commands': {'size': 111, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/planeDb.log': {'size': 524, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/rtsdb/if-rtsdb': {'size': 0, 'ts_date': 'Jan 2 11:08'}} Proceed with storage cleanup and delete these files [yes,no] (no) ? yes Cleaning up storage. {'/var/log/ifstraced.0.gz': {'size': 8474516, 'ts_date': 'Feb 7 09:12'}, '/var/log/ifstraced.1.gz': {'size': 8464409, 'ts_date': 'Feb 6 19:17'}, '/var/log/ifstraced.2.gz': {'size': 8476558, 'ts_date': 'Feb 6 05:19'}, '/var/log/ifstraced.3.gz': {'size': 8477741, 'ts_date': 'Feb 5 15:20'}, '/var/log/license.0.gz': {'size': 27591, 'ts_date': 'Feb 7 17:03'}, '/var/log/license.1.gz': {'size': 27802, 'ts_date': 'Feb 7 15:11'}, '/var/log/messages.0.gz': {'size': 130, 'ts_date': 'Feb 7 17:54'}, '/var/log/messages.1.gz': {'size': 189, 'ts_date': 'Feb 7 17:53'}, '/var/log/messages.2.gz': {'size': 173, 'ts_date': 'Feb 7 17:52'}, '/var/log/messages.3.gz': {'size': 128, 'ts_date': 'Feb 7 17:52'}, '/var/log/messages.4.gz': {'size': 190, 'ts_date': 'Feb 7 17:52'}, '/var/log/security.1.gz': {'size': 499, 'ts_date': 'Feb 7 17:53'}, '/var/log/security.2.gz': {'size': 358, 'ts_date': 'Feb 7 17:52'}, '/var/log/security.3.gz': {'size': 305, 'ts_date': 'Feb 7 17:52'}, '/var/log/wtmp.0.gz': {'size': 27, 'ts_date': 'Feb 7 17:53'}, '/var/log/wtmp.1.gz': {'size': 27, 'ts_date': 'Feb 7 17:52'}, '/var/tmp/LOCK_FILE': {'size': 0, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/appidd_cust_app_trace': {'size': 0, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/appidd_trace_debug': {'size': 198, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/krt_rpf_filter.txt': {'size': 57, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/netproxy': {'size': 0, 'ts_date': 'Jan 2 11:11'}, '/var/tmp/pfe_debug_commands': {'size': 111, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/planeDb.log': {'size': 524, 'ts_date': 'Jan 2 11:08'}, '/var/tmp/rtsdb/if-rtsdb': {'size': 0, 'ts_date': 'Jan 2 11:08'}}