哪个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