curl --resolve参数的作用

news2024/11/16 13:30:17

之所以会有这样的操作,是因为域名一般对应的都是一个反向代理,直接请求域名,反向代理会将流量随机选一台机器打过去,而无法确保所有的机器都可用。所以直接用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 解析规则。它仅用于在特定情况下进行临时的主机名解析定制。


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

alt

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

即绕过DNS解析,直接将https://brain-prd-jd.netease.im/v1/whois/brain这个请求,指向xxx.xxx.xxx.xx这个ip所对应的机器


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

alt

因为可能是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)

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode-中等题】2. 两数相加

文章目录 题目方法一&#xff1a;借助一个进制位&#xff0c;以及更新尾结点方法一改进&#xff1a;相比较第一种&#xff0c;给head一个临时头节点&#xff08;开始节点&#xff09;&#xff0c;最后返回的时候返回head.next&#xff0c;这样可以省去第一次的判断 题目 方法一…

Java-继承和多态(上)

面向对象思想中提出了继承的概念&#xff0c;专门用来进行共性抽取&#xff0c;实现代码复用。 继承(inheritance)机制&#xff1a;继承主要解决的问题是&#xff1a;共性的抽取&#xff0c;实现代码复用。 继承的语法 在Java中如果要表示类之间的继承关系&#xff0c;需要借助…

2 hadoop的目录

1. 目录结构&#xff1a; 其中比较的重要的路径有&#xff1a; hdfs,mapred,yarn &#xff08;1&#xff09;bin目录&#xff1a;存放对Hadoop相关服务&#xff08;hdfs&#xff0c;yarn&#xff0c;mapred&#xff09;进行操作的脚本 &#xff08;2&#xff09;etc目录&#x…

docker之 Consul(注册与发现)

目录 一、什么是服务注册与发现&#xff1f; 二、什么是consul 三、consul 部署 3.1建立Consul服务 3.1.1查看集群状态 3.1.2通过 http api 获取集群信息 3.2registrator服务器 3.2.1安装 Gliderlabs/Registrator 3.2.2测试服务发现功能是否正常 3.2.3验证 http 和 ng…

Seaborn绘制热力图的子图

Seaborn绘制热力图的子图 提示&#xff1a;如何绘制三张子图 绘制的时候&#xff0c;会出现如下问题 &#xff08;1&#xff09;如何绘制1*3的子图 &#xff08;2&#xff09;三个显示条&#xff0c;如何只显示最后一个 提示&#xff1a;下面就展示详细步骤 Seaborn绘制热力…

虾皮shopee国际站区域根据ID取商品详情 API 返回值说明

虾皮shopee国际站区域根据ID取商品详情 API 数据代码如下&#xff1a; item_get-根据ID取商品详情 shopee.item_get 公共参数 名称类型必须描述技术交流18179014480keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;API接口接入secretString是调用密钥a…

数据结构(Java实现)-包装类和泛型

包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了 一个包装类型。 基本数据类型和对应的包装类 装箱和拆箱 装箱操作&#xff0c;新建一个 Integer 类型对象&#xff0c;将 i 的…

css选择器,只有第一个不加边框,其余都加

我们在开发中&#xff0c;经常会遇到这样的场景&#xff1a; 要给除了第一个以外的其他元素添加样式&#xff0c;那么我们通过css选择器就可以做到这一点&#xff0c;往下看吧&#xff01; 1. 示例代码 2. 效果展示

Transformer模块(Restormer)

由一个MDTA模块和一个GDFN模块组成一个Transformer Block 我们看一下代码实现&#xff1a; class TransformerBlock(nn.Module):def __init__(self, dim, num_heads, ffn_expansion_factor, bias, LayerNorm_type):super(TransformerBlock, self).__init__()self.norm1 Laye…

C++ - C++11

