我需要从外壳脚本中找到我的外部IP地址。目前,我使用此功能:
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
但是这取决于perl-libwww
,perl-html-format
,perl-html-tree
安装。我还能通过哪些其他方式获取我的外部IP?
我需要从外壳脚本中找到我的外部IP地址。目前,我使用此功能:
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
但是这取决于perl-libwww
,perl-html-format
,perl-html-tree
安装。我还能通过哪些其他方式获取我的外部IP?
Answers:
我建议直接从DNS服务器获取它。
以下所有其他大多数答案都涉及通过HTTP到达远程服务器。其中一些需要解析输出,或者依赖于User-Agent标头使服务器以纯文本格式响应。这些更改非常频繁(更改名称,放置广告,更改输出格式等)。
dig @resolver1.opendns.com ANY myip.opendns.com +short
也许为您加上别名,bashrc
这样很容易记住
alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'
使用简单的IP地址回复:
$ wanip
80.100.192.168 # or, 2606:4700:4700::1111
(从https://ss64.com/bash/dig.html缩写):
usage: dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]
q-type one of (A, ANY, AAAA, TXT, MX, ...). Default: A.
d-opt ...
+[no]short (Display nothing except short form of answer)
...
q-opt one of:
-4 (use IPv4 query transport only)
-6 (use IPv6 query transport only)
...
该ANY
查询返回类型或者AAAA级或A记录。要专门选择IPv4或IPv6连接,请相应地使用-4
或-6
选项。
要要求响应为IPv4地址,请将ANY替换为A
;对于IPv6,请将其替换为AAAA
。注意,它只能返回用于连接的地址。例如,通过IPv6连接时,它无法返回A地址。
除了OpenDNS,Akamai和Google还提供类似的DNS服务:
$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168
$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"
专门要求IPv4地址的示例别名:
alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'
$ wanip4
80.100.192.168
对于IPv6:
alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'
$ wanip6
2606:4700:4700::1111
如果命令由于某种原因无法使用,则上游提供程序,命令行工具或其他可能存在问题。为了帮助理解为什么它不起作用,请运行不带+short
选项的命令以显示DNS查询的详细信息。例如:
$ dig @resolver1.opendns.com ANY myip.opendns.com
;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR
;; QUESTION SECTION:
;myip.opendns.com. IN ANY
;; ANSWER SECTION:
myip.opendns.com. 0 IN AAAA 2606:4700:4700::1111
;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011
myip.opendns.com
Google的公共DNS中有与之等效的功能吗?
curl http://canhazip.com
。参见askubuntu.com/a/427092/2273
注:这是关于外部 IP地址(一个,当你连接到他们在互联网上的服务器见) -如果你想内部 IP地址(一个你自己的计算机使用的连接,这可能是不同的)看到这回答。
dig +short myip.opendns.com @resolver1.opendns.com
或使用externalip:
externalip dns
curl -s http://whatismyip.akamai.com/
或使用externalip:
externalip http
curl -s https://4.ifcfg.me/
或使用externalip:
externalip https
使用nc
命令:
nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4
或使用externalip:
externalip telnet
使用telnet
命令:
telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4
echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'
或使用externalip:
externalip ftp
externalip dns
externalip http
externalip https
externalip telnet
externalip ftp
不同的服务器有很多选项可以提供外部IP,尤其是通过此处或其他地方发布的HTTP提供外部IP。
我做了一个基准,看看它们中的任何一个是否比其他的都要好,我对结果感到惊讶。例如,最受推荐的ifconfig.me之一对我而言几乎始终是最慢的,有时需要花费几秒钟来响应。许多服务器不能通过HTTPS进行工作,或者可以通过证书无效而工作。有些响应时间不一致。
这是我使用的externalip-benchmark脚本的来源:
您可以自己运行它,看看这里提到的哪些服务值得使用:
wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark
我在2015年4月3日从华沙获得的结果-地址已更改,以保护无辜者:
最佳http响应时间:
0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'
最佳https响应时间:
0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''
(注意:有些内容空白的快速响应-无效。)
最佳平均ping时间:
10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/
以下是我于2015年4月3日从阿姆斯特丹获得的结果:
最佳http响应时间:
0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'
最佳https响应时间:
0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''
最佳平均ping时间:
1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/
(999999 ping表示100%的数据包丢失。)
为了进行比较,以下是其他方法所花费的时间-在2015年6月16日由华沙和阿姆斯特丹进行了测试。
使用:
time dig +short myip.opendns.com @resolver1.opendns.com
通常(实际挂钟时间)大约为:
实际上,可以使用这种方式使用四个解析器:
在华沙和阿姆斯特丹,它们的响应时间都相同,但在其他地区却并非如此。
使用208.67.222.222-resolver1.opendns.com的IP而不是域名的速度更快:
但如果IP更改,将来可能无法使用(尽管对于知名的DNS解析器来说不太可能-也许我应该在我的externalip脚本中使用IP- 请发表评论)。
使用nc
或telnet
命令进行Telnet (请参见上文)通常需要:
(nc
和telnet
命令之间没有明显的区别。)
当使用IP地址代替给定服务的域名时,所有方法都会更快(尤其是首次运行时)(除非HTTP可以使用基于主机的虚拟服务器并且不能与裸IP一起使用-未测试),但是当服务更改IP地址时,它将停止工作,因此速度可能更快,但不能满足未来需求。
如果您从自己的位置看到一些有趣的结果,或者您认为应该推荐其他主机而不是我选择的主机,请发表评论。如果缺少任何重要服务,请在GitHub上发表评论或发布问题。我想通过最新选择的性能最佳的服务来使该帖子保持最新。
myip.opendns.com
按照Krinkle的回答对DNS方法进行了基准测试?当前,由于不知道此方法的其他提供者,因此默认情况下是赢家,但与其他方法进行比较仍然很有用。
dig +short myip.opendns.com @resolver1.opendns.com
(36.86.63.180),dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short
(118.98.115.34)和curl http://canhazip.com
(36.71.64.71)会得到不同的结果。如何确定哪一个是正确的?
curl -s http://whatismijnip.nl |cut -d " " -f 5
用荷兰工作地点替换了一个地点。
-s
在这种情况下是否真的需要该选项?我在我的fedora 15-bash 4.2.10(1)中尝试使用/不使用它,并且它以两种方式工作。
您可以使用ifconfig.me替代whatismyip.org。
curl -s http://ifconfig.me
另外ifconfig.me还有一些其他功能。要了解您还能收到什么其他信息,请访问网站。
亚马逊AWS
curl https://checkip.amazonaws.com
样本输出:
123.123.123.123
我喜欢它因为:
我更喜欢使用curlmyip.com,就像这样简单:
curl curlmyip.com
记住起来很简短。
bash
OP的意图,您不能没有-s
其他答案中提到的选项。
-s
交换机所做的所有操作均在无提示模式下运行,即。错误消息将不会显示。因此,这取决于他希望脚本如何处理错误。该命令本身将返回与使用一样可靠的IP地址-s
。
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
wget icanhazip.com
可以工作。
| tail -n1
部分,看看您从代理那里得到什么
netcat icanhazip.com 80
。看起来它忽略了$http_proxy
和朋友,因为仅使用指定代理和端口会-x
导致挂起过程。
netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1
用于基本的HTTP代理(假设它在端口3128上运行)。不过,您显然会获得代理的IP地址。
Host:
请求标头-基于名称的虚拟主机是HTTP 1.1的主要改进之一。更改请求以指定HTTP / 1.1,或删除Host标头(我建议使用前者)。
如果在阅读了所有这些建议之后,您还想阅读更多,这里可能是过度设计的Bash脚本。
它包含一个DNS和HTTP服务器列表,截至2017年2月,它们似乎可以正常运行。
如果您有dig
,它将首先尝试DNS,这比各种HTTP服务快将近一个数量级。
它在收到第一个答复时退出。
如果没有,dig
或者所有DNS服务器都失败了,那么它将尝试HTTP服务,直到得到答复。
服务器按字母顺序列出,但在使用前先进行了混洗,以避免始终使用同一服务器。
#!/bin/bash
## Get my external IP
timeout=2 # seconds to wait for a reply before trying next server
verbose=1 # prints which server was used to STDERR
dnslist=(
"dig +short myip.opendns.com @resolver1.opendns.com"
"dig +short myip.opendns.com @resolver2.opendns.com"
"dig +short myip.opendns.com @resolver3.opendns.com"
"dig +short myip.opendns.com @resolver4.opendns.com"
"dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com"
"dig +short -4 -t a whoami.akamai.net @ns1-1.akamaitech.net"
"dig +short whoami.akamai.net @ns1-1.akamaitech.net"
)
httplist=(
4.ifcfg.me
alma.ch/myip.cgi
api.infoip.io/ip
api.ipify.org
bot.whatismyipaddress.com
canhazip.com
checkip.amazonaws.com
eth0.me
icanhazip.com
ident.me
ipecho.net/plain
ipinfo.io/ip
ipof.in/txt
ip.tyk.nu
l2.io/ip
smart-ip.net/myip
tnx.nl/ip
wgetip.com
whatismyip.akamai.com
)
# function to shuffle the global array "array"
shuffle() {
local i tmp size max rand
size=${#array[*]}
max=$(( 32768 / size * size ))
for ((i=size-1; i>0; i--)); do
while (( (rand=$RANDOM) >= max )); do :; done
rand=$(( rand % (i+1) ))
tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
done
}
## if we have dig and a list of dns methods, try that first
if hash dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
eval array=( \"\${dnslist[@]}\" )
shuffle
for cmd in "${array[@]}"; do
[ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
ip=$(timeout $timeout $cmd)
if [ -n "$ip" ]; then
echo $ip
exit
fi
done
fi
# if we haven't succeeded with DNS, try HTTP
if [ ${#httplist[*]} == 0 ]; then
echo "No hosts in httplist array!" >&2
exit 1
fi
# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);
if [ -z "$curl_or_wget" ]; then
echo "Neither curl nor wget found. Cannot use http method." >&2
exit 1
fi
eval array=( \"\${httplist[@]}\" )
shuffle
for url in "${array[@]}"; do
[ "$verbose" == 1 ] && echo Trying: $curl_or_wget "$url" 1>&2
ip=$(timeout $timeout $curl_or_wget "$url")
if [ -n "$ip" ]; then
echo $ip
exit
fi
done
用法示例(我称为脚本myip
):
$ myip
Trying: dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"
$ ip=$(myip); echo "IP = '$ip'"
Trying: dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'
注释掉verbose
脚本顶部的变量,以避免打印使用的服务器。
更新:该脚本现在也在Github上,我可以在需要时对其进行更新:https :
//github.com/mivk/myip
如果要使用HTTPS避免某些潜在的陷阱,请执行以下操作:
_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
这总是对我有用,我用它来获取我的IP地址。
wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'
amazonaws
。也就是说,如果您无法通过Google进行搜索。(甚至没有lynx
)。
由于我不依赖连接或服务,因此我使用以下代码,该代码尝试使用不同的服务来获取IP(随意添加更多):
# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)
while [ -z "$IP" ] # If no IP found yet, keep trying!
do
sleep 30
IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$(( RANDOM % ${#arr[@]} ))]})
done
echo -n "$IP" > /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP"
要增加鲁棒性(例如,如果一项服务更改了其格式),则可以$IP
使用以下功能来检查该IP是否有效:
# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
exit 1;
elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
exit 1;
else
for OCTET in `echo $1 | tr '.' ' '`; do
if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
exit 1;
elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
exit 1;
fi
done
fi
return 0;
}
ifcfg.me支持:
curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me
IPv4和IPv6,甚至还有更多东西:ifcfg.me/?
dig +short . @ifcfg.me
如果您愿意的话可以使用
我为家人提供了云服务,我做了这个快速脚本,cron
每天早上5点运行,因为我很便宜,不会购买静态IP。
它获取公共IP,并将其通过电子邮件发送给我的用户。以超链接格式发送电子邮件,因此妈妈不必键入端口或其他任何内容。也许其他人可以使用它。
#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);
echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s "From your friendly cloud service provider" user1@someemail.com, user2@ect.com
我已经设置了将IP地址返回为JSON / XML或纯文本的服务。你可以在这里找到他们
与/ json和/ xml相同的URL也将为您提供其他格式
如果需要HTTPS,则可以使用带有https前缀的相同URL。好处是,即使您使用的是Wifi上网,您也会获得公共地址。
因此,简单的别名myip =“ curl https://ipof.in/txt ”将获取您的IP
或者,您可以使用STUN,该发明是自动回答此问题的,并且已广泛用于Internet通信中,例如SIP和WebRTC。
使用stunclient(在debian / ubuntu上apt-get install stuntman-client
)仅需执行以下操作:
$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541
A.B.C.D
您的计算机在本地网络上的IP地址在哪里,是W.X.Y.Z
像从外部看到的网站(以及您正在寻找的地址)那样的IP地址服务器。使用,sed
您可以将上面的输出减少为一个IP地址:
stunclient stun.services.mozilla.com |
sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"
对于仅使用基本命令行工具的替代STUN查找,请参见 我在AskUbuntu上的回答(旨在作为一种有趣的练习,而不用于生产用途)。
使用curl击打shtuff.it的IP服务
curl -s https://shtuff.it/myip/short
即使在转换DNS地址的NAT路由器后面也使用DNS请求,这可以起作用:
$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t
或者,您可以改用HTTP请求方法:
$ curl -s ipinfo.io/ip
x.y.z.t