Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

通过命令获取IP参考 #531

Open
jeessy2 opened this issue Feb 7, 2023 · 79 comments
Open

通过命令获取IP参考 #531

jeessy2 opened this issue Feb 7, 2023 · 79 comments
Labels
documentation Improvements or additions to documentation keep

Comments

@jeessy2
Copy link
Owner

jeessy2 commented Feb 7, 2023

通过命令获取IP,可分享出自己的脚本,方便大家crtl+c crtl+v

@jeessy2
Copy link
Owner Author

jeessy2 commented Feb 7, 2023

  • 在Linux系统中获取网卡eth1的IPv6地址
    ip -6 addr show eth1
  • 在Linux系统中获取网卡eth1的IPv4地址
    ip -4 addr show eth1

@Camusama
Copy link

Camusama commented Feb 7, 2023

  • Linux get IPv6 prefix (移动开头2409)
    ip -6 route | awk '{print $1}' | awk '/2409:?/' | awk -F::/ '{print $1 "any other suffix of other mac"}'

@jeessy2 jeessy2 pinned this issue Feb 7, 2023
@jeessy2 jeessy2 added documentation Improvements or additions to documentation keep labels Feb 7, 2023
@solosing
Copy link

请问有办法通过命令获取同局域网其他设备Ipv6吗?

@jeessy2
Copy link
Owner Author

jeessy2 commented Feb 20, 2023

请问有办法通过命令获取同局域网其他设备Ipv6吗?

Linux get IPv6 prefix (移动开头2409)
ip -6 route | awk '{print $1}' | awk '/2409:?/' | awk -F::/ '{print $1 "any other suffix of other mac"}'
把any other suffix of other mac改成其它设备的IPv6(EUI-64)后缀

@qsrenl
Copy link

qsrenl commented Feb 26, 2023

Windows PowerShell获取ip

参阅微软文档根据网络环境自定义一些参数进行筛选

自用获取公网ipv6
Get-NetIPAddress -AddressFamily IPv6 -AddressState Preferred -SuffixOrigin Link -Type Unicast -PrefixOrigin RouterAdvertisement

@flyegg
Copy link

flyegg commented Mar 3, 2023

@jeessy2 目前匹配正则表达式只能按照顺序选择,大部分时候没问题,但偶尔会遇到一个问题。我这边网卡的IPV6地址,总是有2个地址,一个长一点的,一个短一点的。我发现只有长的才能用外网访问,短的没法访问。但是长的在前还是短的在前有些随机性。

比如这种:
eth0(2409:8a60:1111:2222:20c:29ff:feea:b763, 2409:8a60:1111:2222::3b3),有时候又会变成
eth0(2409:8a60:1111:2222::3b3, 2409:8a60:1111:2222:20c:29ff:feea:b763)

请问能不能设个选项,固定选择长一点的那个,这样就不用选具体1或者2了,谢谢

@jeessy2
Copy link
Owner Author

jeessy2 commented Mar 3, 2023

@jeessy2 目前匹配正则表达式只能按照顺序选择,大部分时候没问题,但偶尔会遇到一个问题。我这边网卡的IPV6地址,总是有2个地址,一个长一点的,一个短一点的。我发现只有长的才能用外网访问,短的没法访问。但是长的在前还是短的在前有些随机性。

比如这种: eth0(2409:8a60:1111:2222:20c:29ff:feea:b763, 2409:8a60:1111:2222::3b3),有时候又会变成 eth0(2409:8a60:1111:2222::3b3, 2409:8a60:1111:2222:20c:29ff:feea:b763)

请问能不能设个选项,固定选择长一点的那个,这样就不用选具体1或者2了,谢谢

ff:fe是长的那个?如果是直接正则表式中输入ff:fe

@flyegg
Copy link

flyegg commented Mar 3, 2023

ff:fe

请问不需要输入@之类的符号吗?直接在匹配正则表达式栏里面填写ff:fe就可以了吗?

@WaterLemons2k
Copy link
Contributor

请问不需要输入@之类的符号吗?直接在匹配正则表达式栏里面填写ff:fe就可以了吗?

应该可以

@jeessy2
Copy link
Owner Author

jeessy2 commented Mar 3, 2023

不加。@是指定第几个,你这个是匹配字符串正则

