哪个终端命令只获得IP地址而没有别的?

时间:2011-12-16 02:37:25

标签: shell unix ip-address

我正在尝试仅使用IP地址(inet)作为我编写的脚本中的参数。

在unix终端中是否有一种简单的方法来获取IP地址,而不是通过ifconfig查看?

32 个答案:

答案 0 :(得分:133)

您可以编写仅返回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

答案 1 :(得分:34)

这将为您提供所有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:]+'

答案 2 :(得分:31)

通常,系统永远不会保证只有一个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

此外,如果建立了有线和无线连接,当机器有多个以太网接口或存在VPN隧道时,获取IP地址将变为非确定性。

获取外部IP

如果您需要外部IP,则可以查询文本模式服务,例如curl ipecho.net/plain将返回纯文本外部 IP。

答案 3 :(得分:9)

hostname -I  

此命令将在Ubuntu中为您提供所需的确切IP地址。

答案 4 :(得分:9)

在最新的 Ubuntu 版本( 14.04 - 16.04 )上,此命令对我有用。

hostname -I | awk '{print $1}'

答案 5 :(得分:7)

如果环境有限,可以使用以下命令:

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1

答案 6 :(得分:4)

我们只需使用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

答案 7 :(得分:4)

删除了命令ifconfig,您应该在Linux上使用ip命令。

同样ip a会为您提供与IP相同的范围,因此更容易使用。

此命令将显示您的全局(外部)IP:

ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'

所有IPv4(也是127.0.0.1):

ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'

所有IPv6(也是:: 1):

ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'

答案 8 :(得分:3)

要仅获取 Mac OS X 上的IP地址,您可以输入以下命令:

ipconfig getifaddr en0

答案 9 :(得分:3)

我想要一些简单的东西作为Bash别名。我发现hostname -I最适合我(主机名v3.15)。由于某种原因,hostname -i返回环回IP,但hostname -I为wlan0提供了正确的IP,而无需通过grep或awk管道输出。缺点是hostname -I将输出所有 IP,如果您有多个

答案 10 :(得分:2)

您还可以使用以下命令:

ip route | grep src

注意: 仅当您可以连接互联网时,此功能才起作用。

答案 11 :(得分:2)

checkedContacts中,有一种更简单的方法可以自动排除回送IP,并仅显示所有分配给主机IP地址的空格分隔的列表:

holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        if (isChecked){
            checkedContacts.add(contact);
        } else {
            checkedContacts.remove(contact);
     }
    }

});

答案 12 :(得分:2)

这可以在Mac上做到这一点:

ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')

在我的机器中解析为ping 192.168.1.2

专家提示$(...)表示运行子shell中括号内的任何内容并将其作为值返回。

答案 13 :(得分:1)

这是我的版本,您可以在其中传递按优先级排序的接口列表:

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,则必须更换“#t; inet&#39;通过&#39; inet6&#39;。

答案 14 :(得分:1)

我不想在脚本中使用awk等。ip可以选择以JSON输出。

如果省略$interface,则将获得所有ip地址:

ip -json addr show $interface | \
  jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'

答案 15 :(得分:1)

我还没有看到nmcli的任何答案,它是用于控制NetworkManager的命令行工具。

所以你去:)

wolf@linux:~$ nmcli device 
DEVICE  TYPE      STATE        CONNECTION 
eth1    ethernet  unavailable  --         
eth0    ethernet  unmanaged    --         
lo      loopback  unmanaged    --         
wolf@linux:~$ 

