nmcli修改连接名 笔记240725

nmcli修改连接名

nmcli connection modify 原名 con-name 新名
nmcli connection modify UUID con-name 新名

通过网络名或uuid删除连接

nmcli connection delete 连接名或uuid

通过设备名删除连接

nmcli device disconnect 设备连接

nmcli device connect 设备名 创建的连接名和设备名一样,或者和原先的名称一样, 没法设置

nmcli device connect 设备名

nmcli connection add con-name 连接名 type 802-3-ethernet ifname 设备名 创建的连接可以指定连接名,

nmcli connection add con-name 连接名 type 802-3-ethernet ifname 设备名

type 802-3-ethernet 可简写为 type ethernet

nmcli connection add con-name 连接名 type ethernet ifname 设备名

先删除,再创建, 这种方式连同 /etc/NetworkManager/system-connections 对应的配置文件一并删除再创建, 配置文件名也变为新名

nmcli connection delete 原连接名
nmcli connection add    con-name 新连接名    type 802-3-ethernet     ifname 设备名

Linux 设置更改网卡名称

ip link set 只能暂时修改设备名
sudo ip link set dev eth0 name newname
###  dev可以省略
sudo ip link set eth0 name newname
修改或创建 /etc/udev/rules.d/70-persistent-net.rules 来永久修改设备名
vi /etc/udev/rules.d/70-persistent-net.rules

也可取名 xx.rules, 如80.rules , 80会覆盖70

vi /etc/udev/rules.d/80.rules

模板

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="修改这里的mac", ATTR{type}=="1",  NAME="eth0"

nmcli 修改连接名

nmcli connection modify 原名 con-name 新名
nmcli connection modify UUID con-name 新名

列出所有连接名称, 除了lo , 的多种写法

nmcli connection | awk 'NR>1 && !/lo/ {print$1}'
nmcli connection | awk 'NR>1 {if($1!="lo"){print$1}}'
nmcli connection | awk 'NR>1 {if($1 !~ /lo/){print$1}}'
nmcli connection | grep -v 'lo' |  awk 'NR>1 {print $1}'
删除所有连接 多种写法
nmcli connection delete $( nmcli connection | awk 'NR>1 && !/lo/ {print$1}' )
nmcli connection | grep -v 'lo' |  awk 'NR>1 {print $1}' | xargs nmcli connection delete
nmcli connection | grep -v 'lo' |  awk 'NR>1 {print $1}' | xargs -I {} nmcli connection delete {}

激活所有连接

nmcli device status | awk 'NR >1 && !/lo/ {print$1}' | xargs -I {} nmcli device connect {}
nmcli device status | awk 'NR >1 && !/lo/ {print$1}' | xargs -I xxx nmcli device connect xxx
nmcli device status | awk 'NR>1{if($1 != "lo")print$1}'  | xargs -I {} nmcli device connect {}

添加连接

nmcli connection add    con-name ens224    type 802-3-ethernet     ifname ens224

Linux 设置更改网卡名称

在Linux中,更改网卡名称(通常指的是网络接口名称,比如从eth0更改为ens33)可以通过多种方法实现,但主要依赖于你使用的发行版及其网络管理工具。从较旧的ifrename工具到现代的基于udevsystemd-networkd的规则配置,方法多种多样。不过,自系统d(systemd)成为许多Linux发行版的初始化系统和系统管理器以来,大多数现代Linux系统推荐使用systemd-networkd或基于udev的规则来管理网络接口名称。

以下是一些常用的方法来更改Linux系统中的网卡名称:

1. 使用udev规则(推荐方法)

udev是Linux内核的一部分,用于管理设备节点的创建和删除。你可以通过编写udev规则来永久更改网络接口的名称。

  1. 确定你的网卡硬件信息
    使用ip linklspci | grep -i ethernet(对于以太网)查看网卡信息。然后,使用ethtool -i [interface]来获取更多关于接口的详细信息,比如bus-info

  2. 编写udev规则
    /etc/udev/rules.d/目录下创建一个新的udev规则文件,比如70-persistent-net.rules(注意:文件名和编号可能因系统而异,但确保你的规则文件在其它网络相关的udev规则之后被处理)。

    编写规则以匹配你的网卡信息,并设置新的接口名称。例如:

    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="你的网卡MAC地址", ATTR{dev_id}=="0x0", ATTR{type}=="1",  NAME="new_interface_name"
    

    注意替换你的网卡MAC地址new_interface_name为实际的MAC地址和你想设置的接口名称。

  3. 重启udev服务或重启系统

    sudo udevadm control --reload-rules
    sudo udevadm trigger
    

    或者简单地重启你的系统。

2. 使用nmcli(NetworkManager的命令行界面)

如果你的系统使用NetworkManager,你可以使用nmcli来重命名网络接口。但是,请注意,这种方法可能不是永久性的,因为NetworkManager可能会在下一次启动时重新应用其配置。

  1. 列出所有网络接口

    nmcli device status
    
  2. 重命名网络接口

    nmcli con mod [connection-name] connection.interface-name [new-name]
    

    注意替换[connection-name]为当前的连接名称(不是设备名称),[new-name]为你想要设置的新名称。

  3. 重新加载NetworkManager配置

    sudo systemctl restart NetworkManager
    

/etc/udev/rules.d/