@flyegg
Copy link

flyegg commented Mar 3, 2023

不加。@是指定第几个,你这个是匹配字符串正则

谢谢,测试可以了。只要不换网卡的Mac,理论上最后几位地址应该不会变的。

同谢 @WaterLemons2k

@WaterLemons2k
Copy link
Contributor

WaterLemons2k commented Mar 3, 2023

Linux 仅获取纯公网 IPv6 地址

  • ip

    ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}'
  • ifconfig

    ifconfig | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}'

    参考:https://superuser.com/a/1057290

  • dynv6

    ip -6 addr list scope global | grep -v " fd" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p

@rehack
Copy link

rehack commented Mar 10, 2023

MacOS下没有ip命令,可以使用ifconfig
ifconfig en0 | grep inet ipv4&ipv6
ifconfig en0 | grep inet6 ipv6
ipconfig getv6packet en0

或者安装iproute2mac工具,就可以使用ip命令了

@babyvox550
Copy link

babyvox550 commented Mar 17, 2023

ip -6 addr show dev eth0 | sed -n 's|^.inet6 ([^ ]/64).*$|\1|p' 选定/64ipv6

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /ca1a/ {print $3}' 选中尾号CA1A的ip

@kffnqtd
Copy link

kffnqtd commented May 8, 2023

根据网卡地址查询
ip -6 n | grep ^2.*00:11:22:33:44:55 | tail -n 1 | awk '{print $1}'

1 similar comment
@kffnqtd
Copy link

kffnqtd commented May 8, 2023

根据网卡地址查询
ip -6 n | grep ^2.*00:11:22:33:44:55 | tail -n 1 | awk '{print $1}'

@wcn666
Copy link

wcn666 commented May 18, 2023

不加。@是指定第几个,你这个是匹配字符串正则

谢谢,测试可以了。只要不换网卡的Mac,理论上最后几位地址应该不会变的。

同谢 @WaterLemons2k

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

@WaterLemons2k
Copy link
Contributor

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

输出最长行:

awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

参考:https://www.baeldung.com/linux/print-longest-lines-in-file#using-theawk-command

@wcn666
Copy link

wcn666 commented May 18, 2023

不加。@是指定第几个,你这个是匹配字符串正则

谢谢,测试可以了。只要不换网卡的Mac,理论上最后几位地址应该不会变的。
同谢 @WaterLemons2k

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

前四组2409:8a60:1111:2222这几位长得v6和短的v6地址都是一样的无法区分,后面的地址我看了一下记录。每次都不一样,不像上面的朋友有一个ff:fe是一直不变的,我就没办法用这个方法进行筛选。

@wcn666
Copy link

wcn666 commented May 18, 2023

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

输出最长行:

awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

参考:https://www.baeldung.com/linux/print-longest-lines-in-file#using-theawk-command

好的,我去试一下看看能否生效。

@wcn666
Copy link

wcn666 commented May 18, 2023

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

输出最长行:

awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

参考:https://www.baeldung.com/linux/print-longest-lines-in-file#using-theawk-command

您好,我的版本不支持命令获取,我是centos7.9,升级镜像的命令是什么呀,没看到有

@WaterLemons2k
Copy link
Contributor

您好,我的版本不支持命令获取,我是centos7.9,升级镜像的命令是什么呀,没看到有

Releases 下载并解压 ddns-go 就可以了。

@wcn666
Copy link

wcn666 commented May 18, 2023

我也遇到了这个问题,长的v6地址可以访问,短位的不行,但是我v6地址对应你们说的后几位是一直在变动的,有没有什么办法选择映射长的这一个地址啊。

输出最长行:

awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

参考:https://www.baeldung.com/linux/print-longest-lines-in-file#using-theawk-command

好的,我去试一下看看能否生效。
最新版镜像,,命令获取提示这个
获取IPv6结果失败! 命令:/bin/bash -rc awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }',标准输出:""
2023/05/18 10:46:01 未能获取IPv6地址, 将不会更新

@WaterLemons2k
Copy link
Contributor

最新版镜像,,命令获取提示这个
获取IPv6结果失败! 命令:/bin/bash -rc awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }',标准输出:""
2023/05/18 10:46:01 未能获取IPv6地址, 将不会更新

