我在 shell 中,我想知道主機名稱對應的 IP 位址。
我知道我可以透過 Perl、PHP、Python 或許多其他腳本語言(甚至可能是 awk!)來獲取它,這將是我的解決方法,但令我驚訝的是似乎沒有命令列工具可以做到這一點,沒有簡單的包裝getaddrinfo()
。
我錯了嗎?有嗎?host
,dig
並且getent
不算,我想要一些使用 libc 並根據/etc/nsswitch.conf
,以及默認情況下可能安裝在任何(linux)系統上的東西。
答案:我錯了,getent
並不專門查找/etc/hosts
,它實際上進行了正確的查找。
答案1
進行主機名稱查找的傳統工具是bind 中的nslookup,但它正在被dig 取代。這兩個工具都是特定於 dns 的,並且不使用 nsswitch。 getent Hosts 使用 nsswitch,但使用較少。
答案2
getent
無疑是適合這項工作的工具,但不幸的是它並不是在任何地方都可用,原因之一是 POSIX 不強制要求未定義它。
另一方面,雖然標準沒有指定它,但arp
它不太可能在任何進行名稱解析的伺服器上不可用。如下設置,僅使用arp
,在任何 Linux/Unix 系統上可用,並提供在實現之間似乎一致的輸出,解析其輸出即可完成工作:nsswitch.conf
libc
$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16
以下是使用此方法的 shell 函數,避免了 Linux arp 在某些極端情況下切換到不同輸出格式的問題:
resolve()
{
: ${1:?Usage: resolve name}
(
PATH=$PATH:/usr/sbin
ao=$(arp $1)
[ "$(echo "$ao"|grep HWaddress)" ] && ao=$(arp -a $1)
echo "$ao" | sed -e 's/.*(//' -e 's/).*$//'
)
}