/etc/udev/rules.d/ 目录在 Linux 系统中用于存放自定义的 udev 规则文件。udev 是一个设备管理器,它根据存储在 /etc/udev/rules.d/ 目录下的规则文件来管理 /dev 目录下的设备文件。这些规则文件决定了当内核检测到新设备时,如何为该设备创建或修改设备文件。

对于网络接口(网卡)的名称管理,虽然现代 Linux 系统通常使用 systemd-networkd 或 NetworkManager 来处理网络接口的配置,但 udev 规则仍然可以用来设置或更改网络接口的名称。然而,这种方法通常用于在系统启动时或设备首次被识别时确定接口名称,而不是在运行时更改它们。

要在 /etc/udev/rules.d/ 目录下创建用于更改网络接口名称的 udev 规则,你需要:

  1. 确定网卡的硬件标识符:使用 lspcilsusb(对于 USB 网卡)或 ip link 命令查看系统上的网络接口和设备信息。你可能需要查找 MAC 地址、设备型号或总线信息来唯一标识你的网卡。

  2. 编写 udev 规则:在 /etc/udev/rules.d/ 目录下创建一个新的规则文件(确保文件名以 .rules 结尾,并且文件名在数字上大于 70,以确保它在默认规则之后被处理)。在该文件中,编写一个规则来匹配你的网卡,并设置一个新的接口名称。例如:

    # 假设网卡的 MAC 地址是 00:1A:2B:3C:4D:5E
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:1a:2b:3c:4d:5e", NAME="eth_custom"
    

    注意:在实际使用中,MAC 地址应该完全匹配(包括大小写),但通常小写字母更为常见。此外,某些系统可能不允许将接口名称更改为以 eth 开头的名称,除非你的系统明确支持这一点(例如,通过预测性接口命名方案之外的配置)。

  3. 重新加载 udev 规则:创建或修改规则文件后,你需要重新加载 udev 规则以使更改生效。这可以通过运行 udevadm control --reload-rules 命令来完成,然后你可能需要触发 udev 事件来应用新规则,这可以通过 udevadm trigger 命令来完成,或者简单地重启系统。

然而,请注意,对于大多数现代 Linux 发行版来说,网络接口的名称通常是由 systemd-networkd 或 NetworkManager 根据预测性接口命名方案(如基于位置的命名 enpXsYfZ、基于 MAC 地址的命名 enx... 等)自动设置的。如果你想要更改这些名称,你可能需要调整 systemd-networkd 或 NetworkManager 的配置,而不是编写 udev 规则。

此外,如果你的系统使用 NetworkManager,并且你想要更改网络接口的名称,你可以考虑使用 NetworkManager 的命令行工具 nmcli 来实现这一点,但这通常涉及更改连接配置而不是网络接口本身的名称。对于永久更改,你可能需要编辑 NetworkManager 的配置文件(如 /etc/NetworkManager/system-connections/ 目录下的文件)。

Linux的udev

Linux中的udev(Userspace Device Enumeration)是一个设备管理器,它允许用户空间程序根据存储在/etc/udev/rules.d/目录下的规则文件来管理/dev目录下的设备文件。udev通过监听内核发出的设备添加或删除事件来动态地管理设备节点,这使得Linux系统能够更灵活、更高效地处理硬件设备。

udev的主要功能和特点包括:

  1. 动态设备管理:udev能够动态地创建和删除/dev目录下的设备文件,而无需重启系统。当内核检测到新设备时,udev会读取相应的规则文件,并根据规则来创建或修改设备文件。

  2. 灵活的命名规则:udev允许用户通过编写规则文件来自定义设备文件的命名规则。这些规则可以基于设备的各种属性,如供应商ID、产品ID、序列号、总线类型等。

  3. 权限和所有权管理:udev规则还可以指定设备文件的权限和所有权,从而确保只有合适的用户或组能够访问这些设备。

  4. 环境变量和属性导出:udev可以将设备的属性导出为环境变量,供用户空间程序使用。这使得用户空间程序能够更容易地获取设备的详细信息。

udev的工作流程大致如下:

  1. 内核检测到新设备:当内核检测到新设备时,它会发送一个设备添加事件到udev守护进程。

  2. udev守护进程接收事件:udev守护进程接收到设备添加事件后,会读取/etc/udev/rules.d/目录下的规则文件,并尝试匹配该设备的属性。

  3. 规则匹配:udev会按照规则文件的顺序逐一匹配设备的属性。如果找到匹配的规则,udev会根据规则中的指令来创建或修改设备文件。

  4. 创建或修改设备文件:如果规则指定了创建设备文件,udev会在/dev目录下创建相应的设备文件,并根据规则设置其权限、所有权等属性。

  5. 发送事件:udev还会发送一个设备准备就绪的事件到用户空间,通知其他程序该设备已经可用。

udev规则文件的编写:

udev规则文件通常包含一系列的行,每行都是一个规则。规则由多个键值对组成,它们之间用逗号分隔。规则文件的基本语法如下:

KEY="value", KEY="value", ... RUN+="program"

其中,KEY="value"部分用于匹配设备的属性,而RUN+="program"部分则指定了当规则匹配时要执行的程序或脚本。

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