请将输出通过管道传入 awk 才能输出最长行。

例如 Linux 仅获取纯公网 IPv6 地址

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

@wcn666
Copy link

wcn666 commented May 18, 2023

最新版镜像,,命令获取提示这个
获取IPv6结果失败! 命令:/bin/bash -rc awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }',标准输出:""
2023/05/18 10:46:01 未能获取IPv6地址, 将不会更新

请将输出通过管道传入 awk 才能输出最长行。

例如 Linux 仅获取纯公网 IPv6 地址

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

十分感谢,已经成功输出最长的ip地址。

@wcn666
Copy link

wcn666 commented May 18, 2023

最新版镜像,,命令获取提示这个
获取IPv6结果失败! 命令:/bin/bash -rc awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }',标准输出:""
2023/05/18 10:46:01 未能获取IPv6地址, 将不会更新

请将输出通过管道传入 awk 才能输出最长行。

例如 Linux 仅获取纯公网 IPv6 地址

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | awk '{ln=length}ln>max{delete result; max=ln}ln==max{result[NR]=$0}END{for(i in result) print result[i] }'

您好,我又遇到一个问题 在我的群晖上输出的最长地址为fd7a开头的非公网v6地址,如何可以限制为240开通的最长地址啊

@WaterLemons2k
Copy link
Contributor

WaterLemons2k commented May 18, 2023

您好,我又遇到一个问题 在我的群晖上输出的最长地址为fd7a开头的非公网v6地址,如何可以限制为240开通的最长地址啊

先看一下 Linux 仅获取纯公网 IPv6 地址 输出的是什么:

ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}'

@HowieHz
Copy link

HowieHz commented Feb 6, 2024

在提供的参考指令上进行了修改,
最终指令(如果要使用,请把第一段eth0改成你的网卡,或者直接去掉show eth0,只留下ip -6 addr

ip -6 addr show eth0 | grep 'inet6 240[a-f:A-F 0-9]*/64' | grep -v 'deprecated' | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}'

文章:记一次折腾IPV6 DDNS

@sleep4at
Copy link

有一个问题,我家的移动宽带7天会换一次ipv6地址,在换地址的那一天,我的所有设备都会存在两个ipv6地址
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:e0:4c:35:67:8f brd ff:ff:ff:ff:ff:ff inet 192.168.1.20/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0 valid_lft 38698sec preferred_lft 38698sec inet6 2409:8a55:5692:93e0:4a26:78b2:8605:6da4/64 scope global dynamic noprefixroute valid_lft 229664sec preferred_lft 143264sec inet6 2409:8a55:5693:6f20:9585:a837:c9e5:aea1/64 scope global dynamic noprefixroute valid_lft 230745sec preferred_lft 144345sec inet6 fe80::6421:206:4cf:c014/64 scope link noprefixroute valid_lft forever preferred_lft forever

5692是旧的,5693是新的,当它存在两个地址时,只有新的ipv6地址可用,也就是只有5693可用,除非我重启光猫或者重启设备,又或者等待一天,否则旧地址无法消失

我使用了很多命令,它们都是匹配旧的地址,我不知道该如何匹配到新的那个

@HowieHz
Copy link

HowieHz commented Feb 25, 2024

有一个问题,我家的移动宽带7天会换一次ipv6地址,在换地址的那一天,我的所有设备都会存在两个ipv6地址 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:e0:4c:35:67:8f brd ff:ff:ff:ff:ff:ff inet 192.168.1.20/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0 valid_lft 38698sec preferred_lft 38698sec inet6 2409:8a55:5692:93e0:4a26:78b2:8605:6da4/64 scope global dynamic noprefixroute valid_lft 229664sec preferred_lft 143264sec inet6 2409:8a55:5693:6f20:9585:a837:c9e5:aea1/64 scope global dynamic noprefixroute valid_lft 230745sec preferred_lft 144345sec inet6 fe80::6421:206:4cf:c014/64 scope link noprefixroute valid_lft forever preferred_lft forever

5692是旧的,5693是新的,当它存在两个地址时,只有新的ipv6地址可用,也就是只有5693可用,除非我重启光猫或者重启设备,又或者等待一天,否则旧地址无法消失

