nc(netcat)工具使用说明加案例

原创
2020/03/29 21:45
阅读数 6.1K

[TOC]

nc工具

Linux常用命令行太多了,重开一个

说明

nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具

  • 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
  • 端口的扫描,nc可以作为client发起TCP或UDP连接
  • 机器之间传输文件
  • 机器之间网络测速
  • 所以ssh等可以把nc当代理用

常用参数

  1. -l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
  2. -p <port> 设置本地主机使用的通信端口,暂未用到。
  3. -s 指定发送数据的源IP地址,适用于多网卡机
  4. -u 指定nc使用UDP协议,默认为TCP
  5. -v 输出交互或出错信息,新手调试时尤为有用
  6. -w 超时秒数,后面跟数字
  7. -z 表示zero,表示扫描时不发送任何数据.据说与-l选项一起使用会有错误
  8. -n 直接使用IP地址,而不通过域名服务器。
  9. -o <输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
  10. -i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
  11. -4 使用IPV4
  12. -6 使用IPV6
  13. -X 指定协议数字,4:socks4. 5:socks5. connect:https. 如果不写默认为socks5.
  14. -x 指定请求的地址

NC常用案例

服务端启动一个Server服务(默认tcp),监听999端口

nc -l 999
  • 使用nc来做连接
nc -vz -w 5 127.0.0.1 999
或
nc -vzw 5 127.0.0.1 999
  • 使用telnet来做连接
telnet 127.0.0.1 999
  • 使用nc来扫描端口-监测端口是否存在
nc -z -v 127.0.0.1 999 998 997

服务端起一个server同时监听两个端口

nc -l 999 &
nc -l 998 &
  • 客户端同时扫描两个端口
nc -vzw 5 127.0.0.1 998-999

服务端起一个udp的server监听999端口

nc  -ul  999

使用http协议请求百度

nc www.baidu.com 80
GET / HTTP/1.1
Host:www.baidu.com
如果在这里再敲一下回车,NGINX返回响应信息.如果还有其他报文,可以这里继续往下写.
注释:
	回车完成整个请求,这个牵扯到http协议和NGINX,http协议本无此规定.
	但是在使用nc连接NGINX服务时,在连接后胡乱写信息,然后敲一下回车NGINX就会返回信息(感觉就像完全发送了报文).
	但是如果使用nc连接NGINX后,在连接后从头码http协议头,敲回车只会进入下一行.只有在报文最后的空行中敲回车(也就是说在发送报文时,要在报文中最后添加一个空行)NGINX此时才会响应信息.为什么会这样呢? 根据HTTP协议规定,HTTP header和报文主体之间通过空行来分隔;所以NGINX肯定不会随意断开正规的http报文.

百度响应信息:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 14615
Content-Type: text/html
Date: Mon, 23 Sep 2019 08:18:09 GMT
Etag: "5d7f08a7-3917"
Last-Modified: Mon, 16 Sep 2019 03:59:35 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=D819D9F7C8824C4D33D33634265EA137:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=D819D9F7C8824C4D33D33634265EA137; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1569226689; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1

<!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">
	<link rel="dns-prefetch" href="//s1.bdstatic.com"/>
	<link rel="dns-prefetch" href="//t1.baidu.com"/>
	<link rel="dns-prefetch" href="//t2.baidu.com"/>
	<link rel="dns-prefetch" href="//t3.baidu.com"/>
	<link rel="dns-prefetch" href="//t10.baidu.com"/>
	<link rel="dns-prefetch" href="//t11.baidu.com"/>
	<link rel="dns-prefetch" href="//t12.baidu.com"/>
	<link rel="dns-prefetch" href="//b1.bdstatic.com"/>
	<title>百度一下,你就知道</title>
......

nc和curl模拟http服务器和客户端

  • 将上面百度返回的东西保存在文件中,然后启动nc服务作为http服务器
nc -l 8080 < nihao.log