这行udev规则是用来在Linux系统中自动配置网络设备接口的。让我们一步步解析这个规则的含义:

  • SUBSYSTEM=="net": 这个条件指定了规则适用于哪个子系统。在这个例子中,它指定了规则仅适用于网络(net)子系统。这意呀着,当udev检测到与网络相关的设备事件时,这个规则才会被考虑。

  • ACTION=="add": 这个条件指定了规则应该在什么动作下触发。add表示当设备被添加到系统中时(例如,当网络接口卡(NIC)被物理插入或系统启动时识别到网络接口),这个规则会被执行。

  • DRIVERS=="?*": 这个条件用于匹配设备的驱动程序。?*是一个通配符,表示这个规则不特定于某个驱动程序,而是适用于所有驱动程序。然而,在实际应用中,如果可能的话,指定具体的驱动程序会更精确。

  • ATTR{address}=="00:0c:29:cf:4b:cd": 这个条件指定了设备的MAC地址。只有当设备的MAC地址与00:0c:29:cf:4b:cd完全匹配时,这个规则才会被应用。MAC地址是网络接口卡的唯一标识符。

  • ATTR{type}=="1": 这个条件指定了网络接口的类型。1通常表示以太网接口(Ethernet)。这有助于确保规则仅应用于以太网设备。

  • KERNEL=="eth*": 这个条件指定了内核设备名称的模式。eth*表示任何以eth开头的设备名称,这是传统上用于以太网接口的命名方式。然而,现代Linux系统可能使用enpens等命名方案,具体取决于系统的配置。

  • NAME="eth0": 这个动作指定了当规则匹配时,应该给设备分配的名称。在这个例子中,无论设备的原始名称是什么,只要它满足上述所有条件,它都将被重命名为eth0。这对于保持网络接口名称的一致性非常有用,尤其是在需要明确知道网络接口名称的脚本或配置文件中。

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"

这段udev规则是用来在系统检测到新的网络设备(如网卡)被添加时,执行一个特定的脚本来重命名这个设备。下面是对这段规则的详细解释:

  • ACTION=="add": 这表示当udev接收到一个设备添加(add)的事件时,这条规则才会被应用。

  • SUBSYSTEM=="net": 这指定了规则适用的子系统是“net”,即网络设备。

  • DRIVERS=="?*": 这里使用了通配符?*,意味着这条规则会匹配任何驱动程序的设备。但实际上,对于网络设备来说,这个条件可能并不是特别有用,因为网络设备的识别通常不依赖于驱动程序名称的精确匹配。不过,这里可能是为了保持规则的通用性或兼容性。

  • ATTR{type}=="1": 这指定了设备属性type必须等于1。在网络设备的上下文中,type属性可能指的是设备类型或某种特定的属性,但具体含义取决于设备及其驱动程序。不过,对于大多数现代Linux系统来说,这个条件可能不是必需的,因为udev已经能够很好地根据其他属性来识别网络设备。

  • PROGRAM="/lib/udev/rename_device": 这指定了当规则匹配时,udev应该执行的程序。在这个例子中,它指向了一个名为rename_device的脚本,该脚本位于/lib/udev/目录下。这个脚本的具体作用是重命名设备,但请注意,这个脚本是虚构的,实际的Linux发行版中可能并不包含这样的脚本。你需要自己编写这个脚本,或者指向一个已经存在的、能够执行重命名操作的脚本。

  • RESULT=="?*": 这个条件是用来捕获PROGRAM指定的脚本执行后的输出结果的。?*是一个通配符,意味着它会匹配脚本输出的任何内容。然而,这里有一个问题:udev的RESULT变量实际上并不直接支持从PROGRAM中捕获输出。通常,你会在脚本中直接设置设备名称,而不是通过RESULT变量。因此,这个条件可能是不准确的,或者是在某种特定上下文(如某个特定版本的udev或某个自定义的udev扩展)中使用的。

  • NAME="$result": 这指定了如果前面的条件都满足,那么设备的名称应该被设置为$result变量的值。但是,由于RESULT变量在标准的udev中并不用于捕获PROGRAM的输出,因此这里可能是一个错误或误解。在实际应用中,你可能需要在脚本中直接调用udevadm testudevadm info等工具来设置设备名称,或者通过修改/etc/udev/rules.d/中的规则文件来直接指定新的设备名称。

综上所述,这段udev规则试图在添加新网络设备时执行一个脚本来重命名该设备,但其中存在一些不准确或需要修改的地方。特别是RESULT=="?*"NAME="$result"部分,它们可能需要根据实际情况进行调整。

综上所述,这个udev规则的目的是在Linux系统中自动将具有特定MAC地址(00:0c:29:cf:4b:cd)和类型(以太网)的网络接口重命名为eth0。这对于确保网络接口名称的一致性非常有用,尤其是在需要明确知道网络接口名称的自动化脚本或配置文件中。

注意事项:

  • 编写udev规则时,需要确保规则文件的语法正确,并且规则之间的顺序符合你的需求。
  • 规则文件中的属性名称和值需要与实际设备的属性相匹配,否则规则将无法正确匹配设备。
  • 在修改udev规则后,通常需要重新加载udev规则或重启udev守护进程来使更改生效。这可以通过运行udevadm control --reload-rulesudevadm trigger命令来完成。

udev是Linux系统中非常重要的一部分,它使得设备管理变得更加灵活和高效。通过编写udev规则文件,用户可以自定义设备文件的命名规则、权限和所有权等属性,从而满足不同的使用需求。