我使用了很多命令,它们都是匹配旧的地址,我不知道该如何匹配到新的那个

今天看到邮箱推送你的消息,你这个问题其实很简单,用我的指令再加一条tail -1就可以了
ip -6 addr show enp1s0 | grep 'inet6 240[a-f:A-F 0-9]*/64' | grep -v 'deprecated' | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | tail -1

@Amoseriy
Copy link

我也来提供一下我的方案

场景及需求

我的ddns-go运行在主路由的openwrt上面,openwrt作为DHCP服务器分配ip,下面有若干设备,我的需求是根据mac地址获取我电脑主机的ipv6,更新到cloudflare。

命令

ip -6 neigh show | grep 设备mac地址 | awk '/REACHABLE/' | awk '/240:?/{print $1}'

@sleep4at
Copy link

有一个问题,我家的移动宽带7天会换一次ipv6地址,在换地址的那一天,我的所有设备都会存在两个ipv6地址2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:e0:4c:35:67:8f brd ff:ff:ff:ff:ff:ff inet 192.168.1.20/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0 valid_lft 38698sec preferred_lft 38698sec inet6 2409:8a55:5692:93e0:4a26:78b2:8605:6da4/64 scope global dynamic noprefixroute valid_lft 229664sec preferred_lft 143264sec inet6 2409:8a55:5693:6f20:9585:a837:c9e5:aea1/64 scope global dynamic noprefixroute valid_lft 230745sec preferred_lft 144345sec inet6 fe80::6421:206:4cf:c014/64 scope link noprefixroute valid_lft forever preferred_lft forever
5692是旧的,5693是新的,当它存在两个地址时,只有新的ipv6地址可用,也就是只有5693可用,除非我重启光猫或者重启设备,又或者等待一天,否则旧地址无法消失
我使用了很多命令,它们都是匹配旧的地址,我不知道该如何匹配到新的那个

今天看到邮箱推送你的消息,你这个问题其实很简单,用我的指令再加一条就可以了tail -1 ip -6 addr show enp1s0 | grep 'inet6 240[a-f:A-F 0-9]*/64' | grep -v 'deprecated' | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | tail -1

👍ty 实测有效,同时我找到了这个项目下另外一个和我这个差不多的issue,下面有个回答也可以参考一下
#872 (comment)

@asd2317419
Copy link

你好 电脑接的是路由器 ip -4 addr show eth1 只能获取到局域网IP解析 无法获取到公网IP解析 应该怎么办

@jeessy2
Copy link
Owner Author

jeessy2 commented Mar 15, 2024

你好 电脑接的是路由器 ip -4 addr show eth1 只能获取到局域网IP解析 无法获取到公网IP解析 应该怎么办

用接口获取

@asd2317419
Copy link

你好 电脑接的是路由器 ip -4 addr show eth1 只能获取到局域网IP解析 无法获取到公网IP解析 应该怎么办

用接口获取

感谢回答
接口获取只能获取到eth0网口的公网地址 无法获取到eth1网口的公网地址 可否指定获取eth1的

@asd2317419
Copy link

你好 电脑接的是路由器 ip -4 addr show eth1 只能获取到局域网IP解析 无法获取到公网IP解析 应该怎么办

用接口获取

配置文件有更改选择网口eth0还是eth1 但是是不起作用的

@jeessy2
Copy link
Owner Author

jeessy2 commented Mar 15, 2024

你好 电脑接的是路由器 ip -4 addr show eth1 只能获取到局域网IP解析 无法获取到公网IP解析 应该怎么办

用接口获取

配置文件有更改选择网口eth0还是eth1 但是是不起作用的

建议补一下网络知识

@qingchuwudi
Copy link

为什么不考虑使用 curl --interface eth0 https://ipv6.icanhazip.com 这种方式获取公网IP?

@Se7enMuting
Copy link

Se7enMuting commented Mar 26, 2024

能不能在 ipv6 的通过网卡获取这里加点功能啊,利用@1指定第一个IPv6地址的这种内部变量,再加个例如@1:前64位 这种内部变量,来实现如下拼接:
@1:前64位"::abab:0001"
这样就不用费劲的去写通过命令获取了,你这里有现成的@1,@2,@3可以用多方便啊
或者把@1:前64位这种内部变量加到通过命令获取中,或者单独再开个通过网卡拼接 ipv6,反正就是利用现成的@1,@2

