将IP地址放入bash变量.有没有更好的办法

44 bash

我正在尝试找到一种简短而强大的方法将我的IP地址放入bash变量中,如果有更简单的方法可以做到这一点,我很好奇.这就是我目前的做法:

ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[a-z]*:/''/'`
Run Code Online (Sandbox Code Playgroud)

Tux*_*Sax 69

我一直在努力解决这个问题,直到我发现这是一个简单的命令

hostname -i
Run Code Online (Sandbox Code Playgroud)

就这么简单!

  • 在我的情况下,ip无法解决,我不得不将ip提供给eth1私有接口,所以我做了`hostname -I | cut -f2 -d''` (7认同)
  • 请注意,这不适用于OSX.唯一的`hostname`选项是`-fs` (6认同)
  • 实际上,所有“主机名”提示/答案很可能在除**GNU的**“主机名”实现之外的任何其他实现上失败,因为在几乎所有其他实现上,该工具旨在“设置”主机名而不是查找有趣的内容事物。据我所知,这包括 OSX、*BSD、Solaris 以及可能更多。 (2认同)
  • 我有多个IP!结果:`192.168.0.77 192.168.2.77 192.168.1.77 172.17.0.1` (2认同)

use*_*001 58

man hostname建议使用--all-ip-addresses 标志(简写-I),而不是-i,因为-i只有在可以解析主机名时才有效.所以这里是:

hostname  -I
Run Code Online (Sandbox Code Playgroud)

如果您只对初级产品感兴趣,cut那么:

hostname  -I | cut -f1 -d' '
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“-I”的手册页说_不要对输出的顺序做出任何假设。_ (3认同)

Syn*_*hro 37

ip是一个正确使用的工具,ifconfig已经被弃用了一段时间了.这是一个awk/sed/grep-free命令,比这里发布的任何其他命令快得多!:

ip=$(ip -f inet -o addr show eth0|cut -d\  -f 7 | cut -d/ -f 1)
Run Code Online (Sandbox Code Playgroud)

(是的,这是第一次之后的逃逸空间-d)


wol*_*ajr 25

你可以看看这个网站的替代品.

一种方法是:

ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'
Run Code Online (Sandbox Code Playgroud)

稍微小一点,虽然它根本不健壮,并且可以根据您的系统返回错误的值:

$ /sbin/ifconfig | sed -n '2 p' | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)

(来自http://www.htmlstaff.org/ver.php?id=22346)

  • `ifconfig`在Linux上已经被弃用了(但不是在BSD上)并且自2001年以来一直没有更新!所有应该使用iproute2命令来获取网络信息,例如`ip a` (2认同)

Mat*_*w G 11

ifdata命令(在moreutils包中找到)提供了一个接口,可以轻松检索ifconfig数据,而无需手动解析ifconfig的输出.它是通过一个命令实现的:

ifdata -pa eth1
Run Code Online (Sandbox Code Playgroud)

eth1网络接口的名称在哪里.

我不知道在没有安装ifconfig时这个包的行为如何.正如Syncrho在他的回答中所说,ifconfig已经被弃用了一段时间,并且在很多现代发行版中都找不到了.

  • 是!这应该是正确的答案.非常感谢您展示这个优秀且非常需要的实用程序. (4认同)

Jot*_*tne 10

以下是将设备的IP地址转换为变量的最佳方法:

ip=$(ip route get 8.8.8.8 | awk 'NR==1 {print $NF}')
Run Code Online (Sandbox Code Playgroud)

NB更新以支持新的Linux版本.(适用于较旧的)

ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')
Run Code Online (Sandbox Code Playgroud)

为什么它是最好的?

  1. Hostname -I 有时候只获得IP或者我的VPS获得 127.0.0.2 143.127.52.130 2a00:dee0:ed3:83:245:70:fc12:d196
  2. Hostnmae -I 不适用于所有系统.
  3. 使用ifconfig可能并不总是给你喜欢的IP.
    一个.如果你有多个接口(wifi/etcernet)等,它将失败
    .主IP可能不在第一个找到的接口上
  4. eth0如果接口具有VPS服务器中的其他名称,则搜索可能会失败wifi

    ip route得8.8.8.8

尝试获取Googles DNS服务器的路由和接口(不打开任何会话)
然后,ip如果您愿意,可以轻松获取或接口名称.

这也可以用于获取ip多端网络上主机的接口地址


小智 8

我的简短版本.当你有多个接口并且只想要主ip时很有用.

host `hostname` | awk '{print $4}'
Run Code Online (Sandbox Code Playgroud)

  • 使用“print $NF”(最后一个字段)而不是“print $4”可能会稍微更稳健。 (2认同)

gle*_*man 5

您可以使用 awk 来完成 ifconfig 的所有解析:

ip=$(ifconfig | gawk '
    /^[a-z]/ {interface = $1}
    interface == "eth0" && match($0, /^.*inet addr:([.0-9]+)/, a) {
        print a[1]
        exit
    }
')
Run Code Online (Sandbox Code Playgroud)