我试图在ANSI C(Linux)中以编程方式检索我的主机的本地域后缀.例如:我的机器是ironside.0ffnet.net,我想检索"0ffnet.net".
我已经看过许多帖子通过使用getnameinfo()和getaddrinfo()来解决这个问题,但是看起来这些函数从/ etc/hosts文件中提取了它们对于机器本地的任何接口地址的信息.
如果我的机器通过DHCP分配了一个地址(和相应的域后缀),则/ etc/hosts文件不会更新,而是将此信息存储在/etc/resolv.conf中,例如:
dfex@ironside:~/hush$cat /etc/resolv.conf
domain 0ffnet.net
search 0ffnet.net
nameserver 139.130.4.4
Run Code Online (Sandbox Code Playgroud)
因此,getnameinfo()和getaddrinfo()只需使用/ etc/hosts信息返回机器的主机名,不带后缀,如下所示:
dfex@ironside:~/hush$ cat /etc/hosts
::1 ironside localhost6.localdomain6 localhost6
127.0.1.1 ironside
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
Run Code Online (Sandbox Code Playgroud)
有没有人知道一个函数会在不诉诸system()调用的情况下获取这些信息?我一直在梳理Beej的指南而没有太大的成功.
我遇到了 BeautifulSoup(更具体地说是 xml 解析器)的问题,其中似乎将“名称”作为标签属性重载了一些底层函数。
鉴于以下代码:
#!/usr/bin/env python3
from bs4 import BeautifulSoup
siteconfig="""
<?xml version="1.0" encoding="utf-8"?>
<sites version="180201">
<site name="au" location="oceana">
<addresslist="IPv4">
<address>192.168.1.10/32</address>
<address>192.168.2.10/32</address>
</addresslist>
<addresslist="IPv6">
<address>fc00:07bc:5ae6:75d0::26/128</address>
<address>fc00:07bc:5ae6:75d1::26/128</address>
</addresslist>
</site>
<site name="us" location="americas">
<addresslist="IPv4">
<address>192.168.4.13/32</address>
<address>192.168.5.13/32</address>
</addresslist>
<addresslist="IPv6">
<address>fc00:07bc:5ae6:75d0::45/128</address>
<address>fc00:07bc:5ae6:75d1::45/128</address>
</addresslist>
</site>
</sites>
"""
soup = BeautifulSoup(siteconfig,"xml")
print(soup.find("site", name="us"))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Traceback (most recent call last):
File "./siteConfig.py", line 33, in <module>
print(soup.find("site", name="us"))
TypeError: find() got multiple values for argument 'name'
Run Code Online (Sandbox Code Playgroud)
但是,如果我将最后一行更改为:
print(soup.find("site", location="americas"))
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
<site location="americas" name="us">
<addresslist>="IPv4">
<address>192.168.4.13/32</address>
<address>192.168.5.13/32</address> …Run Code Online (Sandbox Code Playgroud)