专栏首页大卫李的技术分享打造你自己的cURL命令

打造你自己的cURL命令

最近一直在Linux系统下玩些偏操作系统low-level的东西,发现有些常用的工具冷门功能不是自带的,需要从源代码开始自己编译一个版本。本篇就是给大家演示下如何从源代码编译出鼎鼎大名的网络调试命令行工具——cURL

目录

  • 缘起 问题来了 DIY解决方案

缘起

最近遇到一个测试场景:要在一个Nginx Docker容器内进行网络联通测试。常用的网络调试工具很多,如cURL、dig、nslookup等等。而在Nginx镜像里一般不会自带这些工具,当然,可以通过Dockerfile打造属于你的“瑞士军刀”版本的Nginx镜像。其实,Docker所在的Linux主机上一般都会自带这些工具了。那么有没有一种方法,可以直接利用Linux主机上的这些命令行工具,在容器内执行相关命令呢?

答案是,。那就是:ip netns exec(今天不是讲这个命令的背景的,感兴趣的童鞋可以自行Google)。有了这个命令我们可以这样在容器内执行cURL命令:

# 准备工作
nskey=$(docker inspect httptest -f "{{.NetworkSettings.SandboxKey}}")
mkdir -p /var/run/netns
ln -s $nskey /var/run/netns/dockercontainer
# 正式开始
ip netns exec dockercontainer ip a # 能看的到就是容器内的网络设备
ip netns exec dockercontainer curl www.baidu.com

问题来了

当你执行上面示例命令的最后一行,会发现执行失败:

> ip netns exec dockercontainer curl www.baidu.com
curl: (6) Could not resolve host: www.baidu.com

检查下这个ns里dns配置:

> ip netns exec httpserver cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "systemd-resolve --status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0

原来这个ns里的nameserver是用了本机的回环地址,由于在容器内,所以就无法进行域名解析了。认真阅读上文的信息,你会关注到systemd-resolved 这个东西,感兴趣的大家可以自行Google,这里,我尝试的是如下这个命令:

# 使用了--dns-servers这个参数,在执行命令时为curl指定name server
> ip netns exec dockercontainer curl --dns-servers 8.8.8.8 www.baidu.com
curl: (4) A requested feature, protocol or option was not found built-in in this libcurl due to a build-time decision.

执行报错了,错误信息显示–dns-servers 这个参数所需的lib模块没有在当前cURL编译时添加进去,果然没有这么简单。。。

DIY解决方案

既然默认的cURL没有自带这个命令,那么我们就造一个出来,发扬Geek精神。

我尝试了一遍,其实也没有那么复杂。大家可以follow下面的gist试试看。注意,在执行./configure 命令时,一定要把其他你需要的模块都添加上,不然就是捡了西瓜,丢了芝麻。

重新执行下如下命令,成功返回:

> ip netns exec dockercontainer curl-new --dns-servers 8.8.8.8 www.baidu.com <!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> ...此处略去若干行 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 调试你的BPF程序

    文章涉及的实验环境和代码可以到这个git repo获取: https://github.com/nevermosby/linux-bpf-learning

    nevermosby
  • Go语言开发调试入门

    虽然程序开发这门手艺已经发展了超过50年,调试代码依然是一种耗时间耗精力的工作,而使用得心应手的IDE,绝对是能节省大量开发人员宝贵的时间精力的,从而提高生活质...

    nevermosby
  • Ulysses使用初体验

    今天拿到了setapp试用机会,看到有Ulysses,很多人推荐说,这是专业写markdown的神器,赶紧下来试试。

    nevermosby
  • 笔记本电脑买苹果系统电脑好还是windows系统电脑好?

    首先是苹果系统的电脑,它的设计是有它独立风格的。但在我们国家绝大多数人都在使用Windows系统的电脑。无论是在学校还是家庭,windows系统占到非常大的比例...

    刘金玉编程
  • 张戈博客成功启用移动端主题:Mobile Pack

    建站以来,总是忙于 PC 端主题的折腾,移动端主题只是偷懒的使用了 WPtouch 插件。现在 PC 端主题已完善七七八八了,是时候折腾下移动端自适应主题了,毕...

    张戈
  • WordPress主题开发必备函数wp_list_categories获取分类列表

    WordPress主题开发必备函数wp_list_categories获取分类列表,将分类以列表的形式显示为链接。点击分类的链接,就可以访问该分类下的所有文章的...

    wordpress建站吧
  • 微信小程序结合腾讯地图获取用户所在城市信息

    实现小程序进去后会获取用户当前所在城市,然后显示该城市的数据,并且显示在导航栏和 Tab上。

    腾讯位置服务
  • Codeforces Round #622 (Div. 2)A~~C1

    用户7727433
  • 数据中心蓄冷系统选择-孙长青

    摘要:在数据中心的大型空调水系统中,为了达到连续制冷的功能,采用的措施主要是蓄冷技术。在Uptime 对于T4等级的数据中心要求里,明确要求了连续制冷功能;在其...

    数据中心DATACenter_PUE-POE
  • Python功能之反射

    py3study

扫码关注云+社区

领取腾讯云代金券