You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python将用户手动输入内容写入YAML配置文件

网络配置YAML写入脚本实现方案

需要实现基于用户输入追加netplan网络接口配置的Python脚本,核心要求是不破坏原有YAML文件结构,将新采集的接口配置正确写入文件。

待更新的目标YAML文件内容

network:
  version: 2
  renderer: networkd
  ethernets:
    enx1:
      addresses:
      - 193.254.1.6/24
      nameservers:
          addresses: [193.254.1.5, 8.8.8.8]
      routes:
          - to: 193.254.1.0/24
            via: 193.254.1.5

原有未完成代码的问题

  • shebang行声明错误,标注为shell脚本但实际为Python代码
  • 加载现有YAML配置后未直接修改配置对象,反而硬编码了配置模板,完全没有使用用户输入的变量
  • 缺少配置写回文件的逻辑,没有做接口重名校验,容易覆盖原有正常配置
  • 未适配多DNS、多路由的常见输入场景

可直接运行的修正代码

#!/usr/bin/env python3
import ruamel.yaml

# 初始化YAML解析器,保留原有文件的缩进格式
yml = ruamel.yaml.YAML()
yml.indent(mapping=2, sequence=4, offset=2)
config_path = '/etc/netplan/01-network-manager-all.yaml'

print("是否需要新增网络接口配置?")
resp = input("请输入 Yes 或 No \n")
if resp.lower() == "yes":
    # 读取现有配置
    with open(config_path, 'r', encoding='utf-8') as fp:
        cont = yml.load(fp)
    
    # 采集用户输入
    eth = input("请输入接口名,例如 enx2 \n").strip()
    # 接口重名校验
    if eth in cont['network']['ethernets']:
        overwrite = input(f"接口 {eth} 已存在,是否覆盖原有配置?输入yes覆盖,其他键跳过\n").strip()
        if overwrite.lower() != 'yes':
            print("跳过接口配置更新,退出脚本")
            exit()
    
    addr = input("请输入IP地址和掩码,例如 192.168.1.10/24 \n").strip()
    dns_input = input("请输入DNS地址,多个DNS用英文逗号分隔,例如 114.114.114.114,8.8.8.8 \n").strip()
    dns_list = [d.strip() for d in dns_input.split(',') if d.strip()]
    route_to = input("请输入路由目标网段,例如 192.168.1.0/24 \n").strip()
    route_via = input("请输入路由网关地址,例如 192.168.1.1 \n").strip()

    # 构造新接口配置结构
    new_interface = {
        'addresses': [addr],
        'nameservers': {
            'addresses': dns_list
        },
        'routes': [
            {
                'to': route_to,
                'via': route_via
            }
        ]
    }

    # 将新配置追加到现有配置对象
    cont['network']['ethernets'][eth] = new_interface

    # 写回文件
    with open(config_path, 'w', encoding='utf-8') as fp:
        yml.dump(cont, fp)
    
    print(f"接口 {eth} 配置已写入文件,执行 sudo netplan apply 可使配置生效")
else:
    print("未选择新增配置,退出脚本")

使用说明

  • 运行脚本需要配置文件的读写权限,建议加sudo执行
  • 脚本会保留原有YAML文件的注释、缩进格式,不会破坏已有配置
  • 如果需要配置多IP、多路由,可以扩展输入逻辑,往addresses、routes列表中追加对应元素即可
  • 配置写入完成后必须执行netplan apply命令,新的网络配置才会生效

内容的提问来源于stack exchange,提问作者roXx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:27:27