这里是文件内容

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 14615
Content-Type: text/html
Date: Mon, 23 Sep 2019 08:53:55 GMT
Etag: "5d7f08a7-3917"
Last-Modified: Mon, 16 Sep 2019 03:59:35 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=E8935128A72FDC316F7E6D108ED759EC:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-a
Set-Cookie: BIDUPSID=E8935128A72FDC316F7E6D108ED759EC; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2
Set-Cookie: PSTM=1569228835; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1

<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <title>百度一下,你就知道</title>
</head>
<body>
这里响应实体
</body></html>
  • 使用curl作为客户端访问
# -v可以显示响应头信息
curl 127.0.0.1:8080 -v

nc发送文件和接收文件

  • 启动接收文件的服务
# 使用nc监听端口接收文件并将文件进行解压
nc -l -p 8888 | tar xz
  • 发送文件
# 将当前目录下的app目录进行压缩并发送到指定地址
tar -cz ./app | nc -v 目标IP地址 8888

nc网络测速

在服务器上弄一个大文件,同时监听端口

nc -l -p 9999 < ~/nihao.mp4

在本地机器上进行下载

nc 目标地址 9999 > /dev/null

Linux下使用dstat命令监控当前流量即可

nc循环监听

左洋做是因为nc服务中一旦客户端断开,服务器也会断开.下面就是利用死循环和nc的阻塞属性,使nc服务一旦断开马上就再启动一个.

# 通过grep tar | wc -l来做的行匹配,在不同系统下可能会出现问题.因为grep在不同情况下显示行数不一样.
# 所以推荐使用下面那一种(第二种)
while(true);do date;sleep 10; ps -ef | grep tar | wc -l | awk -F '\n' '{if ($0<3) system("nc -l -v 9999 | tar xz");break; else print "already use"}';done;

#推荐使用 通过监听指定端口判断是否开启服务,兼容性更好.
while(true);do date;sleep 1; lsof -i:9888 | wc -l | awk -F '\n' '{if ($0<3) system("nc -l -v -w2 9888 | tar xz"); else print "already use"}';done;

nc代理ssh

git使用ssh代理要借助第三方工具,比如:nc,通过修改ssh配置文件同时将整个系统的ssh连接走代理

nc 这个工具一般的Ubuntu系统都带的有.没有的话apt insttall nc,Mac使用brew install nc

# 命令行使用
ssh -oProxyCommand="nc -x 127.0.0.1:7890 %h %p" git@github.com

# 使用客户端配置.ssh/confg
Host github
	HostName github.com # 域名或IP
	Port 22 # 端口号
	User ubuntu # 用户
	ProxyCommand nc -x 127.0.0.1:7890 %h %p # 代理地址
	IdentityFile ~/.ssh/id_rsa # 指定私钥地址,不指定就是用默认目录
	IdentitiesOnly yes #是否只接受SSH key 登录
Host gitlab
	HostName gitlab.com # 域名或IP
	Port 22 # 端口号
	User ubuntu # 用户
	ProxyCommand nc -x 127.0.0.1:7890 %h %p # 代理地址
	IdentityFile ~/.ssh/id_rsa # 指定私钥地址,不指定就是用默认目录
	IdentitiesOnly yes # 是否只接受SSH key 登录

之后通过 ssh Host的名字 即可使用指定的配置进行ssh连接
  • 添加代理
# ServerAliveInterval定时向服务器发送消息以保持连接,防止不操作而断开.需要的时候才添加
echo "ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p" >> ~/.ssh/config
echo "ServerAliveInterval 30" >> ~/.ssh/config
  • 取消代理
# Linux直接修改源文件
sed -i '/ProxyCommand/d' ~/.ssh/config

# Mac下只能这么弄,否则提示参数错误
sed '/ProxyCommand/d' ~/.ssh/config  > ~/.ssh/config.bk && mv ~/.ssh/config.bk   ~/.ssh/config
# 或者
sed '/ProxyCommand/d;/ServerAliveInterval/d' ~/.ssh/config  > ~/.ssh/config.bk && mv ~/.ssh/config.bk   ~/.ssh/config
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
1 收藏
0
分享
返回顶部
顶部