简短的回答是:

简短的回答是:

如何获取自己的 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 grepto sedhead但这很少是必要的。当你看到它时,应该会发出一个危险信号,表明你正在接受经验不足的人的建议。这并不意味着“解决方案”是错误的。但是,它可能需要进行一些精简。

我选择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显示我的tun0VPN 和eth0LAN 都有。

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)

相关内容