@HowieHz
Copy link

HowieHz commented Mar 29, 2024

为什么不考虑使用 curl --interface eth0 https://ipv6.icanhazip.com 这种方式获取公网IP?

不准确+你不知道这个网站服务哪天会关
你猜为什么我要用命令获取

@HowieHz
Copy link

HowieHz commented Mar 29, 2024

能不能在 ipv6 的通过网卡获取这里加点功能啊,利用@1指定第一个IPv6地址的这种内部变量,再加个例如@1:前64位 这种内部变量,来实现如下拼接: @1:前64位"::abab:0001" 这样就不用费劲的去写通过命令获取了,你这里有现成的@1,@2,@3可以用多方便啊 或者把@1:前64位这种内部变量加到通过命令获取中,或者单独再开个通过网卡拼接 ipv6,反正就是利用现成的@1,@2

你开个issue吧

@qingchuwudi
Copy link

qingchuwudi commented Apr 2, 2024

为什么不考虑使用 curl --interface eth0 https://ipv6.icanhazip.com 这种方式获取公网IP?

不准确+你不知道这个网站服务哪天会关 你猜为什么我要用命令获取

  1. IPv6 还有不准确的说法?
  2. 不在于网站是否稳定,重点在于这是一种获取IPv6的方式,而且用这种方式获取到的IP能保证网络可达。

    如你所说这种方式不可靠的话,现有的 ipv6 test 服务也都不可靠。

  3. Linux/Unix 体系下,用 cat /proc/net/if_inet6 | grep eth1 更直接
  4. 这是在讨论问题,为什么要让别人猜?

@HowieHz
Copy link

HowieHz commented Apr 2, 2024

为什么不考虑使用 curl --interface eth0 https://ipv6.icanhazip.com 这种方式获取公网IP?

不准确+你不知道这个网站服务哪天会关 你猜为什么我要用命令获取

  1. IPv6 还有不准确的说法?
  2. 不在于网站是否稳定,重点在于这是一种获取IPv6的方式,而且用这种方式获取到的IP能保证网络可达。

    如你所说这种方式不可靠的话,现有的 ipv6 test 服务也都不可靠。

  3. Linux/Unix 体系下,用 cat /proc/net/if_inet6 | grep eth1 更直接
  4. 这是在讨论问题,为什么要让别人猜?

TLDR, 网站获取到的是临时ipv6地址,然而只出不进,导致IPV6业务不通

@caliban511
Copy link

希望能有局域网内机器获取主路由公网IPv6地址的方案,,,🙏🙏🙏

@xfl12345
Copy link

xfl12345 commented Apr 6, 2024

按照 IPv6 的约定,对外暴露 IP地址 应当始终为 动态临时的IPv6地址
为了不受 网卡绑定 的约束,编写的命令都是可以动态获取已投入使用的 IP地址 。
以下命令均在 SLACC Only 的网络环境下工作良好。

Windows Powershell 代码

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress

Linux bash 代码

因为 Linux 执行 ip -6 addr 会看到错行的 valid_lft 582sec preferred_lft 582sec ,导致需要额外的工作选取合适的没过期的 IPv6 地址,所以我使用了简单粗暴的 ip route 命令。
(以下代码不确定也不保证 ash 可用)

ip route get 240c::6666 | grep -oE 'src.*$' | awk {'print $2'}

@qiuyesf
Copy link

qiuyesf commented Apr 7, 2024

通过软路由openwrt上安装DDns-go,来获取局域网中一台esxi主机的IPv6地址,我想的是通过mac地址来确定当前esxi的IPv6地址,输入ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1 后,也拿到了正确的ipv6地址,但是多了个"\n"。
输出日志如下
2024/04/07 16:11:03 获取IPv6结果失败! 命令: /bin/bash -c ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1, 标准输出: "2408:822a:90:1f541C:83:41:41:A0:BA\n"
2024/04/07 16:11:03 未能获取IPv6地址, 将不会更新

请问怎么能把\n 删掉呢?

@WaterLemons2k
Copy link
Contributor

