[译]开发者必知必会的命令行工具

翻译自:http://coding.smashingmagazine.com/2012/10/29/powerful-command-line-tools-developers/

第一次翻译外文。再结合我自己的经验,添加了一些内容。

在web开发过程当中,如果程序出现什么问题,就会比较麻烦,因为问题可能出现在任何环节,任何地方,可能是你发送的数据本身就有问题,也有可能是返回数据的问题,可能是请求第三方库或第三方API的造成的错误,关键是要找出问题到底出在哪个地方。

一个好的工具有几个作用:1、让你更加容易找出问题所在 2、避免一些访问的产生 3、帮助你更加高效地工作。由于命令行工具可以很方便地组合起来使用,并且有自动化和可重用的特点,有时候用命令行工具显得特别好用。这里我们介绍6个强大好用的命令行工具,帮助你更好地进行开发工作。

一、Curl

curl是一款网络工具,跟wget命令很类似,他们的主要区别在于wget默认将输出保存到文件,而curl则直接输出在终端上。相比之下,curl更加方便我们查看页面的内容。比如,我们通过访问网站 ifconfig.me 来获取我们当前的ip地址,利用curl实现如下:

$ curl ifconfig.me
93.96.141.93

curl有两个非常好用的选项,-i(查看http头信息),-I(只查看http头),如:

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

curl的 -L 选项,可以让它自动跟随跳转。

博主注:curl 的其它常用参数
-b 设置cookies,如 curl -b "PHPSESSID=87a5a03f89d09d49e4d10879917f135b"。
-d 设置post参数,如 curl -d "user=chm"。
-H 设置header,如 curl -H "X-FORWARDED-FOR:8.8.8.8" -H "CLIENT-IP:8.8.8.8"。
-D 将header头输出到文件,如 curl -s -d "__userlable__=${user_name}&type=login" -D cookies.txt
-F 以 multipart/form-data 的方式发送POST请求。-F参数以name=value的方式来指定参数内容,如果值是一个文件,则需要以name=@file的方式来指定。
如利用curl上传文件 curl -F "action=upload" -F "filename=@file.tar.gz" http://localhost/action.php

二、Ngrep

Wireshark是一款非常专业的网站抓包分析工具,它拥有上千种选项、配置、过滤等。同样也有命令行版本的抓包工具,比如TShark。对于一些简单的任务,Wireshark显得太重量级了,除非有非常强大复杂的需求,否则我一般选择 ngrep。ngrep差不多就是网络版本的grep,用起来就像grep用在文件内容过滤一样。

一般对http进行抓包的时候,都会用“-W byline” 这个参数,它可以解析换行,输出格式友好的信息。-q 参数表示安静模式,只输出匹配到的网络包内容。下面这个例示,我们抓取网络数据中包含 GET 或者 POST字符串的数据包。

ngrep -q -W byline "^(GET|POST) .*"

你也可以另一些额外的参数,以便更加精准地进行过滤。如指定域名,ip或者端口号。下面这个例子,只过滤发送到或者是来自于www.google.com的,指定端口为80,并且包含字符串“search”的网络数据。

ngrep -q -W byline "search" host www.google.com and port 80

 

=====================================
博主注
我经常用ngrep来抓取falsh音乐播放器的mp3文件下载地址:
sudo ngrep -d any -W byline -qwi  '.mp3'
效果比较好,不过也还有其它多种技术方法喽,这里不再赘述。

三、Netcat

Netcat,又叫 nc ,号称“瑞士军刀”,是一个简单但又非常强大的网络工具,主要用来创建各种网络连接,用途非常广泛。例如,我们可以用它作为一个端口扫描工具:

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

Netcat不仅可以扫描端口,还可以对指定端口进行监听。我们可以利用这个特性,将nc命令与tar命令结合起来,在两台主机之间高效而简洁地进行文件传输,我们只需要在服务主机上运行命令:

$ nc -l 9090 | tar -xzf -

然后在另一台主机上运行:

$ tar -czf dir/ | nc server 9090

利用nc,我们可以将任意程序映射到网络中,下面命令就把shell重定向到8080端口而公开:

$ mkfifo backpipe
$ nc -l 8080 0 backpipe

经过上面命令映射之后,我们就可以直接通过8080端口来连接shell:

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

然后最后两个例子的用法,一般都会用其它更加专业的命令来替代nc,如rsync用来文件传输,ssh用来shell连接。

四、Sshuttle

Sshuttle命令可以用来将你本地的网络通过ssh隧道进行转发,它安装与使用都非常简单,不需要你在服务器端安装额外的软件,也不需要更改本地的代理设置,只要你有一台ssh权限的服务器即可。

通过ssh转发后,你的网络就变得安全了,例如你处于不安全的公共wifi网络中时,就可以避免 Firesheep 和 dsniff 等工具的攻击。一切网络通讯,都可以通过ssh来进行转发,包含DNS解析在内:

$ sshuttle -r  --dns 0/0

