推荐给开发人员的实用命令行工具

摘要:优秀的工具对于定位问题出在何处有着无可估量的价值,而且能在一开始就帮助我们阻止问题的出现,总的来说能使我们的工作更有效率。本文介绍了6个非常强大且灵活的工具,熟练使用这些工具能使你的生活变得更轻松一些。

作为一名Web开发者,当程序出现问题时日子总不是那么好过。问题可能无处不在,可能是你发送的请求出了错,可能是回复出了错,可能是你使用的某个第三方库出了问题,又或者是一个外部API调用失败了。优秀的工具对于定位问题出在何处有着无可估量的价值,而且能在一开始就帮助我们阻止问题的出现,总的来说能使我们的工作更有效率。命令行工具尤其有用,因为它们非常易于做自动化和脚本处理,能够以各种不同的方式进行组合和重用。本文介绍了6个非常强大且灵活的工具,熟练使用这些工具能使你的生活变得更轻松一些。

Curl

Curl是一个网络传输工具,同wget非常相似。主要的区别在于wget默认是保存到文件,而curl将输出定向到命令行上。这使得curl能非常方便的查看站点的内容。比如,我们可以从ifconfig.me站点得到我们本机的IP地址:

  1. $ curl ifconfig.me
  2. 93.96.141.93

Curl的-i(查看header)和-I(只显示header)选项使得调试HTTP响应以及查看服务器究竟发送给你了什么变得非常有用:

  1. $ curl -I news.ycombinator.com
  2. HTTP/1.1 200 OK
  3. Content-Type: text/html; charset=utf-8
  4. Cache-Control: private
  5. Connection: close

-L选项也很有用,能让curl自动跟踪重定向。Curl支持HTTP基本认证,cookies,手动设定headers以及更多有用的功能。

Ngrep

如果要分析网络数据包,我们有Wireshark,它有着上千种设定、过滤器以及配置选项。它还有一个命令行版本Tshark。如果只是针对简单的任务,我觉得Wireshark就太重量级了,所以除非我需要更强大的功能,一般情况下就用ngrep来处理了。Ngrep可以让你像类似grep处理文件的方式来处理网络封包。

针对Web流量,你几乎总是想要加上-W byline选项,这会保留换行符,而-q选项可以抑制某些非匹配数据包而产生的输出。下面是一个抓取所有包含有GET或POST请求数据包的例子:

  1. ngrep –q –W byline “^(GET|POST) .*”

你也可以传入附加的报文过滤选项,比如限制匹配的报文只针对某个特定的主机,IP或端口。这里我们把所有流经Google的流量做一个过滤,只针对80端口且报文中包含“search”。

  1. ngrep –q –W byline “search” host www.google.com and port 80

Netcat

Netcat或者叫nc,这是一个自称是网络中的瑞士军刀般的工具。它很简单但也非常强大和灵活,允许你创建任意的网络连接。这里我们来看看如何把它作为一个端口扫描器:

  1. $ nc –z example.com 20-100
  2. Connection to example.com 22 port [tcp/ssh] succeeded!
  3. Connection to example.com 80 port [tcp/ssh] succeeded!

除了能够创建任意的连接,Netcat还能够监听传入的连接。这里我们利用nc的这个功能再配合tar来快速有效的在服务器之间拷贝文件。在服务器端,运行:

  1. $nc –l 9090 | tar –xzf –

在客户端运行:

  1. $tar –czf dir/ | nc server 9090

我们可以使用Netcat把任何应用通过网络暴露出来,这里我们通过8080端口将shell暴露出来:

  1. $ mkfifo backpipe
  2. $ nc –l 8080 0<backpipe | /bin/bash > backpipe

现在我们可以通过任意一台客户机来访问服务器了:Linode

  1. $ nc example.com 8080
  2. uname –a
  3. Linux li228-162 2.6.39.1-linode34 ##1 SMP Tue Jun 21 10:29:24 EDT 2011 i686 GNU/Linux

尽管后面这两个例子有些投机取巧的成分(现实中你应该使用类似rsync这样的工具来拷贝文件,用SSH来远程登录服务器),它们还是展示出了Netcat的强大和灵活,通过结合netcat和其它的应用你可以实现很多不同的事情。

Sshuttle

Sshuttle允许你通过任意一台可SSH访问的服务器来为你的流量建立安全的隧道。搭建和使用都非常简单,不需要你在服务器上安装任何软件或者修改任何本地代理设定。当你在非安全的公共WiFi或其他不受信任的网络中时,通过SSH让流量走安全隧道,这样就可避免类似Firesheepdsniff这样的工具的侵扰。所有的网络通讯,包括DNS请求都会发送到你的SSH服务器:

  1. $ sshuttle –r <server> --dns 0/0