通过软路由openwrt上安装DDns-go,来获取局域网中一台esxi主机的IPv6地址,我想的是通过mac地址来确定当前esxi的IPv6地址,输入ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1 后,也拿到了正确的ipv6地址,但是多了个"\n"。 输出日志如下 2024/04/07 16:11:03 获取IPv6结果失败! 命令: /bin/bash -c ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1, 标准输出: "2408:822a:90:1f541C:83:41:41:A0:BA\n" 2024/04/07 16:11:03 未能获取IPv6地址, 将不会更新

请问怎么能把\n 删掉呢?

在结尾添加 tr -d '\n'

ip -6 route | awk '{print $1}' | awk '/2408:?/' | awk -F::/ '{print $1 "1C:83:41:41:A0:BA"}' | tail -1 | tr -d '\n'

参考:https://stackoverflow.com/questions/12524308/bash-strip-trailing-linebreak-from-output

@Clown8888
Copy link

nic="$(ip 路由 | sed -En 's/. (rmnet_data[1-4])./ \1/p')" && ifconfig "$nic" | sed -En 's/. (240[89e][^\/]+)/。 /\1/p'

这个方法用在安卓手机上,比如手机在开启代理时,代理了IPv6流量,同时使用了随机虚拟网卡,导致通过接口获取的不是真实IP,而是代理IP,所以先通过ip route过滤路由,找到本机默认的网卡,再去打印匹配到真实的IPv6地址

@418667527
Copy link

418667527 commented Apr 22, 2024

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的:
可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3]  + "XXXX:XXXX:XXXX:XXXX" -join ':'}

@xfl12345
Copy link

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的: 可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3]  + "XXXX:XXXX:XXXX:XXXX" -join ':'}

我觉得你网关的 IPv6 配置有问题。按理来说被系统 Preferred 的临时 IPv6 地址都应该是有效的,因为系统就拿是它来上网冲浪的! 查看上网冲浪的 IPv6 地址: https://ipleak.net/ 建议检查一下命令 Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred 输出了什么。

@418667527
Copy link

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的: 可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3] + "XXXX:XXXX:XXXX:XXXX" -join ':'}

我觉得你网关的 IPv6 配置有问题。按理来说被系统 Preferred 的临时 IPv6 地址都应该是有效的,因为系统就拿是它来上网冲浪的! 查看上网冲浪的 IPv6 地址: https://ipleak.net/ 建议检查一下命令 Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred 输出了什么。

重新拨号了 输出的ip包含旧的前缀 当然不能用。

@xfl12345
Copy link

xfl12345 commented Apr 23, 2024

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的: 可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3] + "XXXX:XXXX:XXXX:XXXX" -join ':'}

我觉得你网关的 IPv6 配置有问题。按理来说被系统 Preferred 的临时 IPv6 地址都应该是有效的,因为系统就拿是它来上网冲浪的! 查看上网冲浪的 IPv6 地址: https://ipleak.net/ 建议检查一下命令 Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred 输出了什么。

重新拨号了 输出的ip包含旧的前缀 当然不能用。

动态PD前缀不适合开启 DHCPv6 的 statefull ,最好 stateless 。有些地区的运营商仍会为旧的PD前缀提供路由,所以我的话也不能说得太满。你这种情况只能是 stateless 。方便的话,加我 tg: xfl12345 ,为你提供远程支持。

更多参考: https://www.v2ex.com/t/829436

@418667527
Copy link

在win下也会由于会获取到旧ipv6地址导致不可用,个人通过阅读各位命令外加chatgpt写了一个新的: 可以获取最新ipv6地址 然后截取前4段再和其他设备Mac生成的后缀进行组合。

Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred | Select-Object -ExpandProperty IPAddress | ForEach-Object { $_.Split(':')[0..3] + "XXXX:XXXX:XXXX:XXXX" -join ':'}

我觉得你网关的 IPv6 配置有问题。按理来说被系统 Preferred 的临时 IPv6 地址都应该是有效的,因为系统就拿是它来上网冲浪的! 查看上网冲浪的 IPv6 地址: https://ipleak.net/ 建议检查一下命令 Get-NetIPAddress -AddressFamily IPv6 -PrefixOrigin RouterAdvertisement -SuffixOrigin Random -AddressState Preferred 输出了什么。

重新拨号了 输出的ip包含旧的前缀 当然不能用。

