Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash中公共IP地址的检测方法_Linux_Bash_Shell_Ubuntu_Centos - Fatal编程技术网

Linux bash中公共IP地址的检测方法

Linux bash中公共IP地址的检测方法,linux,bash,shell,ubuntu,centos,Linux,Bash,Shell,Ubuntu,Centos,作为安装脚本的一部分,我想对机器的IP地址进行“有根据的猜测”。它应该尽可能健壮,可以在各种主机和平台上工作。以下是一个例子: 此脚本使用3种方法,然后默认值为/etc/hostname。到目前为止,我只在Ubuntu上测试过这个。这可能适用于其他发行版吗?还有我可以添加的其他方法吗 curl ipinfo.io/ip 或 或 您想要多少公共IP?如果机器在NAT后面怎么办 curl/wget/netcat(nc),其中包含请求者的地址:大部分时间都可以工作,但可能无法从机器访问站点(无论

作为安装脚本的一部分,我想对机器的IP地址进行“有根据的猜测”。它应该尽可能健壮,可以在各种主机和平台上工作。以下是一个例子:

此脚本使用3种方法,然后默认值为
/etc/hostname
。到目前为止,我只在Ubuntu上测试过这个。这可能适用于其他发行版吗?还有我可以添加的其他方法吗

curl ipinfo.io/ip


您想要多少公共IP?如果机器在NAT后面怎么办

  • curl
    /
    wget
    /
    netcat
    nc
    ,其中包含请求者的地址:大部分时间都可以工作,但可能无法从机器访问站点(无论是防火墙还是临时/永久不可用)。您将获得尽可能多的公共IP

  • ifconfig
    :必须以root用户身份运行,否则您还必须尝试
    /sbin/ifconfig
    /usr/sbin/ifconfig
    。如果机器有更多NIC怎么办?你如何判断哪个IP是正确的?如果在机器的LAN上只使用IPv6会怎么样?在任何情况下,您都将获得尽可能少的公共IP(如果在机器上配置了更多接口,则可能是一个错误的IP-这通常是目前使用网络tap设备和/或虚拟化的无所不在的情况)

  • /etc/hostname
    :不需要存在,在许多系统上它是
    /etc/hostname
    ,它不包含IP地址,而应该包含主机名(通常是FQDN)


问题是,它可能失败的方式是多方面的,你可能应该考虑)更精确地指定你瞄准的是什么系统,或者B)你是否真的需要知道IP——是一个在简单的情况下工作的解决方案,当它在稍微复杂的设置中失败时,它值得使用。如果您认为您需要IP,请准备一种方法,以便在您根本没有IP或IP错误的情况下优雅地处理故障。

curl ifconfig.me
将是最好的选择,如果您没有curl:

wget-qO-ifconfig.me/ip

使用curl点击

curlhttp://shtuff.it/myip/short

如果您在nat或其他方面落后,则此解决方案不起作用。它在没有第三方服务的情况下很有用。如果机器上有连接(如服务器或ppp连接),它就可以工作

  • 这个问题的答案并不完全正确,但可能会帮助其他人(比如我)
  • 在大多数(或所有?)情况下需要根目录
您可以从
路由-n
获取(第一个)默认路由,找到它使用的接口,并找到它拥有的ip

MAINIF=$( route -n | grep '^0\.0\.0\.0' | head -n 1 | awk '{print $NF}' )
IP=$( ifconfig $MAINIF | { IFS=' :';read r;read r r a r;echo $a; } )
请尝试以下命令:

wget -O - -q icanhazip.com
使用API:

curl 'https://api.ipify.org?format=json'
Bash脚本:

#!/bin/bash

ip=$(curl -s https://api.ipify.org)
echo "My public IP address is: $ip"
仅使用bash(在来自的帮助下):

exec 3/dev/tcp/icanhazip.com/80
echo-e'GET/HTTP/1.0\r\n主机:icanhazip.com\r\n\r'>&3
当我读书的时候
做
[“$i”]&&myip=“$i”

完成如果在AWS EC2上,您可以使用:

curl checkip.amazonaws.com

注意:此服务可以从任何web客户端使用。

我使用IPGrab是因为它很容易记住

curl http://ipgrab.io

只要安装了curl,它就可以在任何发行版中使用。下面的答案
curl ifconfig.me
非常好。但是如果curl不可用或ifconfig.me站点不可用,我需要回退方法。@ruakh示例脚本的curl行中已经有
2>/dev/null
。这难道不能掩盖卷曲的错误吗?@Jeroen:哎呀,对不起,我不知怎么没看到。那没关系。:-)查看哪个脚本正在尝试各种DNS服务器和HTTP服务,直到得到答复。它使用
dig
curl
wget
(按该顺序),这取决于它在路径中找到的路径。截至2017年2月,服务器列表良好。脚本将以root用户身份运行。请随意建议从
ifconfig
:-)提取ip的更好方法@Jeroen我认为没有“更好”的方法:(-所有这些方法在某些方面都有缺陷(因此您无法获得100%的工作解决方案)。请参阅更新的答案。我不希望有完美的解决方案,我希望有一个聪明的猜测。用户以后仍然可以手动修改该值。谢谢,这些都很好。现在我只需要一个本地回退方法,以防在安装过程中这些主机不可用。该站点不好,请与
exec 3<>/dev/tcp/icanhazip.com/80 
echo -e 'GET / HTTP/1.0\r\nhost: icanhazip.com\r\n\r' >&3 
while read i
do
 [ "$i" ] && myip="$i" 
done <&3 
echo "$myip"
curl checkip.amazonaws.com
curl http://ipgrab.io