[关闭]
@breakerthb 2017-06-06T02:59:43.000000Z 字数 3639 阅读 2126

NetCat (nc) 命令

Linux


NetCat,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小)、功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。

1. 版本

通常的Linux发行版中都带有NetCat(简称nc),甚至在拯救模式光盘中也由busybox提供了简版的nc工具。但不同的版本,其参数的使用略有差异。

$ type -a nc
	nc is /usr/bin/nc
	$ rpm -q nc
nc-1.10-22

建议在使用前,先用man nc看看帮助。这里以红旗DC Server 5.0上的1.10版本进行简单说明。
假设两服务器信息:

server1: 192.168.10.10
server2: 192.168.10.11

2. 端口检查

2.1 检查指定端口

$ nc -v -w 10 [IP] -z [PORT]

-v  显示指令执行过程
-w  <超时秒数>设置等待连线的时间
-u  表示使用UDP协议
-z  使用0输入/输出模式,只在扫描通信端口时使用

Demo : 扫描指定的8080端口

$ nc -v -w 10 -z 192.168.0.100 8080
Connection to 192.168.0.100 8080 port [tcp/http] succeeded!

2.2 端口扫描

扫描20到25的端口范围

$ nc -v -w 2 192.168.10.11 -z 21-24
nc: connect to 192.168.10.11 port 21 (tcp) failed: Connection refused
Connection to 192.168.10.11 22 port [tcp/ssh] succeeded!
nc: connect to 192.168.10.11 port 23 (tcp) failed: Connection refused
nc: connect to 192.168.10.11 port 24 (tcp) failed: Connection refused

2.3 批量检测

服务器指定端口开放情况:

1、假如我们要监控一堆指定的IP和端口,可新建一个文件(第1列服务器IP,第2列要监控的端口)。

$ cat /scripts/ip-ports.txt

192.168.0.100 80
192.168.0.100 8081
192.168.0.101 8082
192.168.1.100 21

2、我们可以写这样一个脚本来批量检测端口是否开放:

$ cat /scripts/ncports.sh

#!/bin/bash
#检测服务器端口是否开放,成功会返回0值显示ok,失败会返回1值显示fail

cat /scripts/ip-ports.txt | while read line
do
  nc -w 10 -z $line > /dev/null 2>&1
      if [ $? -eq 0 ]
  then
    echo $line:ok
      else
        echo $line:fail
  fi
done

3. 远程拷贝文件

从server1拷贝文件到server2上。

3.1 监听

在server2上,监听运行:

$ nc -l 1234 > text.txt

3.2 传输文件

server1上运行:

$ nc 192.168.10.11 1234 < text.txt

注:server2上的监听要先打开

4. 克隆硬盘或分区

操作与上面的拷贝是雷同的,只需要由dd获得硬盘或分区的数据,然后传输即可。

克隆硬盘或分区的操作,不应在已经mount的的系统上进行。所以,需要使用安装光盘引导后,进入拯救模式(或使用Knoppix工具光盘)启动系统后,在server2上进行类似的监听动作:

$ nc -l -p 1234 | dd of=/dev/sda

server1上执行传输,即可完成从server1克隆sda硬盘到server2的任务:

$ dd if=/dev/sda | nc 192.168.10.11 1234

完成上述工作的前提,是需要落实光盘的拯救模式支持服务器上的网卡,并正确配置IP。

5. 保存Web页面

$ while true; do nc -l -p 80 -q 1 < somepage.html; done

6. 模拟HTTP请求

6.1 GET请求

提交GET请求,服务器域名为http://www.test.com/。先自己生成个1.txt,写入一些内容:

GET /cgi-bin/webdist.cgi?distloc=;ls HTTP/1.1
Host: 170.168.1.11
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: ASPSESSIONIDAQDBSAQA=LDABJFEDGCCINNBJMHNNPKDI

注意:内容必须以两个空行结尾。这符合rfc2616的标准,否则不会被正确解码的。

$ nc http://www.test.com/ 80 < 1.txt

这个GET请求就发送出去了。你可以完完全全的主机区构造header和data,任何的都可以。

6.2 POST请求

POST /scripts/nsiislog.dll HTTP/1.1
Host: www.test.com
Content-Length: 16758
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: ASPSESSIONIDAQDBSAQA=LDABJFEDGCCINNBJMHNNPKDI
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

然后记住,method要大写就好了:GET,POST,HEAD,SEARCH

7.聊天

nc还可以作为简单的字符下聊天工具使用,同样的,server2上需要启动监听:

server2上启动:

$ nc -lp 1234

server1上传输:

$ nc 192.168.10.11 1234

这样,双方就可以相互交流了。使用Ctrl+D正常退出。

8. 传输目录

从server1拷贝nginx-0.6.34目录内容到server2上。需要先在server2上,用nc激活监听,

server2上运行:

$ nc -l 1234 | tar xzvf -

server1上运行:

$ tar czvf - nginx-0.6.34 | nc 192.168.10.11 1234

9. 用nc命名操作memcached

1)存储数据:printf “set key 0 10 6rnresultrn” |nc 192.168.10.11 11211
2)获取数据:printf “get keyrn” |nc 192.168.10.11 11211
3)删除数据:printf “delete keyrn” |nc 192.168.10.11 11211
4)查看状态:printf “statsrn” |nc 192.168.10.11 11211
5)模拟top命令查看状态:watch “echo stats” |nc 192.168.10.11 11211
6)清空缓存:printf “flush_allrn” |nc 192.168.10.11 11211 (小心操作,清空了缓存就没了)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注