“–daemon”参数会使 Sshuttle 以守护的方式运行在后台。你可以设置bash命令别名,从而很方便地开启、关闭ssh转发:

alias tunnel='sshuttle --D --pidfile=/tmp/sshuttle.pid -r  --dns 0/0'
alias stoptunnel='[[ -f /tmp/sshuttle.pid ]] && kill `cat /tmp/sshuttle.pid`'

你还可以利用sshuttle来绕过一些基于IP地域限制,从而使用相关服务,如BBC的iPlayer软件,你的IP必须在英国内才可以使用。我们只要通过位于英国的ssh服务器,利用ssh转发,来使你的IP在它看来,是位于英国的。这时候,你一般不需要将所有网络都进行转发,只需要将指定的服务转发即可。但是sshuttle不能使用域名,只能用IP地址,所以在使用sshuttle之前,我们要先用 dig 命令来将域名解析为IP地址:

$ sshuttle -r  `dig +short `

五、Siege

Siege是一款http压力测试工具,除了一些基本的压力测试特性外,它还有一个比较好用的-g参数,-g参数与curl的-i/-I参数类似,都显示出http响应头信息。下面以google为例(我已经删掉一些头信息):

$ siege -g www.google.com
GET / HTTP/1.1
Host: www.google.com
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
Connection: close

HTTP/1.1 302 Found
Location: http://www.google.co.uk/
Content-Type: text/html; charset=UTF-8
Server: gws
Content-Length: 221
Connection: close

GET / HTTP/1.1
Host: www.google.co.uk
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
Connection: close

HTTP/1.1 200 OK
Content-Type: text/html; charset=ISO-8859-1
X-XSS-Protection: 1; mode=block
Connection: close

Siege非常擅长于做压力测试,像apache的ab工具一样。你可以通过它向一网站发送并发请求,并观察服务器的响应情况。下面命令中,我们同时向google发送20个请求,并持续30秒时间,然后就会得到一个直观的统计:

$ siege -c20 www.google.co.uk -b -t30s
...
Lifting the server siege... done.
Transactions: 1400 hits
Availability: 100.00 %
Elapsed time: 29.22 secs
Data transferred: 13.32 MB
Response time: 0.41 secs
Transaction rate: 47.91 trans/sec
Throughput: 0.46 MB/sec
Concurrency: 19.53
Successful transactions: 1400
Failed transactions: 0
Longest transaction: 4.08
Shortest transaction: 0.08

Siege有一个很有用的特性,我们可以将很多url列表放文件里面,然后将该文件作为参数传给Siege,它就会指访问所有的url列表,在做压力测试的时候,这个用法显然是非常有用的,因为这种方式基本上相当于重现真实访问网站的请求,使测试的数据更加贴近真实。下面我们将apache日志里面的访问列表提取出来,然后利用Siege加载列表,进行压力测试:

$ cut -d ' ' -f7 /var/log/apache2/access.log > urls.txt
$ siege -c -b -f urls.txt

 

=================================
博主注:补充几个ab命令参数
我经常用ab做压力测试工具,几个常用参数:
-p 后加文件,文件里面为post的参数,如 pid=102
-T 指定content-type,如 ab -p post.txt -T "application/x-www-form-urlencoded"
-C 设置cookie,如 ab -C "PHPSESSID=c70d349634c566b1f5f5a12ef18860b9"

六、Mitmproxy

博主注:
这个东西我不太熟悉,所以下面也不翻译了,直接摘过来吧。怕我翻译出来跟原意差太大~~

Mitmproxy is an SSL-capable, man-in-the-middle HTTP proxy that allows you to inspect both HTTP and HTTPS traffic, and rewrite requests on the fly. The application has been behind quite a few iOS application privacy scandals, including Path’s address book upload scandal. Its ability to rewrite requests on the fly has also been used to target iOS, including setting a fake high score in GameCenter.

Far from only being useful to see what mobile applications are sending over the wire or for faking high scores, mitmproxy can help out with a whole range of Web development tasks. For example, instead of constantly hitting F5 or clearing your cache to make sure you’re seeing the latest content, you can run

$ mitmproxy --anticache

which will automatically strip all cache-control headers and make sure you always get fresh content. Unfortunately it doesn’t automatically set up forwarding for you like sshuttle does, so after starting mitmproxy you still need to change your system-wide or browser-specific proxy settings.

Another extremely handy feature of mitmproxy is the ability to record and replay HTTP interactions. The official documentation gives an example of a wireless network login. The same technique can be used as a basic Web testing framework. For example, to confirm that your user signup flow works, you can start recording the session:

$ mitmdump -w user-signup

Then go through the user signup process, which at this point should work as expected. Stop recording the session with Ctrl + C. At any point we can then replay what was recorded and check for the 200 status code:

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

If the signup flow gets broken at any point, we’ll see a FAIL message, rather than an OK. You could create a whole suite of these tests and run them regularly to make sure you get notified if you ever accidentally break anything on your site.