是否所有Linux都使用udev

并非所有Linux都使用udev,但udev已成为许多现代Linux发行版的默认设备管理工具。udev是Linux 2.6内核引入的一个功能,它替代了早期的devfs,成为管理/dev目录下设备文件的主要方式。

udev的普及程度

  • 现代Linux发行版:大多数现代的Linux发行版,如Fedora、Ubuntu、Debian等,都默认使用udev作为设备管理器。
  • 旧版Linux:在一些较旧的Linux版本或特定的发行版中,可能仍然使用devfs或其他设备管理工具。然而,随着Linux内核的发展,这些旧工具已经被逐渐淘汰。

udev的优势

  • 动态管理:udev能够动态地创建和删除设备文件,而无需重启系统。这使得Linux系统能够更灵活地处理硬件设备的变化。
  • 灵活的命名规则:用户可以通过编写udev规则文件来自定义设备文件的命名规则,这些规则可以基于设备的各种属性,如供应商ID、产品ID、序列号等。
  • 权限和所有权管理:udev规则还可以指定设备文件的权限和所有权,从而确保只有合适的用户或组能够访问这些设备。

特殊情况

  • 嵌入式系统:在一些资源受限的嵌入式系统中,可能会使用更轻量级的设备管理工具来替代udev。
  • 特殊需求:某些特定的应用场景或需求可能要求使用特定的设备管理工具,而不是udev。

结论

虽然udev已成为许多现代Linux发行版的默认设备管理工具,但并不是所有Linux都使用udev。在选择设备管理工具时,Linux发行版会根据其目标用户群、系统资源、功能需求等因素进行综合考虑。然而,随着Linux内核和发行版的发展,udev的普及程度有望继续提高。




ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result" 的说明

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"

这段udev规则是用来在系统检测到新的网络设备(如网卡)被添加时,执行一个特定的脚本来重命名这个设备。下面是对这段规则的详细解释:

  • ACTION=="add": 这表示当udev接收到一个设备添加(add)的事件时,这条规则才会被应用。

  • SUBSYSTEM=="net": 这指定了规则适用的子系统是“net”,即网络设备。

  • DRIVERS=="?*": 这里使用了通配符?*,意味着这条规则会匹配任何驱动程序的设备。但实际上,对于网络设备来说,这个条件可能并不是特别有用,因为网络设备的识别通常不依赖于驱动程序名称的精确匹配。不过,这里可能是为了保持规则的通用性或兼容性。

  • ATTR{type}=="1": 这指定了设备属性type必须等于1。在网络设备的上下文中,type属性可能指的是设备类型或某种特定的属性,但具体含义取决于设备及其驱动程序。不过,对于大多数现代Linux系统来说,这个条件可能不是必需的,因为udev已经能够很好地根据其他属性来识别网络设备。

  • PROGRAM="/lib/udev/rename_device": 这指定了当规则匹配时,udev应该执行的程序。在这个例子中,它指向了一个名为rename_device的脚本,该脚本位于/lib/udev/目录下。这个脚本的具体作用是重命名设备,但请注意,这个脚本是虚构的,实际的Linux发行版中可能并不包含这样的脚本。你需要自己编写这个脚本,或者指向一个已经存在的、能够执行重命名操作的脚本。

  • RESULT=="?*": 这个条件是用来捕获PROGRAM指定的脚本执行后的输出结果的。?*是一个通配符,意味着它会匹配脚本输出的任何内容。然而,这里有一个问题:udev的RESULT变量实际上并不直接支持从PROGRAM中捕获输出。通常,你会在脚本中直接设置设备名称,而不是通过RESULT变量。因此,这个条件可能是不准确的,或者是在某种特定上下文(如某个特定版本的udev或某个自定义的udev扩展)中使用的。

  • NAME="$result": 这指定了如果前面的条件都满足,那么设备的名称应该被设置为$result变量的值。但是,由于RESULT变量在标准的udev中并不用于捕获PROGRAM的输出,因此这里可能是一个错误或误解。在实际应用中,你可能需要在脚本中直接调用udevadm testudevadm info等工具来设置设备名称,或者通过修改/etc/udev/rules.d/中的规则文件来直接指定新的设备名称。

综上所述,这段udev规则试图在添加新网络设备时执行一个脚本来重命名该设备,但其中存在一些不准确或需要修改的地方。特别是RESULT=="?*"NAME="$result"部分,它们可能需要根据实际情况进行调整。




SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" 说明

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

