curl --resolve参数的作用

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
.cn 域名,1个 12个月
云解析DNS,个人版 1个月
简介: curl --resolve参数的作用

之所以会有这样的操作,是因为域名一般对应的都是一个反向代理,直接请求域名,反向代理会将流量随机选一台机器打过去,而无法确保所有的机器都可用。所以直接用ip。


curl 命令中,--resolve 参数用于指定自定义的主机名解析规则。通过使用 --resolve 参数,你可以将指定的主机名解析为指定的 IP 地址,并将该解析结果应用于 curl 请求中。

具体来说,--resolve 参数的语法如下:

curl --resolve <host:port:address> <URL>

其中:

  • <host:port> 是你希望自定义解析的主机名和端口号的组合。
  • <address> 是你希望将该主机名解析为的自定义 IP 地址。

通过指定 --resolve 参数,curl 将绕过标准的 DNS 解析过程,直接使用你提供的自定义 IP 地址来发送请求。这对于模拟特定的网络环境或测试特定服务器配置非常有用。

以下是一个示例:

curl --resolve example.com:80:127.0.0.1 http://example.com

上述命令将主机名 example.com 解析为 IP 地址 127.0.0.1,然后发送 HTTP 请求到 http://example.com。在这个示例中,--resolve 参数将请求定向到本地主机,绕过了标准的 DNS 解析过程。

请注意,--resolve 参数只影响当前 curl 命令的执行,不会修改系统的实际 DNS 解析规则。它仅用于在特定情况下进行临时的主机名解析定制。


之前在网易,经常用到这个命令

微信截图_20230925164723.png

curl --resolve 'brain-prd-jd.netease.im:443:xxx.xxx.xxx.xx' https://brain-prd-jd.netease.im/v1/whois/brain

即绕过DNS解析,直接将*brain-prd-jd.netease.im/v1/whois/br…


其实用--resolve参数, 和绑定host一样的效果:

微信截图_20230925164740.png

因为可能是m个域名,对应n个ip(n台机器),无论是挨个curl --resolve,还是修改host,都会很麻烦,写过一个检查绑定关系的工具:

package main
import (
  "context"
  "errors"
  "flag"
  "fmt"
  "net"
  "net/http"
  "strings"
  "time"
)
var (
  domain = flag.String("domain", "", "请输入域名列表,中间用英文逗号分隔")
  ip     = flag.String("ip", "", "请输入ip列表,中间用英文逗号分隔")
  whois  = flag.String("whois", "", "请输入whois地址,形如 /v1/whois/brain")
  method = flag.String("method", "GET", "HTTP 请求的方法,默认 GET")
  body   = flag.String("body", "", "HTTP 请求的 body,默认空")
)
const (
  ErrorColor = "\033[1;31m%s\033[0m" // red
  InfoColor  = "\033[1;32m%s\033[0m" // green
)
func main() {
  flag.Parse()
  domainStr := *domain
  ipStr := *ip
  checkPath := *whois
  if len(domainStr) == 0 || len(ipStr) == 0 || len(checkPath) == 0 {
    fmt.Printf(ErrorColor, "请输入域名,ip和检验地址\n")
    return
  }
  domainSli := strings.Split(domainStr, ",")
  ipSli := strings.Split(ipStr, ",")
  if len(domainSli) == 0 || len(ipSli) == 0 {
    fmt.Printf(ErrorColor, "请输入正确格式的域名和ip\n")
    return
  }
  //校验ip格式 (未校验域名格式)
  for _, v := range ipSli {
    ipItem := net.ParseIP(v)
    if ipItem == nil {
      fmt.Printf(ErrorColor, "ip格式错误\n")
      return
    }
  }
  for _, i := range domainSli {
    for _, j := range ipSli {
      if err := check(i, j, checkPath); err != nil {
        errmsg := fmt.Sprintf("域名:%s,ip:%s 错误:%#v\n", i, j, err)
        fmt.Printf(ErrorColor, errmsg)
        //return
      }
    }
  }
  fmt.Printf(InfoColor, "全部校验成功\n")
}
func check(domain, ip, checkPath string) error {
  dialer := &net.Dialer{
    Timeout:   30 * time.Second,
    KeepAlive: 30 * time.Second,
  }
  http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
    if addr == domain+":443" {
      addr = ip + ":443"
    }
    return dialer.DialContext(ctx, network, addr)
  }
  client := http.Client{Timeout: 5 * time.Second}
  req, err := http.NewRequest(*method, domain+checkPath, strings.NewReader(*body))
  if err != nil {
    return fmt.Errorf("NewRequest error: %w", err)
  }
  resp, err := client.Do(req)
  if err != nil || resp == nil {
    return errors.New("发生错误")
  }
  if resp.StatusCode != http.StatusOK {
    return errors.New("错误码非200")
  }
  msg := fmt.Sprintf("域名:%s,ip:%s,whois:%s 请求成功\n", domain, ip, checkPath)
  fmt.Printf(InfoColor, msg)
  return nil
}