文章目录 1. std::initializer_list2. decltype3. 左值引用和右值引用4. 完美转发(模板中的&&万能引用)5. 类的新功能6. 可变参数模板7. lambda表达式8. 包装器 1. std::initializer_list 内置类型 int main() {/* 内置类型 */int x1 1;int x2 { 2 };int x3{ 3 };i…

经管博士科研必备【6】Gumbel分布

关于Gumbel分布的相关知识也可以参考: 1.3.6.6.16. Extreme Value Type I Distribution Chapter 4 The Multinomial Logit Model | A Self-Instructing Course in Mode Choice Modeling 1.什么是Gumbel分布 在推导MNL模型(Multinomial Logit)、NL(Nested Logit)模型前,我…

dvwa xss通关

反射型XSS通关 low难度 选择难度&#xff1a; 直接用下面JS代码尝试&#xff1a; <script>alert(/xss/)</script>通关成功&#xff1a; medium难度 直接下面代码尝试后失败 <script>alert(/xss/)</script>发现这段代码直接被输出&#xff1a; 尝试…

Python爬虫框架之Selenium库入门:用Python实现网页自动化测试详解

概要 是否还在为网页测试而烦恼&#xff1f;是否还在为重复的点击、等待而劳累&#xff1f;试试强大的Selenium&#xff01;让你的网页自动化测试变得轻松有趣&#xff01; 一、Selenium库到底是什么&#xff1f; Selenium 是一个强大的自动化测试工具&#xff0c;它可以让你直…

OLED透明屏水波纹效果:打造独特的显示体验

OLED透明屏水波纹效果是一种独特的显示技术&#xff0c;通过模拟水波纹的视觉效果&#xff0c;为用户带来更加生动逼真的观感。 根据市场调研报告显示&#xff0c;OLED透明屏水波纹效果已经在广告、游戏和商业领域得到广泛应用&#xff0c;为品牌提供了新的展示方式&#xff0…

Git想远程仓库与推送以及拉取远程仓库

理解分布式版本控制系统 1.中央服务器 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地也就是在你的笔记本或者计算机上。⽽我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢? 那我们多人…

java八股文面试[多线程]——为什么要用线程池、线程池参数

速记7个&#xff1a; 核心、最大 存活2 队列 工厂 拒绝 线程池处理流程&#xff1a; 线程池底层工作原理&#xff1a; 线程复用原理&#xff1a; 知识来源&#xff1a; 【并发与线程】为什么使用线程池&#xff0c;参数解释_哔哩哔哩_bilibili 【并发与线程】线程池处理流程…

【⑮MySQL | 视图】概述 | 创建 | 查看 | 更新 | 修改 | 删除

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL视图概述 | 创建 | 查看 | 更新 | 修改 | 删除的分享✨ 目录 前言1.视图概述2.创建视图3.查看视图4.更新视图数据5.修改视图6.删除视图总结 1.视图概述 1.1 为什么使用视图&#xff1f; 视图一方面可以帮我们使…

【Acwing91】最短Hamilton路径详细题解

题目描述 题目分析 首先我们来分析暴力做法&#xff0c;此时最大需要遍历&#xff08;n20&#xff09;20个顶点的排列方式&#xff0c;总共计算的次数为20!&#xff0c;数量级远远大于10^8&#xff0c;显然是不合理的。 此时&#xff0c;我们可以对上述dfs遍历的众多情况进行…

SpringBoot项目在启动后自动关闭

问题描述&#xff1a; 今天搭建了一个SpringBoot项目&#xff0c;但是在启动之后就自行关闭了&#xff0c;就像下面这样&#xff1a; 原因分析&#xff1a;在创建SpringBoot项目的时候&#xff0c;Web的依赖没有导入&#xff0c;默认以普通java项目运行导致的终止。 解决方案…

【Tkinter系列01/5】界面初步和布局

一、说明 一般来说&#xff0c;界面开发中&#xff0c;如果不是大型的软件&#xff0c;就不必用QT之类的实现&#xff0c;用Tkinter已经足够&#xff0c;然而即便是Tkinter规模不大&#xff0c;也需要一个系统专业的学习过程&#xff0c;本篇将是对Tkinter系列介绍的一篇博文。…