如果你提供了—daemon参数,sshuttle会以守护进程的形式在后台运行。结合一些其他的选项,你可以使用别名形式来简单快速的启动和停止安全隧道:

  1. alias tunnel=’sshuttle –D –pidfile=/tmp/sshuttle.pid –r <server> --dns 0/0’
  2. alias stoptunnel=’[[ -f /tmp/sshuttle.pid ]] && kill `cat /tmp/sshuttle.pid`’

你也可以使用sshuttle来解决一些基于IP的地理定位筛选的问题,如今有很多服务都在使用这种应用比如BBC的iPlayer就需要你在英国,还有Turntable,需要你在美国。要绕过这种限制,你需要访问到位于该国的某个服务器。Amazon在许多国家都有免费的E2C微实例,或者你也可以找一个便宜的vps,几乎世界上任何国家都有。

在这个例子中,我们不需要让所有的流量都走隧道,我们只需要针对目标服务的流量就行了。

不幸的是sshuttle只接受IP地址作为参数,不支持主机名,所以我们还得先用dig来解析出主机名。

  1. $ sshuttle –r <server> `dig +short <hostname>`

Siege

Siege是一个HTTP基准测试工具。除了负载测试功能外,它还有一个很方便的-g选项,这非常类似于curl的-iL,只是这里Siege也会输出请求header。这里是针对Google的一个例子(为了简洁我拿掉了一些header)

  1. $ siege -g www.google.com
  2. GET / HTTP/1.1
  3. Host: www.google.com
  4. User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
  5. Connection: close
  6. HTTP/1.1 302 Found
  7. Location: http://www.google.co.uk/
  8. Content-Type: text/html; charset=UTF-8
  9. Server: gws
  10. Content-Length: 221
  11. Connection: close
  12. GET / HTTP/1.1
  13. Host: www.google.co.uk
  14. User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
  15. Connection: close
  16. HTTP/1.1 200 OK
  17. Content-Type: text/html; charset=ISO-8859-1
  18. X-XSS-Protection: 1; mode=block
  19. Connection: close

Siege真正在行的是服务器的负载测试。就像ab(一款Apache HTTP服务基准测试工具)一样,你可以向站点发送并发请求,并查看它如何处理流量。用下面的命令,我们会在30秒内向Google发起20个并发连接,最后会得到一个漂亮的测试报告。

  1. $ siege -c20 www.google.co.uk -b -t30s
  2. ...
  3. Lifting the server siege... done.
  4. Transactions: 1400 hits
  5. Availability: 100.00 %
  6. Elapsed time: 29.22 secs
  7. Data transferred: 13.32 MB
  8. Response time: 0.41 secs
  9. Transaction rate: 47.91 trans/sec
  10. Throughput: 0.46 MB/sec
  11. Concurrency: 19.53
  12. Successful transactions: 1400
  13. Failed transactions: 0
  14. Longest transaction: 4.08
  15. Shortest transaction: 0.08

Siege最有用的一个特性是它可以把一个记录URL的文件作为输入,然后“点击”这些URL,而不是只处理一个单独的页面。这对于负载测试来说很有用,因为你可以对站点重现真实的流量并观察站点如何处理,而不必一遍又一遍重复点击同一个URL。下面是你用Siege来重现Apache对另一台服务器的日志记录,以做负载测试的例子:

  1. $ cut -d ‘ ‘ -f7 /var/log/apache2/access.log > urls.txt
  2. $ siege -c<concurrency rate> -b -f urls.txt

Mitmproxy

Mitmproxy是一个支持SSL的HTTP中间人代理工具,它允许你检查HTTP和HTTPS流量并支持直接改写请求。这个应用曾经在一些有关iOS应用的隐私丑闻中都出现过,包括Path的地址簿上传丑闻。它的直接改写请求的能力也被用来针对iOS平台,其应用包括在GameCenter中伪造一个虚假的高分数值

Mitmproxy可不只是用来查看移动应用发送了些什么内容或者是伪造几个高分数值那么简单。它同样可以为Web开发者解决很多问题。比如,之前我们需要不停点击F5键或者清除缓存才能保证看到最新的内容,现在你可以运行:

  1. $ mitmproxy --anticache

这样将自动去掉缓存控制相关的header,并确保你总是获取到刷新后的内容。不幸的是,这并不会像sshuttle那样自动为你设定转发功能,所以启动mitmproxy之后你还需要修改全局或者特定于浏览器的代理设置。

mitmproxy另一个非常给力的功能是记录并重现HTTP的交互过程。官方文档给出了一个关于无线网络登录的例子。同样的技术也能够用来作为基本的Web测试框架。比如,为了确认你的用户注册流程是否正常工作,你可以开启记录会话:

  1. $ mitmdump -w user-signup

然后跑一遍用户注册流程,目前为止应该能如预期般的工作。用Ctrl+C来停止记录。在任意时刻我们都能重现刚刚记录到的交互过程,并检查200状态码:

  1. $ mitmdump -c user-signup | tail -n1 | grep 200 && echo "OK" || echo "FAIL"