动态PD前缀不适合开启 DHCPv6 的 statefull ,最好 stateless 。有些地区的运营商仍会为旧的PD前缀提供路由,所以我的话也不能说得太满。你这种情况只能是 stateless 。方便的话,加我 tg: xfl12345 ,为你提供远程支持。

更多参考: https://www.v2ex.com/t/829436

可能是我表述的不清楚。路由器重新拨号,但是设备网卡没有重启,所以存在多个前缀不同的v6地址。我用这段命令可以正确获取最新v6前缀并使用。 感谢你的回复。

我还有另一个问题:我通过win上的ddns-go给我的小米10进行ddns。目前发现小米虽然会组成固定的后缀 ,但是并不是通过mac地址来生成。(路由器重新拨号的话不影响这个后缀)。如果重启手机的话会有一段新的后缀,我已经设置了使用真实mac来链接wifi。

@ATFieldBeast
Copy link

ATFieldBeast commented May 9, 2024

希望能有局域网内机器获取主路由公网IPv6地址的方案,,,🙏🙏🙏

我的主路由是华硕的,自带ddns,我的问题是这个自带的ddns会同时解析非公网的ipv4和公网的ipv6,但是使用wireguard的时候客户端用域名的话总是会解析成ipv4导致连接不上,所以用ddnsgo,dig华硕给的那个域名来获取主路由的ipv6地址
dig +short aaaa *******.asuscomm.com
再解析到我自己的域名,只有一条aaaa,这样就可以在客户端里ddns我的域名建立连接了

不知道对你有没有用

我也想直接用ip neigh来着,毕竟少一个故障点,但是好像看不到主路由的公网ipv6地址,只有个ipv4的网关地址和内网ipv6地址(而且主路由自己得到的ipv6前缀好像和分配下去的前缀并不一样,不懂能不能这样搞

@ATFieldBeast
Copy link

希望能有局域网内机器获取主路由公网IPv6地址的方案,,,🙏🙏🙏

#1107 更新了一下,应该能ssh到主路由的都能这样干了

@lurenJBD
Copy link

lurenJBD commented May 25, 2024

借助GPT 以及本人修改后的 Linux脚本,可以通过输入 mac 地址获取 对应的EUI-64格式 的IPv6 地址

#!/bin/bash

# 检查是否提供了MAC地址
if [ -z "$1" ]; then
    echo "通过MAC地址获取其他设备的IPv6地址"
    echo "使用方法: $0 <MAC地址>"
    exit 1
fi

mac=$1

# 验证MAC地址格式
if ! [[ $mac =~ ^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$ ]]; then
    echo "无效的MAC地址格式。请使用格式: XX:XX:XX:XX:XX:XX"
    exit 1
fi

# 提取以240开头并以/任意两位数字结尾的IPv6前缀
ipv6_prefix=$(ip -6 route | awk '{print $1}' | awk -F'/' '/^240.*\/[0-9][0-9]$/{print $1}' | head -n 1)

# 检查是否找到IPv6前缀
if [ -z "$ipv6_prefix" ]; then
    echo "没有找到以240开头并以/任意两位数字结尾的IPv6前缀"
    exit 1
fi

# 确保ipv6_prefix以冒号结尾
ipv6_prefix="${ipv6_prefix%::*}:"

# 将MAC地址分割为数组
IFS=':' read -r -a mac_array <<< "$mac"

# 转换为EUI-64格式
# 将第7位的二进制数反转 (翻转第7位)
mac_array[0]=$(printf "%02x" $(( 0x${mac_array[0]} ^ 0x02 )))

# 构建EUI-64标识符
eui64="${mac_array[0]}${mac_array[1]}:${mac_array[2]}ff:fe${mac_array[3]}:${mac_array[4]}${mac_array[5]}"

# 拼接完整的IPv6地址
ipv6_address="${ipv6_prefix}${eui64}"

# 输出完整的IPv6地址
echo "$ipv6_address"

实际使用(IPv6前缀隐藏了4位)

[root@localhost ~]# ./ipv6neigh.sh 62:c3:a5:8d:1b:63
2408:****:880:6e:60c3:a5ff:fe8d:1b63

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation keep
Projects
None yet
Development

No branches or pull requests