可以直接通过

go run checkbind.go -domain https://域名1,https://域名2  -ip 119.147.xxx.xx,120.147.xxx.xx -whois /v1/whois/health_check来检测


使用 CURL 的“--resolve“选项将请求固定到 IP 地址

Golang将HTTP请求发往指定的IP

Golang force http request to specific ip (similar to curl –resolve)


目录
相关文章
|
3月前
|
机器学习/深度学习 前端开发 JavaScript
源映射错误:Error: request failed with status 404 源 URL:http://localhost:8080/bootstrap/js/axios-0.18.0.js
源映射错误:Error: request failed with status 404 源 URL:http://localhost:8080/bootstrap/js/axios-0.18.0.js
101 0
源映射错误:Error: request failed with status 404 源 URL:http://localhost:8080/bootstrap/js/axios-0.18.0.js
|
1月前
|
JavaScript 网络架构
vue 使用 this.$router.push 传参数,接参数的 query或params 两种方法示例
vue 使用 this.$router.push 传参数,接参数的 query或params 两种方法示例
16 4
|
2月前
es6 proxy的作用和用法
es6 proxy的作用和用法
13 5
|
3月前
|
存储 JavaScript 前端开发
js原生方法,获取url上面所有参数,并返回一个对象
JavaScript函数`getUrlParameters`用于从URL中提取所有参数并返回一个键值对对象。它接收URL,分割查询字符串,解码参数对,并存储在对象中。重复参数键会被存储为数组。
|
3月前
argparse的基本使用--参数解析
argparse的基本使用--参数解析
51 0
|
3月前
|
前端开发 JavaScript
return和reject、resolve的配合使用
return和reject、resolve的配合使用
87 0
|
12月前
|
JSON 数据格式
requests--传递参数
requests--传递参数
|
JSON PHP 数据格式
PHP中json传递请求字符串网址函数http_build_query()与parse_str(),将POST参数组转换拼接成GET请求链接
PHP中json传递请求字符串网址函数http_build_query()与parse_str(),将POST参数组转换拼接成GET请求链接
121 0
“‘nrm 不是内部或外部命令,也不是可运行的程序,nrm报错 [ERR_INVALID_ARG_TYPE] 解决方法
“nprm 不是内部或外部命令,也不是可运行的程序, 看到这个错误,我们一下子就能明白,啥原因不能使用命令呢,那肯定就是环境变量没有配置啦。不管是哪个命令,报这个问题都是环境变量没有配置好。
“‘nrm 不是内部或外部命令,也不是可运行的程序,nrm报错 [ERR_INVALID_ARG_TYPE] 解决方法
|
域名解析 Kubernetes 开发工具
执行yum install ntpdate ‐y报错Could not resolve host: download.example; 未知的名称或服务
执行yum install ntpdate ‐y报错Could not resolve host: download.example; 未知的名称或服务
650 0