我使用的时候wget
,主机名解析没问题
root:here cd$ wget https://gfe.cit.api.here.com/1/layer_put.json?layer_id=123&app_id=x2&app_code=x1
结果是
Resolving gfe.cit.api.here.com... 52.51.134.116, 54.154.19.134, 52.208.9.155
Connecting to gfe.cit.api.here.com|52.51.134.116|:443... connected.
HTTP request sent, awaiting response... 400 Bad Request
2016-12-24 13:18:47 ERROR 400: Bad Request.
但是当我使用ping
ping https://gfe.cit.api.here.com/1/layer_put.json?layer_id=123&app_id=x2&app_code=x1
结果是
cannot resolve https://gfe.cit.api.here.com/1/layer_put.json?layer_id=123: Unknown host
wget
主机名解析失败,和之间有什么区别ping
?
答案1
回答:
在主机名解析方面,“ping”和“wget”有什么区别
Ping
需要 IP 地址或主机名作为参数。您给它一个完整的 URL,它尝试将其解析为主机名,但失败了。除了完全限定的命名剥离之外的所有内容,该ping
命令都能够检查连接(并且在我的以下测试中失败,可能是因为请求ICMP
被阻止或因为服务器已关闭):
$ ping gfe.cit.api.here.com
Pinging cle2-cit.eu-west-1.elasticbeanstalk.com [54.154.19.134] with 32 bytes of data:
Request timed out.
ping
有关和之间的一般区别wget
,请参阅亚历克的回答。
有关解释错误 400 的可能原因,请参阅 roaima 的一个。
答案2
回答您实际提出的问题。wget
需要一个 URL,但ping
需要一个主机名。您的 URL 由协议 ( https
)、主机名 ( gfe.cit.api.here.com
)、路径 ( /1/layer_put.json
) 和三个编码参数 ( )组成layer_id=123&app_id=x2&app_code=x1
。 URL 中还可能出现其他项目,例如身份验证和端口。
该命令仅接受主机名部分ping
。
然后,该wget
命令打开到协议所需端口的 TCP/IP 连接(443/tcp
在 的情况下https
),并使用 HTTP 协议从指定的 URL 检索内容。
该ping
命令使用 ICMP 发送平向指定主机发出请求,然后返回回显回复回复。这些分别是 ICMP 数据包类型 8 和 0。
现在,失败的根本原因wget
是您没有引用 参数wget
,因此 shell 会解析它。&
URL 中间的字符告诉 shell 在后台运行到该点为止的所有内容。然后它立即运行该行的其余两个部分,并立即出错。
在您的网址周围使用单引号,它可能会按您的预期工作。
所以我们有
wget -O layer_put.json 'https://gfe.cit.api.here.com/1/layer_put.json?layer_id=123&app_id=x2&app_code=x1'
ping -c3 gfe.cit.api.here.com
答案3
Wget 主要用于通过 HTTP、HTTPS 和 FTP 下载,因此默认情况下将使用 TCP 进行连接。 Ping 使用一种称为ICMP,这基本上是向主机说“你好”并查看它是否响应。 ICMP 不使用端口,这就是 http:// 的含义。它告诉“计算机“在端口 80 上打开连接”,对于 HTTPS 端口 443。由于 ICMP 不使用端口,因此 ping 只需要 IP 地址,但 wget 建立了 TCP 连接并下载文件。