linux grep 获取ip,使用ipconfig ip add grep命令获取本机IP

本文介绍了如何在Mac和Linux CentOS 7系统下通过命令行脚本获取本地IP地址。在Mac上,通过`ifconfig`命令过滤获取;在Linux上,使用`ipa`命令。通过`grep`、`sed`和`cut`等工具进行信息筛选,最终得到纯净的IP地址。此外,还展示了如何将这些脚本封装为可执行命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

[隐藏]

mac ifconfig 下面的实现

在 linux centos 7 下面实现获取本机IP的脚本

在 mac 下面输入 ifconfig 或者在 Linux 下面输入 ip a 就可以得到我们的网卡信息。不过通常情况下,我们需要查看的是我们的IP地址,不需要这么多的信息。所以,我想把这些信息给摘取出来。

mac ifconfig 下面的实现

我们输入 ifconfig 会得到大段的信息,我们可以看到我们想要的IP地址前面的字符串是 inet

所以,我们优化一下代码如下:

ifconfig | grep inet

得到如下信息:

inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet6 fe80::85e:9798:4041:1717%en0 prefixlen 64 secured scopeid 0x4 inet 192.168.12.139 netmask 0xffffff00 broadcast 192.168.12.255 inet6 fd86:415c:c5f9::c72:1c02:f044:65de prefixlen 64 autoconf secured inet6 fd86:415c:c5f9::cd76:7bb1:f77d:46f0 prefixlen 64 deprecated autoconf temporary inet6 fd86:415c:c5f9::508d:685b:6a66:b3ce prefixlen 64 autoconf temporary inet6 fe80::9446:a1ff:fe5e:9b8f%awdl0 prefixlen 64 scopeid 0x9 inet6 fe80::9d71:6fa:3da5:9cb6%utun0 prefixlen 64 scopeid 0xa

好,已经精简很多了。

我们再排除掉 inet6 和 127 的信息,就可以得到我们的本地IP了

ifconfig | grep inet | grep -v inet6 | grep -v 127

得到

inet 192.168.12.139 netmask 0xffffff00 broadcast 192.168.12.255

最前面是一个制表符,我们不管,我们用空格分割,并取第二个字段,就可以得到我们的IP信息了

ifconfig | grep inet | grep -v inet6 | grep -v 127 | cut -d ' ' -f2

就顺利的得到另外我们想要的本机IP地址。

我们在 ~/.bin/下面创建一个 getip 的文件,并用 chmod +x ~/.bin/getip 赋予执行权限。然后在命令行里输入 getip 就可以得到我们的本机IP了。

需要先把 ~/.bin/ 配置为环境变量,请参考 将这个命令作为一个系统命令,可以随时执行

在 linux centos 7 下面实现获取本机IP的脚本

linux 不使用 ifconfig 命令来获取信息,而是使用 ip a 来获取。

所以我们把上面的命令修改一下,改成

ip a | grep inet | grep -v inet6 | grep -v 127 | sed 's/^[ t]*//g' | cut -d ' ' -f2

由于 linux 中得到的信息的最前面不是制表符而是空格,所以加上了 sed ‘s/^[ t]*//g’ 来清除开头的空格。

其他的逻辑是一样的。如果喜欢的话,也可以搞成全局的,逻辑基本和mac是一致的。

原文出处:csdn -> http://blog.csdn.net/fungleo/article/details/76588993

