哪个terminal命令得到只是IP地址,没有别的?

我试图在我写的脚本中只使用IP地址(inet)作为参数。

有一个简单的方法在unixterminal获取IP地址,而不是通过查看ifconfig

你可以编写一个只返回IP的脚本:

 /sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}' 

对于MAC:

 ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2 

或者用于linux系统

 hostname -i | awk '{print $3}' # Ubuntu hostname -i # Debian 

一般来说,系统永远只能有一个IP地址,例如,你可以同时拥有以太网和wlan连接,如果你有一个活动的VPN连接,那么你将拥有另一个IP地址。

Linux的

在Linux上, hostname -I将列出当前的IP地址。 依靠它总是只返回一个IP地址很可能不会按照预期在某些情况下(即VPN链接),所以更可靠的方式将结果转换为数组,然后循环的元素:

 ips=($(hostname -I)) for ip in "${ips[@]}" do echo $ip done 

OSX

在OSX上, 如果你知道接口 ,你可以使用:

 ~$ ipconfig getifaddr en0 192.168.1.123 

这将返回IP地址。

或者你可以循环可能的接口名称,以后缀开头,即en

 for NUMBER in $(seq 0 5); do ip=`ipconfig getifaddr en$NUMBER` if [ -n "$ip" ]; then myip="$ip" break fi done echo $myip 

另外,如果build立了有线和无线连接,机器具有多个以太网接口或存在VPN隧道时,获取IP地址变得不确定。

获取外部IP

如果您需要外部IP,则可以查询文本模式服务,例如curl ipecho.net/plain会返回纯文本外部 IP。

这会给你所有的IPv4接口,包括环回127.0.0.1:

 ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}' 

这只会显示eth0

 ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}' 

这样你可以得到IPv6地址:

 ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+' 

只有eth0 IPv6:

 ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+' 

在最新的Ubuntu版本( 14.04 – 16.04 ),这个命令为我做了诡计。

 hostname -I | awk '{print $1}' 

在Mac OS X上,您可以键入ipconfig getifaddr en0以仅获取IP地址。

我们可以简单地使用两个命令(ifconfig + awk)来获得我们想要的IP(v4):

在Linux上,假设从eth0接口获取IP地址,请运行以下命令:

 /sbin/ifconfig eth0 | awk '/inet addr/{print substr($2,6)}' 

在OSX上,假设从en0接口获得IP地址,运行以下命令:

 /sbin/ifconfig en0 | awk '/inet /{print $2}' 

我想要一个简单的作为Bash别名的东西。 我发现hostname -I最适合我(主机名v3.15)。 hostname -i返回环回IP,由于某种原因,但hostname -I给我正确的IP为wlan0,而不必通过grep或awkpipe输出。 缺点是hostname -I会输出所有的 IP,如果你有多个IP的话。

主机名-I

将在Ubuntu中给你准确的IP地址

如果你的环境有限,你可以使用这个命令:

 ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1 

使用以下命令:

 /sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' ' 

这里是我的版本,你可以在其中传递一个接口列表,按优先顺序排列:

 getIpFromInterface() { interface=$1 ifconfig ${interface} > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep . } getCurrentIpAddress(){ IFLIST=(${@:-${IFLIST[@]}}) for currentInterface in ${IFLIST[@]} do IP=$(getIpFromInterface $currentInterface) [[ -z "$IP" ]] && continue echo ${IP/*:} return done } IFLIST=(tap0 en1 en0) getCurrentIpAddress $@ 

所以如果我连接VPN,Wifi和以太网,我的VPN地址(在tap0接口上)将被返回。 这个脚本可以在linux和osx上运行,如果你想覆盖IFLIST,可以使用参数

请注意,如果您想使用IPV6,则必须用“inet6”replace“inet”。

我总是在最令人意想不到的时间需要这个,而且,毫无疑问地,在SO上search这样的线程。 所以我写了一个简单的脚本来通过netstat获取IPv4地址,叫做echoip 你可以在这里find它 。 networking地址的bash看起来像这样,它也从ipecho.net得到您的公共地址:

 IPV4='\d+(\.\d+){3}' INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1` INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"` for i in "${!INTERFACES[@]}"; do printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}" done 

echoip脚本产生这样的输出:

 $ echoip public: 26.106.59.169 en0: 10.1.10.2 

使用这一行脚本: ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' mac&linux(在ubuntutesting过)都可以。

net lookup * host_name *

 # net lookup localhost 127.0.0.1 

我想这会为你工作。

在红帽64bit,这对我来说解决了问题。

 ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }' 

这会在Mac上做的伎俩:

 ping $(ifconfig en0 | awk '$1 == "inet" {print $2}') 

这解决了在我的机器上ping 192.168.1.2

专家提示$(...)意味着在子shell中的括号内运行任何内容,并将其作为值返回。

我会使用Hostname -L来获取IP作为脚本中的variables。

 ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}' 

显示你所有的ips