linux 如何获取一个接口的IP

vnjpjtjt  于 2023-11-17  发布在  Linux
关注(0)|答案(8)|浏览(126)

当我尝试ifconfig它给了我整个所有的信息有关的网络适配器.
我试探着:

system( "ifconfig -a | grep inet | "
          "sed 's/\\([ ]*[^ ]*\\)\\([ ]*[^ ]*\\).*$/\\1 \\2/' "
          " > address.txt" ) ;

字符串
输出两个IP:

inet  addr:17.24.17.229
  inet  addr:127.0.0.1


但是我只需要第一个,我怎么才能过滤掉这个。

raogr8fs

raogr8fs1#

您可以使用head,但是...
当然,我可能弄错了,但我的猜测是,你并不真的需要第一个。
您可能正在查找连接到网关(或Internet)的主机。
据我所知,IP地址或接口的顺序是未指定的
你到底想达到什么目的?
如果您想知道哪个接口“连接到互联网”,更可靠的方法是找到具有默认路由的接口(使用route),然后使用ifconfig <interface>直接获得正确的IP地址。

yk9xbfzb

yk9xbfzb2#

您可以减少grephead的使用

ifconfig -a | sed -nr -e '/inet\b/{s|^.*inet\s+addr:(.[^ \t]*).*|\1|;h}' -e '${x;p}'

字符串

mm5n2pyu

mm5n2pyu3#

我会使用iproute2ip

ip -o addr show dev eth0 | while read IFNUM IFNAME ADDRTYPE ADDR REST; do [ "$ADDRTYPE" == "inet" ] && echo $ADDR; done
9.87.65.43/21

字符串
(Not只是因为它更容易解析,但它也会显示例如辅助IP,这是ifconfig不能的。

6xfqseft

6xfqseft4#

不要看所有的适配器,只要你想要的。

system( "ifconfig -a eth0 | grep inet | "
          "sed 's/\\([ ]*[^ ]*\\)\\([ ]*[^ ]*\\).*$/\\1 \\2/' "
          " > address.txt" ) ;

字符串

r3i60tvu

r3i60tvu5#

如果ifconfigip的输出发生变化,程序将中断。
为什么不直接使用SIOCGIFCONFioctl()并从源代码获取它呢?
ETA:假设任何给定的系统只有一个以太网接口和一个以太网地址也是不安全的。

clj7thdc

clj7thdc6#

ifconfig eth0怎么样?

n9vozmp4

n9vozmp48#

要在Linux中获取单个接口(eth0)的IP地址,请执行以下操作:
ip address show dev eth0
您可以使用IP正则表达式通过grep进行管道传输,并仅选择找到的第一个地址:
ip a show dev eth0 | grep -oP '(?:\b\.?(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){4}' | head -1
此设备可能有多个IP地址与之关联,因此您可能必须根据您想要选择的地址调整| head -1位。您还必须过滤掉广播地址。

相关问题