如果注册流程中的任意一点出了问题,我们将看到FAIL消息而不是OK。你可以创建一整套这类测试套件,并经常执行这类测试以确保当站点突然出现故障时你会得到提示。

时间: 2024-10-12 03:06:05

推荐给开发人员的实用命令行工具的相关文章

推荐给开发人员的6个实用命令行工具

推荐给开发人员的6个实用命令行工具 作为一名Web开发者,当程序出现问题时日子总不是那么好过.问题可能无处不在,可能是你发送的请求出了错,可能是回复出了错,可能是你使用的某个第三方库出了问题,又或者是一个外部API调用失败了.优秀的工具对于定位问题出在何处有着无可估量的价值,而且能在一开始就帮助我们阻止问题的出现,总的来说能使我们的工作更有效率.命令行工具尤其有用,因为它们非常易于做自动化和脚本处理,能够以各种不同的方式进行组合和重用.本文介绍了6个非常强大且灵活的工具,熟练使用这些工具能使你的

golang开发:类库篇(三)命令行工具cli的使用

为什么要使用命令行 觉得这个问题不应该列出来,又觉得如果初次进行WEB开发的话,可能会觉得所有的东西都可以使用API去做,会觉得命令行没有必要. 其实,一个生产的项目命令行是绕不过去的.比如运营需要导出报表.统计下付费用户.服务不稳定修改下订单状态等等,再者,命令行的工具基本都是内部使用,调试日志可以随意点,退一万步来说,即使有问题了,还可以再次修改.不像API是是随机性的,有些业务发生错误和异常是随机的.不可逆的. 怎么使用cli 这个主要看下使用案例就一目了然了. 首先下载类库包 go ge

linux 实用命令行工具

man手册页转换为pdf文档 man -t cmd | ps2pdf - cmd.pdf 搜索某个包 yum search package-name

Apache Commons CLI 开发命令行工具示例

概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提供了详尽的使用手册,有些还提供示例说明如何二次开发.然而关于如何开发一个易用.强壮的命令行工具的文章却很少.本文将结合 Apache Commons CLI,通过一个完整的例子展示如何准备.开发.测试一个命令行工具.希望本文对有相关需求的读者能有所帮助.      Apache Commons CL

【Windows10&nbsp;IoT开发系列】Powershell命令行实用程序

原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Administrator [new password]​ (其中 [new password] 表示你选择的强密码). 创建本地用户帐户: 如果你想要授予其他人访问你的 Windows IoT Core 设备的权限,你可以通过在 net user [username] [password] /add​ 中键

开发命令行工具的 12 个最佳实践

简评:设计良好的命令行应用是极富生产力的工具,本文介绍了开发命令行工具的 12 个最佳实践 CLI 是构建产品的绝佳方式,与 Web 应用不同的是它需要的时间更少,并且功能更强大.使用Web,你可以执行开发人员编写的任何操作,使用 CLI,你可以轻松地将多个工具混合在一起以执行更加高级的任务,而这需要更多的专业知识才能使用,但仍然适用于管理任务.高级用户任务或开发人员产品. 在 Heroku,我们提出了一种称为 「12-factor app」 的方法,这是一套旨在制作易于维护的优秀 Web 应用

【Vim】实用命令行

在vim中高亮关键字 syntax enable 可以高亮关键字:一般后面还要在跟一个syntax on打开语法高亮 syntax clear 清除关键字高亮 在secureCRT不是xterminal模式的时候,试了一下,没起作用啊,如果是xterminal模式的时候是会起作用的 在vim中查找 / 后面跟要查找的字符串:从当前光标位置向上搜索 ? 后面跟要查找的字符串:从当前光标位置向下搜索 n 找下一个 N 找上一个 清除并重画屏幕 [Ctrl+l]组合键 vim快捷键定制 对于键盘符号,

OSX: 安装打印机的实用命令行

其实很简单,就是实用lpadmin命令,下面给出一个例子: printername="YOUR_PRINTER_NAME" location="LOCATION INFO" gui_display_name="HP Color LaserJet M600 in Office for Example" address="ipp://printserver.yourcompany.org/YOUR_PRINTER_NAME" dr

Go使用flag包开发命令行工具

flag包是Go语言标准库提供用来解析命令行参数的包,使得开发命令行工具更为简单 常用方法 1.flag.Usage 输出使用方法,如linux下ls -h的帮助输出 2.flag.Type(参数名, 默认值, 使用提示) Type为类型 如String, Int, Uint 调用相应的flag.Sring flag.Int flag.Uint方法 方法返回相应类型的指针 3.flag.Type(指针, 参数名, 默认值, 使用提示) 与flag.Type方法基本相同,不同的是多一个指针参数,将