这行udev规则是用来在Linux系统中自动配置网络设备接口的。让我们一步步解析这个规则的含义:

  • SUBSYSTEM=="net": 这个条件指定了规则适用于哪个子系统。在这个例子中,它指定了规则仅适用于网络(net)子系统。这意呀着,当udev检测到与网络相关的设备事件时,这个规则才会被考虑。

  • ACTION=="add": 这个条件指定了规则应该在什么动作下触发。add表示当设备被添加到系统中时(例如,当网络接口卡(NIC)被物理插入或系统启动时识别到网络接口),这个规则会被执行。

  • DRIVERS=="?*": 这个条件用于匹配设备的驱动程序。?*是一个通配符,表示这个规则不特定于某个驱动程序,而是适用于所有驱动程序。然而,在实际应用中,如果可能的话,指定具体的驱动程序会更精确。

  • ATTR{address}=="00:0c:29:cf:4b:cd": 这个条件指定了设备的MAC地址。只有当设备的MAC地址与00:0c:29:cf:4b:cd完全匹配时,这个规则才会被应用。MAC地址是网络接口卡的唯一标识符。

  • ATTR{type}=="1": 这个条件指定了网络接口的类型。1通常表示以太网接口(Ethernet)。这有助于确保规则仅应用于以太网设备。

  • KERNEL=="eth*": 这个条件指定了内核设备名称的模式。eth*表示任何以eth开头的设备名称,这是传统上用于以太网接口的命名方式。然而,现代Linux系统可能使用enpens等命名方案,具体取决于系统的配置。

  • NAME="eth0": 这个动作指定了当规则匹配时,应该给设备分配的名称。在这个例子中,无论设备的原始名称是什么,只要它满足上述所有条件,它都将被重命名为eth0。这对于保持网络接口名称的一致性非常有用,尤其是在需要明确知道网络接口名称的脚本或配置文件中。




ACTION=="add", SUBSYSTEM=="net", NAME=="", DRIVERS=="ibmveth", PROGRAM="/bin/sh -ec 'D=$${DEVPATH#*/vio/}; D=$${D%%%%/*}; D=$${D#????}; D=$${D#0}; D=$${D#0}; D=$${D#0}; D=$${D#0}; echo $${D:-0}'", NAME="ibmveth$result" 说明

ACTION=="add", SUBSYSTEM=="net", NAME=="", DRIVERS=="ibmveth", PROGRAM="/bin/sh -ec 'D=$${DEVPATH#*/vio/}; D=$${D%%%%/*}; D=$${D#????}; D=$${D#0}; D=$${D#0}; D=$${D#0}; D=$${D#0}; echo $${D:-0}'", NAME="ibmveth$result"