<think>好的,用户之前询问了如何在OpenWrt上同时配置IPv4和IPv6,现在反馈说按照建议操作后仍然无法正确获取IPv6地址。我需要先回顾之前的对话,确保自己了解用户的具体配置步骤,然后分析可能导致IPv6地址获取失败的原因。 首先,用户之前的问题是设置`proto='dhcpv6'`导致IPv4失效,询问是否可以在一个接口混合配置或需要创建两个接口。我给出了两种方案:单接口混合配置和分离接口配置,并提供了详细的配置步骤。现在用户尝试了这些步骤,但IPv6地址仍然无法获取。 接下来,我需要考虑可能的故障点。可能的原因包括: 1. **主路由未正确配置IPv6支持**:如果主路由没有启用DHCPv6或SLAAC,客户端无法获取IPv6地址。 2. **OpenWrt配置错误**:可能用户遗漏了某些配置步骤,比如未正确设置`reqprefix`或`ip6assign`,或者防火墙阻止了IPv6流量。 3. **网络硬件或驱动问题**:某些网卡或驱动可能不支持IPv6,或者需要额外配置。 4. **ISP不支持IPv6**:如果网络上游没有提供IPv6连接,客户端自然无法获取地址。 5. **RA(路由通告)未启用**:IPv6地址的自动配置依赖于路由通告,如果主路由未发送RA,客户端无法自动配置地址。 我需要逐一排查这些可能性。首先,询问用户是否确认主路由支持IPv6,并检查主路由的配置。其次,检查OpenWrt的配置是否正确,包括`reqaddress`、`reqprefix`和防火墙设置。另外,建议用户使用`rdisc6`和`dhcp6c`测试RA和DHCPv6是否正常工作。 还要考虑用户可能遇到的常见问题,例如拼写错误、配置未提交或服务未重启。此外,可能需要检查内核日志(`dmesg`)或系统日志(`logread`)以获取更多线索。 用户可能对网络配置不太熟悉,因此需要提供具体的诊断命令和步骤,帮助他们逐步排查问题。同时,可能需要区分SLAAC和DHCPv6的不同获取方式,确认用户使用的是哪种方法,并相应调整配置。 最后,如果所有配置都正确,但问题依然存在,可能需要建议用户检查硬件兼容性或联系ISP确认IPv6支持情况。确保回答结构清晰,分步骤指导用户进行故障排除,并给出解决方案。</think>--- ### **一、常见原因分析** 如果按照混合配置操作后仍无法获取 IPv6 地址,可能由以下原因导致: | **原因分类** | **具体表现** | **验证方法** | |---------------------|----------------------------------------------------------------------------|-----------------------------------------------------------------------------| | **主路由未分配 IPv6** | 主路由未开启 DHCPv6 或 RA(路由通告),或 ISP 未提供 IPv6 前缀。 | 电脑直连主路由 LAN 口,检查是否能获取 IPv6 地址(如 `ip -6 addr`)。 | | **OpenWrt 配置错误** | `reqprefix`、`delegate` 参数设置错误,或防火墙拦截 IPv6 流量。 | 检查 UCI 配置(`uci show network.lan`)和防火墙规则(`uci show firewall`)。 | | **物理链路问题** | 网线/光猫故障,或 OpenWrt 设备的网卡驱动不支持 IPv6。 | 检查网口状态(`ip link show`),观察是否有 `NO-CARRIER` 或异常丢包。 | | **IPv6 服务未启用** | OpenWrt 的 `odhcpd`(IPv6 DHCP 服务)未运行,或未正确配置。 | 检查服务状态:`service odhcpd status`。 | --- ### **二、逐步排查方法** #### **步骤 1:验证主路由 IPv6 支持** 1. **直接连接测试**:将电脑直连主路由 LAN 口,执行以下命令: ```bash # Windows ipconfig /all | findstr "IPv6" # Linux ip -6 addr show dev eth0 ``` - 如果无 IPv6 地址,需检查主路由是否开启 **DHCPv6 或 SLAAC**。 2. **主路由配置检查**: - 登录主路由管理界面,确认 **IPv6 功能已启用**(如“IPv6 地址分配”或“RA 配置”)。 - 若主路由为光猫,可能需要联系 ISP 确认是否支持 IPv6。 --- #### **步骤 2:检查 OpenWrt 配置** 1. **确认关键配置项**: ```bash uci show network.lan ``` 输出应包含以下内容: ```ini network.lan.proto='static' # 协议类型 network.lan.ipaddr='192.168.1.2' # IPv4 地址 network.lan.reqaddress='try' # 主动请求 IPv6 地址 network.lan.reqprefix='auto' # 自动获取前缀(需 OpenWrt 21+) network.lan.delegate='0' # 关闭前缀委派(避免冲突) ``` **修复命令示例**: ```bash # 强制启用 IPv6 地址请求 uci set network.lan.reqaddress='force' # 请求 /64 前缀(根据 ISP 分配调整) uci set network.lan.ip6assign='64' uci commit network service network restart ``` 2. **检查 IPv6 服务状态**: ```bash # 确认 odhcpd 运行状态 service odhcpd status # 若未运行,手动启动并观察日志 service odhcpd start logread | grep odhcpd ``` --- #### **步骤 3:手动触发 IPv6 请求** 1. **发送路由请求(RS)**: ```bash # 安装 rdisc6 工具 opkg update && opkg install rdisc6 # 发送路由请求(替换 br-lan 为实际接口名) rdisc6 -1 br-lan ``` - 若输出包含 `Prefix:`,表示主路由发送了 RA 通告。 - 若无响应,可能主路由未启用 RA 或链路层故障。 2. **手动请求 DHCPv6 地址**: ```bash # 安装 DHCPv6 客户端 opkg update && opkg install wide-dhcpv6-client # 执行 DHCPv6 请求(替换 br-lan 为实际接口名) dhcp6c -f br-lan ``` - 观察输出是否包含 `IA_NA`(地址分配)或 `IA_PD`(前缀分配)。 --- #### **步骤 4:防火墙与内核配置** 1. **允许 IPv6 转发**: ```bash # 检查防火墙默认策略 uci get firewall.@zone[0].forward # 若为 REJECT,改为 ACCEPT uci set firewall.@zone[0].forward='ACCEPT' uci commit firewall service firewall restart ``` 2. **启用 IPv6 内核参数**: ```bash # 确认以下参数为 1 sysctl net.ipv6.conf.br-lan.accept_ra=1 # 接收 RA sysctl net.ipv6.conf.br-lan.autoconf=1 # 自动配置地址 sysctl net.ipv6.conf.br-lan.forwarding=1 # 启用转发 # 永久生效(编辑 /etc/sysctl.conf) echo "net.ipv6.conf.br-lan.accept_ra=1" >> /etc/sysctl.conf echo "net.ipv6.conf.br-lan.autoconf=1" >> /etc/sysctl.conf ``` --- ### **三、典型故障案例** #### **案例 1:主路由仅支持 SLAAC,但 OpenWrt 未启用自动配置** - **现象**:IPv6 地址未生成,但 `rdisc6` 能收到 RA 消息。 - **解决**: ```bash # 强制启用 SLAAC uci set network.lan.reqaddress='force' uci commit network service network restart ``` #### **案例 2:ISP 分配的是 /128 地址(非 PD 前缀)** - **现象**:`ip6assign` 配置为 64,但无法获取前缀。 - **解决**: ```bash # 调整为请求单个地址(非前缀) uci delete network.lan.ip6assign uci set network.lan.reqprefix='0' uci commit network ``` #### **案例 3:odhcpd 服务未绑定到 LAN 接口** - **现象**:`logread` 显示 `odhcpd` 未监听 `br-lan`。 - **解决**: ```bash # 编辑 /etc/config/odhcpd uci set odhcpd.lan=odhcpd uci set odhcpd.lan.maindhcp='0' uci set odhcpd.lan.interface='lan' uci commit odhcpd service odhcpd restart ``` --- ### **四、最终解决方案** #### **强制混合协议配置(兼容性最强)** ```bash # 清空现有配置 uci delete network.lan.proto uci delete network.lan.ipaddr uci delete network.lan.ip6assign # 设置混合模式 uci set network.lan.proto='static' uci set network.lan.ipaddr='192.168.1.2' # IPv4 地址 uci set network.lan.ip6assign='64' # 请求 /64 前缀 uci set network.lan.delegate='0' # 关闭委派 uci add_list network.lan.reqprefix='auto' # 自动前缀 uci add_list network.lan.reqaddress='force' # 强制请求地址 # 提交并重启 uci commit network service network restart # 验证地址 ip -6 addr show dev br-lan ``` #### **日志分析命令** ```bash # 实时跟踪 DHCPv6 过程 logread -f | grep dhcp # 查看内核 IPv6 状态 dmesg | grep -i ipv6 ``` --- ### **五、深度优化建议** 1. **优先使用 SLAAC**: 若主路由支持 RA,建议关闭 DHCPv6,减少协议开销: ```bash uci set network.lan.reqaddress='try' uci set network.lan.reqprefix='auto' uci set network.lan.delegate='0' ``` 2. **静态 IPv6 备用方案**: 如果自动获取失败,可手动指定 IPv6 地址: ```bash uci set network.lan.ip6addr='2408:1234:5678::2/64' # 替换为实际地址 uci set network.lan.ip6gw='fe80::1' # 网关(主路由链路本地地址) ``` 3. **IPv6 中继模式**: 当主路由不支持 IPv6 时,可通过中继模式获取地址: ```bash opkg install relayd uci set network.lan.proto='relay' uci set network.lan.network='wan lan' ``` --- ### **六、总结** - 若无法获取 IPv6,**优先排查主路由和物理链路**。 - OpenWrt 配置需重点关注 `reqprefix`、`delegate` 和防火墙规则。 - 使用 `rdisc6` 和 `dhcp6c` 工具可快速定位协议层问题。 - 混合配置的稳定性取决于主路由和 OpenWrt 版本的兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值