如果您想从特定的网络接口获取信息(对于此示例,请说lo

wolf@linux:~$ nmcli device show lo
GENERAL.DEVICE:                         lo
GENERAL.TYPE:                           loopback
GENERAL.HWADDR:                         00:00:00:00:00:00
GENERAL.MTU:                            65536
GENERAL.STATE:                          10 (unmanaged)
GENERAL.CONNECTION:                     --
GENERAL.CON-PATH:                       --
IP4.ADDRESS[1]:                         127.0.0.1/8
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 127.0.0.0/8, nh = 0.0.0.0,>
IP4.ROUTE[2]:                           dst = 127.0.0.1/32, nh = 0.0.0.0>
IP6.ADDRESS[1]:                         ::1/128
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = ::1/128, nh = ::, mt = 256
IP6.ROUTE[2]:                           dst = ::1/128, nh = ::, mt = 0, >
wolf@linux:~$ 

但是由于您只想获取IP地址,因此只需将输出发送到grepcutawk

让我们一步一步地做。 (不知道出了什么问题,代码示例格式对于这3个示例均无效。)

  1. 获取IPv4行

    wolf @ linux:〜$ nmcli device show lo | grep 4.A IP4.ADDRESS [1]:127.0.0.1/8 wolf @ linux:〜$

  2. 使用awk来获取IP

    wolf @ linux:〜$ nmcli device show lo | awk'/4.A/ {print $ 2}' 127.0.0.1/8 wolf @ linux:〜$

  3. 使用cut删除CIDR表示法(/ 8)

    wolf @ linux:〜$ nmcli device show lo | awk'/4.A/ {print $ 2}'|切-d / -f1 127.0.0.1 wolf @ linux:〜$

有你的答案。

请注意,有很多方法可以使用我刚才演示的工具来实现。

让我们回顾一下我使用的命令。

nmcli device show lo | grep 4.A
nmcli device show lo | awk '/4.A/ {print $2}'
nmcli device show lo | awk '/4.A/ {print $2}' | cut -d / -f1

这3个命令的示例输出

命令1输出

IP4.ADDRESS[1]:                         127.0.0.1/8

命令2输出

127.0.0.1/8

命令3输出

127.0.0.1

答案 16 :(得分:1)

使用这一行脚本: 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&amp; linux(在ubuntu中测试)都可以。

答案 17 :(得分:1)

使用以下命令:

/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '

答案 18 :(得分:1)

最简单的方法如Mikko所说

hostname --all-ip-addresses

输出 enter image description here

你也可以这样做以获得更多细节:

ip route

输出 enter image description here

答案 19 :(得分:1)

我总是在最意想不到的时候最需要这个,并且最终会在SO上搜索这样的线程。所以我写了一个简单的脚本来通过netstat获取IPv4地址,称为echoip - you can find it here。网络地址的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

答案 20 :(得分:0)

默认路由的IPv4地址:

ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet )[^ /]+"

默认路由的IPv6地址:

ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet6 )[^ /]+"

这些仅需要命令ipgrep,并支持-P-ohead -1是必需的,因为当系统具有足够复杂的网络设置时,ip route可能会显示多个默认路由。

如果您不介意哪个IP,就可以这样做

ip route | grep -Po '(?<=src )[^ ]+'

hostname --all-ip-addresses

答案 21 :(得分:0)

如果您不想使用ifconfig或正则表达式...

ip addr | grep eth0 | grep inet | awk '{print $2}' | cut -d"/" -f1

答案 22 :(得分:0)

ip addr,捷径

ip -4 -br addr show enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1

或缩短

ip -4 -br a s enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1

必须适用于大多数现代 Linux 发行版

答案 23 :(得分:0)

这两种方式对我有用:

获取接口eth0的IP地址。将以下示例中的eth0替换为您的接口名称。 ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "

使用主机名: 这将为您提供inet,即您的etho的IPAddress。使用-I将为您提供所有存在此值的接口的inet值。

hostname -i

答案 24 :(得分:0)

几乎没有答案正在使用较新的ip命令(替换为ifconfig),因此以下是使用ip addrgrepawk的答案只需打印与wlan0接口相关联的IPv4地址:

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过滤掉不包含“ inet”(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,等等。

另请参阅https://unix.stackexchange.com/questions/119269/how-to-get-ip-address-using-shell-script

答案 25 :(得分:0)

仅打印eth0的IP地址,而不打印其他文本:

ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'

要确定您的主界面(因为它可能不是“ eth0”),请使用:

route | grep ^default | sed "s/.* //"

以上两行可以合并为一个命令,如下所示:

ifconfig `route | grep ^default | sed "s/.* //"` \
  | grep -Po '(?<=inet )[\d.]+'

答案 26 :(得分:0)

在经过NAT转换的主机上查找外部IP地址时,很多答案建议使用基于HTTP的方法,例如ifconfig.me,例如:

$ curl ifconfig.me/ip

这些年来,我看到了许多这样的网站,我发现这种基于DNS的方法更加可靠:

$ dig +short myip.opendns.com @resolver1.opendns.com

我的~/.bashrc中有这个方便的别名:

alias wip='dig +short myip.opendns.com @resolver1.opendns.com'

答案 27 :(得分:0)

select v.testid, max(v.score), min(v.score) max(v.TestTakenOn),
       max(case when seqnum_desc = 1 then resultid end) as resultid_max,
       max(case when seqnum_asc = 1 then resultid end) as resultid_min
from (select r.resultid, v.*,
             row_number() over (partition by v.testid order by v.score asc) as seqnum_asc,
             row_number() over (partition by v.testid order by v.score desc) as seqnum_desc
      from results r cross apply
           (values (Test_UK, TestUK_Scr, TestTakenOn),
                   (Test_US, TestUS_Scr, TestTakenOn)
           ) v(testid, score, TestTakenOn)
     ) v
group by v.testid;

答案 28 :(得分:0)

在Redhat 64bit上,这解决了我的问题。

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

答案 29 :(得分:0)

ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

显示所有ips

答案 30 :(得分:-1)

curl ifconfig.co 

只返回系统的IP地址。

答案 31 :(得分:-2)

我会使用Hostname -L来获取用作脚本变量的IP。