这段udev规则是针对IBM Power系列服务器上的ibmveth网络接口卡(NIC)设计的,用于在设备添加时自动重命名网络接口。让我们逐步解析这段规则:

  • ACTION=="add": 这表示当udev接收到一个设备添加(add)的事件时,这条规则才会被触发。

  • SUBSYSTEM=="net": 指定了规则适用的子系统是“net”,即网络设备。

  • NAME=="": 这个条件通常用于确保在udev尝试设置设备名称之前,该设备还没有被赋予名称。然而,在某些情况下,这个条件可能是多余的,因为udev通常会在应用规则之前清除设备名称。但在这里,它可能是为了确保只有在设备当前没有名称时才会应用这条规则。

  • DRIVERS=="ibmveth": 指定了规则仅适用于驱动程序为ibmveth的设备。ibmveth是IBM Power系列服务器上用于虚拟化环境(如LPARs和虚拟机)的网络接口驱动程序。

  • PROGRAM="/bin/sh -ec '...': 这是规则的核心部分,它指定了一个要执行的shell命令。这个命令通过一系列shell参数扩展和字符串操作来生成一个新的设备名称。具体步骤如下:

    • D=$${DEVPATH#*/vio/};:从DEVPATH环境变量(表示设备在udev设备树中的路径)中移除开头的*/vio/部分。DEVPATH是udev用来唯一标识设备的路径。
    • 接下来的几行D=$${D%%%%/*}; D=$${D#????};等是对D变量进行进一步的字符串处理,目的是从路径中提取出用于命名网络接口的部分。这些操作包括移除路径的末尾部分(可能是设备实例号或其他标识符),以及从剩余部分中移除前导的字符(这里用????表示,但实际上可能是基于ibmveth设备路径的具体结构来确定的)。
    • echo $${D:-0}'":最后,使用echo命令输出处理后的字符串D,如果D为空,则默认为0。这个输出将被用作设备的新名称。
  • NAME="ibmveth$result": 这里,$result变量应该捕获PROGRAM命令的输出。但是,请注意,udev规则中的PROGRAM并不直接设置$result变量。相反,udev会捕获PROGRAM命令的标准输出,并将其存储在内部,然后可以在规则的其他部分(如NAME赋值)中通过%k(对于内核名称)或%E{key}(对于环境变量)等占位符来引用。然而,在这个例子中,$result的使用可能是不准确的,因为udev没有这样的内置变量。正确的做法可能是直接使用%c(对于PROGRAM命令的输出,但并非所有udev版本都支持)或者通过某种方式将输出保存到环境变量中,并在NAME赋值时引用该环境变量。

然而,由于udev的复杂性,以及不同Linux发行版和udev版本之间的差异,上述规则中的$result部分可能无法按预期工作。一个更可靠的方法是使用udev的内置功能来捕获PROGRAM命令的输出,并直接在NAME赋值中引用它。但是,由于udev的限制,这可能需要一些创造性的解决方案,比如将输出写入一个临时文件,然后在udev规则中读取该文件的内容。

不过,对于大多数情况,你可能不需要如此复杂的脚本来生成设备名称。通常,简单的udev规则就足以根据设备的某些属性(如序列号、MAC地址或设备路径的一部分)来设置唯一的名称。在这个例子中,如果ibmveth设备的路径中包含足够的信息来唯一标识每个接口,那么你可以直接修改PROGRAM命令来提取这些信息,并将其用作设备名称的一部分。




SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" 说明

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

在udev规则中,您提供的规则片段用于在添加网络接口时,根据特定的条件来重命名该接口。这里,您使用了SUBSYSTEMACTIONDRIVERSATTR{address}ATTR{type}KERNEL等属性来匹配网络接口,如果所有条件都满足,则将接口重命名为eth0。不过,有几个地方需要注意或可能需要调整:

  1. DRIVERS==“?*”:这个条件通常用于匹配任何驱动程序。如果您的目的是不特别关心驱动程序,那么这个条件是可以的。但如果您想要针对特定的驱动程序,您应该替换?*为具体的驱动程序名称。

  2. ATTR{address}ATTR{type}:这些条件分别用于匹配网络接口的MAC地址和类型。在您的情况下,它们被设置为00:0c:29:cf:4b:cd1。确保这些值与您想要匹配的接口的实际值相匹配。

  3. KERNEL=="eth"*:这个条件用于匹配内核中设备的名称,这里它匹配以eth开头的任何名称。这通常是为了确保规则只应用于以太网接口。然而,请注意,在现代Linux系统中,网络接口的名称可能不是由内核直接分配的(特别是在使用systemd-networkd或udev的预测性命名规则时),但这个条件仍然可以用于过滤出传统上被认为是“以太网”类型的接口。

  4. NAME=“eth0”:这是udev规则中用于设置设备名称的部分。如果前面的所有条件都满足,该接口将被重命名为eth0

完整的udev规则可能看起来像这样(注意,我已经移除了不必要的空格和格式化以符合通常的udev规则风格):

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:cf:4b:cd", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

确保将此规则添加到udev规则文件中,这些文件通常位于/etc/udev/rules.d/目录下,并且以.rules作为文件扩展名。您可能还需要重新加载udev规则或重启系统来使更改生效。

另外,请注意,如果系统使用了systemd的预测性命名规则或其他网络接口命名机制,那么直接通过udev规则来重命名接口可能不起作用,或者可能需要在系统启动时通过其他方式(如systemd服务或启动脚本)来重置接口名称。然而,在大多数基于Debian和Red Hat的Linux发行版中,传统的udev命名方法仍然有效,只要没有启用预测性命名。




SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="<网卡的MAC地址>", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="newname" 说明

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="<网卡的MAC地址>", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="newname"

这条udev规则是用来在Linux系统中自动识别和重命名网络接口的。下面是对这条规则的详细解释:

  • SUBSYSTEM=="net": 指定这条规则适用于net子系统,即这条规则将应用于网络设备相关的事件。

  • ACTION=="add": 指定这条规则仅在设备被添加(即插入或启动)到系统时触发。

  • DRIVERS=="?*": 这里使用?*作为通配符,意味着这条规则不特定于某个驱动程序。它适用于所有驱动程序。然而,在实际情况中,你可能想指定具体的驱动程序以更精确地控制规则的应用。

  • ATTR{address}=="<网卡的MAC地址>": 这里需要你将<网卡的MAC地址>替换为具体的MAC地址。这条规则会检查网络设备的MAC地址是否匹配指定的值。MAC地址是网络接口的唯一标识符,用于网络通信。

  • ATTR{dev_id}=="0x0": 指定设备的设备ID。然而,通常设备ID是用来唯一标识设备的,但在网络设备的上下文中,它可能不是必须的或者不是唯一的。这个值可能需要根据实际情况进行调整或移除。

  • ATTR{type}=="1": 指定设备类型。对于网络设备来说,type=1通常表示以太网设备。

  • KERNEL=="eth*": 指定内核识别的设备名称。eth*是一个通配符,表示所有以eth开头的设备名称。这通常用于匹配传统的以太网接口名称,如eth0eth1等。

  • NAME="newname": 这是规则的动作部分,它将匹配的设备重命名为newname。你需要将newname替换为你希望赋予网络接口的新名称。

综上所述,这条udev规则的目的是在Linux系统中自动识别和重命名一个具有特定MAC地址的以太网设备为newname。请注意,在实际应用中,你可能需要根据你的系统环境和具体需求调整这条规则。

另外,要使这条规则生效,你需要将其添加到udev的规则文件中,通常位于/etc/udev/rules.d/目录下。然后,你可能需要重启udev服务或重新加载udev规则(使用udevadm control --reload-rules命令),以及重新加载网络接口(例如,通过重启网络服务或使用ip link set <原接口名> down; ip link set <原接口名> name <新接口名>; ip link set <新接口名> up命令)来应用这个更改。










nmcli 删除所有连接

在使用nmcli(NetworkManager的命令行界面)时,直接删除所有网络连接的命令并不直接存在,因为nmcli没有提供一个直接的命令来一次性删除所有连接。但是,你可以通过一些脚本或命令组合来实现这个目的。

下面是一个使用bash脚本和nmcli命令来删除所有网络连接的示例方法。请注意,在运行这些命令之前,请确保你完全理解它们的含义,并且你确实想要删除所有网络连接。

方法一:使用nmclibash循环

你可以使用nmcli con show命令列出所有连接,然后通过循环和nmcli con delete命令来删除它们。

#!/bin/bash# 列出所有网络连接并删除它们
connections=$(nmcli con show | awk 'NR>1 {print $1}')
for con in $connections; donmcli con delete "$con"
done

注意:这个脚本跳过了第一行(通常是标题行),并且假设所有的连接名称都不包含空格或特殊字符,这通常是对的,但并非总是如此。

方法二:使用grepxargs

另一个方法是使用grep来过滤出连接名称,并使用xargs来将它们作为参数传递给nmcli con delete命令。

nmcli con show | grep -v "^NAME" | awk '{print $1}' | xargs -I {} nmcli con delete {}

这条命令的工作方式如下:

  1. nmcli con show:列出所有网络连接。
  2. grep -v "^NAME":排除标题行(假设标题行以"NAME"开头)。
  3. awk '{print $1}':打印每行的第一个字段,即连接名称。
  4. xargs -I {} nmcli con delete {}:将前面的输出作为参数传递给nmcli con delete命令,-I {}是一个替换字符串,用于在nmcli con delete命令中插入每个连接名称。

注意

  • 在执行这些操作之前,请确保你已经保存了所有重要连接的配置,因为一旦删除,这些配置将不可恢复(除非你有备份)。
  • 如果你不确定哪些连接是重要的,或者你不确定这些命令的效果,请先在一个测试环境中尝试它们。
  • 在某些系统上,你可能需要sudo权限来删除网络连接。如果是这样,请在命令前加上sudo

xargs的大括号{}

xargs 命令是一个强大的命令行工具,它可以将标准输入(stdin)数据转换成命令行参数。xargs 在处理来自管道(pipe)或文件的数据时特别有用,尤其是当这些数据需要作为其他命令的参数时。

然而,在直接讨论 xargs 的大括号 {} 时,我们实际上可能是在混淆了 xargs 和另一个常用的命令行工具——find 命令与 -exec 选项结合使用时的 {} 占位符,或者是在讨论 xargs-I 选项(在某些版本的 xargs 中是 -i)结合使用时自定义的替换字符串。

find 命令的 {}

find 命令中,{} 是一个特殊的字符串,它代表了 find 命令找到的每个文件名。当与 -exec 选项一起使用时,{} 被用来在 -exec 指定的命令中插入这些文件名。例如:

find . -name "*.txt" -exec echo {} \;

这个命令会查找当前目录及其子目录下所有扩展名为 .txt 的文件,并对每个找到的文件执行 echo 命令,打印出文件名。

xargs 的 -I 选项

虽然 xargs 本身不使用 {} 作为内置占位符,但它允许你通过 -I(或 -i,在某些实现中)选项指定一个自定义的替换字符串。这个字符串将在 xargs 从标准输入读取的每个项目出现时被替换。例如:

echo -e "file1.txt\nfile2.txt" | xargs -I {} echo Processing {}

这个命令会输出:

Processing file1.txt
Processing file2.txt

在这里,{} 被用作替换字符串,xargs 会将每个从标准输入读取的行替换为 {},然后执行指定的命令(在这个例子中是 echo Processing {})。

总结

因此,当你看到大括号 {}xargs 一起使用时,很可能是因为 xargs 被用来处理由其他命令(如 find)生成的数据,并且 {} 实际上是在那个生成数据的命令中使用的。或者,xargs 正在使用 -I 选项来指定一个自定义的替换字符串,该字符串在功能上类似于 find 命令中的 {}







本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在android中怎么处理后端返回列表中包含图片id,如何将列表中的图片id转化成url

在 Android 中实现从包含图片 ID 的列表获取实际图片 URL 并显示图片,你可以使用以下步骤: 定义数据模型:创建一个 Java 或 Kotlin 类来表示列表中的对象。 网络请求:使用 Retrofit 或其他网络库来获取图片 URL。 异步处理:使用 AsyncTask、RxJava 或 Kotlin 协程来处理网…

算法训练 2024.7.27 17:25

目录 1. 两数之和2.反转链表3. 是否为有效的括号4.最长公共前缀5.合并两个有序数组6. 岛屿的个数7. 最小路径和8. 三数之和9. 计数质数10. 字符串转换整数 ( atoi) 1. 两数之和 题目&#xff1a; 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为…

Python 在自动化中的实际应用:用 Python 简化繁琐任务

文章目录 1、概述2、自动化文件和目录管理3.数据处理与分析4.网页爬虫5. 系统管理6。定时任务7.结语 1、概述 这篇文章将深入探讨Python在自动化中的实际应用&#xff0c;帮助您用Python简化繁琐任务。 我们将从多个方面入手&#xff0c;展示如何利用Python进行文件管理、数据…

百度贴吧爬虫实战(BeautifulSoup+lxml)

文章目录 BeautifulSouplxml使用场景具体代码具体解析1. 导入模块2. 定义爬虫类3. 初始化方法4. 获取URL列表5. 获取页面内容6. 提取页面数据7. 保存数据8. 运行爬虫9. 主程序 总结 在实际爬虫之前还需要了解和下载两个模块&#xff1a;BeautifulSoup和lxml。 BeautifulSoup 和…

jmeter-beanshell学习-try处理异常

有时候代码执行过程中&#xff0c;出现一些不能处理的情况&#xff0c;就会报错&#xff0c;还影响之后的代码执行&#xff0c;就需要跳过异常。 上面这情况报错了&#xff0c;还影响了下面的打印。beanshell用try和catch处理异常&#xff0c;下面是try的用法&#xff0c;和if有…

PHP哈希签名方式sha1和sha256用于API对接签名验证

sha1 &#xff08;长度40字节&#xff09; -------------------------------------------------------------- $str 203fpid; $sha1 sha1($str); echo $sha1.<br>; php sha256加密 &#xff08;长度64&#xff09; --------------------------------…

技术守护尊严||Chat GPT在抵抗性骚扰的作用分析

就在本周&#xff0c;中国人民大学女博士实名举报导师性骚扰的事情&#xff0c;引发全网关注&#xff01; 性骚扰&#xff0c;无论在线上还是线下&#xff0c;无论在职场还是校园&#xff0c;都是对个人尊严与权益的严重侵犯。 幸运的是&#xff0c;随着人工智能技术的飞速发…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中&#xff0c;我们常常会遇到代码冗余的问题&#xff0c;这不仅增加了代码量&#xff0c;还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求&#xff0c;要求立马完…

[网络通信原理]——TCP/IP模型—网络层

网络层 网络层概述 网络层位于OSI模型的第三层&#xff0c;它定义网络设备的逻辑地址&#xff0c;也就是我们说的IP地址&#xff0c;能够在不同的网段之间选择最佳数据转发路径。在网络层中有许多协议&#xff0c;其中主要的协议是IP协议。 IP数据包格式 IP数据报是可变长度…

区块链——代码格式检查(prettier、solhint)

一、引入依赖 // 导入prettier prettier-plugin-solidity yarn add --dev prettier prettier-plugin-solidity yarn add --dev solhint二、创建.prettierrc文件 {"tabWidth": 2,"semi": false,"useTabs": false,"singleQuote": fals…

《最新出炉》系列入门篇-Python+Playwright自动化测试-55- 上传文件 (非input控件)- 中篇

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 在实际工作中&#xff0c;我们进行web自动化的时候&#xff0c;文件上传是很常见的操作&#xff0c;例如上传用户头像&#xff0c;上传身份证信息等。所以宏哥打算按上传文件…

100个Python基本语法知识(一)

1. 基本语法结构 缩进 Python使用缩进来定义代码块&#xff0c;而不是像其他语言那样使用大括号{}。通常&#xff0c;每个缩进级别使用4个空格。 注释 单行注释以#开头。多行注释可以使用三引号或"""。 变量 Python是动态类型语言&#xff0c;变量无需事先…

模块与组件、模块化与组件化的理解

在React或其他现代JavaScript框架中&#xff0c;模块与组件、模块化与组件化是核心概念&#xff0c;它们对于提高代码的可维护性、复用性和开发效率具有重要意义。以下是对这些概念的理解&#xff1a; 模块与组件 模块&#xff08;Module&#xff09; 定义&#xff1a;模块是…

Java从入门到精通(十二)~ 动态代理

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 主要作用和功能&#xff1a; 应用场景&#xff1a; 二、代理概念 1.静态代理 2.动态代理 2.1 概念介绍 …

网址导航系统PHP源码分享

1、采用光年全新v5模板开发后台 2、后台内置8款主题色&#xff0c;分别是简约白、炫光绿、渐变紫、活力橙、少女粉、少女紫、科幻蓝、护眼黑 3、可管理无数引导页主题并且主题内可以进行不同的自定义设置&#xff0c;目前内置16套主题 持续增加中… 4、可单独开发各种插件&a…

OSPF Type2 Message / DBD Packet (Database Descriptor)

注&#xff1a;机翻&#xff0c;未校对。 OSPF Type2 Message / DBD Packet (Database Descriptor) DBD (Database Description or Type2 OSPF Packet) is a sort of summary of the OSPF Database in a router. DBD is used to check if the LSDB between 2 routers is the s…

Linux---make/makefile工具

目录 基本了解 makefile基础语法 依赖关系 依赖方法 makefile文件内容格式 make执行机制 补充知识 机制解释 PHONY关键字 makefile补充语法 基本了解 在Linux中&#xff0c;make/makefile是项目自动化构建工具。如果我们没有make/makefile&#xff0c;那我们要编译一…

基于Java的模拟写字板的设计与实现

点击下载链接 基于Java的模拟写字板的设计与实现 摘要&#xff1a;目前&#xff0c;很多新的技术领域都涉及到了Java语言&#xff0c;Java语言是面向对象编程&#xff0c;并且涉及到网络、多线程等重要的基础知识&#xff0c;因此Java语言也是学习面向对象编程和网络编程的首…

Linux系统编程——生产者消费者模型

目录 一&#xff0c;模型介绍 1.1 预备知识&#xff08;超市买东西的例子&#xff09; 1.2 模型介绍 1.3 CP模型特点 二&#xff0c;基于阻塞队列的CP模型 2.1 介绍 2.2 阻塞队列的实现 2.3 主函数实现 2.4 效果展示 三&#xff0c;POSIX信号量 3.1 信号量原理 3…

一篇文章带你学完Java所有的时间与日期类

目录 一、传统时间与日期类 1.Date类 构造方法 获取日期和时间信息的方法 设置日期和时间信息的方法 2.Calendar类 主要特点和功能 常用方法 1. 获取当前日历对象 2. 获取日历中的某个信息 3. 获取日期对象 4. 获取时间毫秒值 5. 修改日历的某个信息 6. 为某个信息增…