如何获取自己的 IP 地址并将其保存到 shell 脚本中的变量中?
答案1
我相信获取 ipv4 地址的“现代工具”方法是解析ip
而不是ifconfig
,所以它会是这样的:
ip4=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
ip6=$(/sbin/ip -o -6 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
或类似的东西。
答案2
为什么不简单地做呢IP=$(hostname -I)
?
答案3
如果您想考虑 wlan 和其他替代接口,那就不是那么容易了。如果您知道想要哪个接口的地址(例如,eth0,第一个以太网卡),您可以使用以下命令:
ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"
换句话说,获取网络配置信息,查找eth0
,获取该行和下一行 ( -A 1
),获取仅有的最后一行,用 分割时获取该行的第二部分:
,然后用空格分割时获取该行的第一部分。
答案4
我并不是想成为一个混蛋,但确实有一个正确的就是这样。您修剪 的输出ip route
以仅获取源 IP。根据您尝试访问的 IP,“我自己的 IP 地址”(OP 的话)会有所不同。如果您关心访问公共互联网,那么使用 Google 的 8.8.8.8 DNS 服务器是相当标准的。所以...
简短的回答是:
ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
这是详细的解释
如果我想要我使用的ip来到达互联网,我用这个:
pi@et3:~ $ ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
10.55.0.200
如果我想要使用我的 IP 来访问我的网站上的某些内容VPN,我用这个:
pi@et3:~ $ ip route get 172.31.0.100 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
172.29.0.9
下一篇实际上只是为了说明目的。但是,它应该可以在任何 Linux 系统上运行。因此,您可以用它来证明,是的,所有计算机始终都有多个 IP 地址。
如果我想要我使用的ip来到达我,我会用这个:
pi@et3:~ $ my_ip=$(getent hosts $(cat /etc/hostname) | awk '{print $1; exit}')
pi@et3:~ $ ip route get $my_ip | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
127.0.0.1
有关该sed
命令的更多信息
首先我要说的是,在选择unix工具时,尽量选择需要管道最少的工具。因此,虽然有些答案会通过管道传输ifconfig
到 to grep
to sed
,head
但这很少是必要的。当你看到它时,应该会发出一个危险信号,表明你正在接受经验不足的人的建议。这并不意味着“解决方案”是错误的。但是,它可能需要进行一些精简。
我选择sed
它是因为它比awk
. (我有一个下面的 awk 示例。)我认为除了这两个工具之外没有其他工具是合适的。
我们来看看有什么sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
作用:
sed # the sed executable located via $PATH
-n # no output unless explicitly requested
' # begin the command space
/src/ # regex match the string 'src'
{ # begin a block of commands **
s/ # begin a substitution (match)
.*src * # match anything leading up to and including src and any number of spaces
\([^ ]*\) # define a group containing any number of non spaces
.* # match any trailing characters (which will begin with a space because of the previous rule).
/ # begin the substitution replacement
\1 # reference the content in the first defined group
/ # end the substitution
p # print (explicitly, remember) the result
; # designate the end of the command
q # quit
} # end the block of commands
' # end the command space
** all of which will be performed "on match"
- otherwise only the first command to following the match would be performed "on match"
- any other commands would be performed whether there was a match or not
笔记:
我曾经使用过sed -n '/src/{s/.*src *//p;q}'
,但评论者指出,有些系统在src
字段后面有尾随数据。
使用 awk
ip route get 8.8.8.8 | \
awk '{gsub(".*src",""); print $1; exit}'
# or
ip route get 8.8.8.8 | \
awk '{for(i=1; i<NF; i++){if($i=="src"){i++; print $i; exit}}}'
有关我的网络的更多信息
我的ifconfig
显示我的tun0
VPN 和eth0
LAN 都有。
pi@et3:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.55.0.200 netmask 255.255.252.0 broadcast 10.55.3.255
inet6 fe80::71e6:5d7c:5b4b:fb25 prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:b2:96:84 txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 172.29.0.9 netmask 255.255.255.255 destination 172.29.0.10
inet6 fe80::3a8e:8195:b86c:c68c prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:e7:c3:d1 txqueuelen 1000 (Ethernet)