Answers:
您可以编写仅返回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
hostname -i
在我的身上它会返回:::1 127.0.1.1 192.168.1.100
hostname
不是便携式的。
这将为您提供所有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:]+'
grep -oP
busybox v1.24.1上的失败:无效选项-P
-P
为Perl正则表达式进行切换,否则我们将无法使用lookbehind (?<=inet\s)
令牌。您可以通过运行grep -oe 'inet [0-9\.]\+'
或获得类似的结果,grep -oe 'inet6 [0-9a-f:]\+'
但是通过这种方式,我无法摆脱第一个单词。在SuSE man grep
报告中,该-P
标志是实验性的。
ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
通常,永远不能保证系统只有一个IP地址,例如,您可以同时具有以太网和wlan连接,并且如果您具有活动的VPN连接,则将拥有另一个IP地址。
在Linux上,hostname -I
将列出当前IP地址。依靠它总是只返回一个IP地址在某些情况下(即VPN链接已建立)很可能无法按预期工作,因此一种更可靠的方法是将结果转换为数组,然后遍历元素:
ips=($(hostname -I))
for ip in "${ips[@]}"
do
echo $ip
done
在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
此外,如果同时建立了电缆和wifi连接,一台计算机具有多个以太网接口或存在VPN隧道,则获取IP地址变得不确定。
如果需要外部IP,则可以查询文本模式服务,例如curl https://ipecho.net/plain
将返回纯文本外部 IP。
获取外部IP的更快方法是查询已知的DNS服务器:
dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
在最新的Ubuntu版本(14.04-16.04)上,此命令对我有用。
hostname -I | awk '{print $1}'
print $1
可能会或可能不会给您正确的结果。
如果您的环境有限,则可以使用以下命令:
ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
。对于v4和v6:ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
ip -4 addr show eth0 | grep inet
执行以下操作:ip -4 addr show | grep 192
我们只需要简单地使用2个命令(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}'
要了解我们的公共/外部IP,请在 ~/.bashrc
whatismyip () {
curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}
然后跑 whatismyip
要仅打印的IP地址eth0
,而不打印其他文本:
ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'
要确定您的主接口(因为它可能不是“ eth0”),请使用:
route | grep ^default | sed "s/.* //"
以上两行可以合并为一个命令,如下所示:
ifconfig `route | grep ^default | sed "s/.* //"` \
| grep -Po '(?<=inet )[\d.]+'
我想要一个简单的东西作为Bash别名。我发现hostname -I
最适合我的主机名(主机名v3.15)。hostname -i
出于某种原因返回了回送IP,但hostname -I
为我提供了wlan0的正确IP,而不必通过grep或awk传递输出。缺点是,如果有多个IP,hostname -I
则会输出所有 IP。
在Mac上可以做到这一点:
ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')
ping 192.168.1.2
在我的机器上解决了。
专家提示:$(...)
表示运行子外壳程序中括号内的内容,并将其作为值返回。
在man hostname
一种更简单的方法中,它自动排除回送IP,并仅显示所有分配给主机ip地址的空格分隔的列表:
root@srv:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19
root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/void
inet 11.12.13.14/32 scope global venet0:0
inet 192.168.15.19/32 scope global venet0:1
几个答案似乎是使用较新的ip
命令(替代ifconfig
),所以这里是一个用途ip addr
,grep
以及awk
简单地打印与相关联的IPv4地址wlan0
的接口:
ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'
虽然不是最紧凑或花哨的解决方案,但(可以说)它很容易理解(请参阅下面的说明),并可以出于其他目的进行修改,例如像这样获得MAC地址的最后3个八位字节:
ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'
说明: ip addr show wlan0
输出与名为的网络接口关联的信息wlan0
,该信息应与此类似:
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
inet6 fe80::d340:5e4b:78e0:90f/64 scope link
valid_lft forever preferred_lft forever
接下来,grep inet
过滤掉不包含“ inet6” (IPv4和IPv6配置)grep -v inet6
的行,并过滤掉包含“ inet6” 的其余行,这将导致这样的一行:
inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
最后,第一个awk
提取“ 172.18.18.1/24”字段,第二个删除网络掩码的简写,仅保留IPv4地址。
另外,我认为值得一提的是,如果您正在编写脚本,那么通常会有许多功能更丰富和/或更强大的工具来获取此信息,您可能希望改用这些工具。例如,如果使用Node.js,则为ipaddr-linux
,如果使用Ruby,则为linux-ip-parser
,等等。
使用以下命令:
/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,则必须将“ inet”替换为“ inet6”。
我总是在最意想不到的时间需要这个,并且一定会在SO上寻找这样的线程。因此,我写了一个简单的脚本通过netstat获取IPv4地址,称为echoip
- 您可以在此处找到它。网络地址的重击看起来像这样,它也从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)}'
mac&linux(在ubuntu中测试)都可以。
ifconfig en0
或ifconfig eth1
等进行调用:)
我宁愿不要awk
在脚本中使用诸如此类,ip
也可以选择以JSON输出。
如果不进行操作,$interface
那么您将获得所有IP地址:
ip -json addr show $interface | \
jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
#!/bin/sh
# Tested on Ubuntu 18.04 and Alpine Linux
# List IPS of following network interfaces:
# virtual host interfaces
# PCI interfaces
# USB interfaces
# ACPI interfaces
# ETH interfaces
for NETWORK_INTERFACE in $(ls /sys/class/net -al | grep -iE "(/eth[0-9]+$|vif|pci|acpi|usb)" | sed -E "s@.* ([^ ]*) ->.*@\1@"); do
IPV4_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet addr[: ]+|inet[: ]+)' | sed -E "s@\s*(inet addr[: ]+|inet[: ]+)([^ ]*) .*@\2@")
IPV6_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet6 addr[: ]+|inet6[: ]+)' | sed -E "s@\s*(inet6 addr[: ]+|inet6[: ]+)([^ ]*) .*@\2@")
if [ -n "$IPV4_ADDRESSES" ] || [ -n "$IPV6_ADDRESSES" ]; then
echo "NETWORK INTERFACE=$NETWORK_INTERFACE"
for IPV4_ADDRESS in $IPV4_ADDRESSES; do
echo "IPV4=$IPV4_ADDRESS"
done
for IPV6_ADDRESS in $IPV6_ADDRESSES; do
echo "IPV6=$IPV6_ADDRESS"
done
fi
done
我将使用Hostname -L
IP来获取脚本中的变量。
hostname -i
还是hostname -I
?
user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$
1.资本H
错误2.没有-L