[TOC]
nc工具
Linux常用命令行太多了,重开一个
说明
nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具
- 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
- 端口的扫描,nc可以作为client发起TCP或UDP连接
- 机器之间传输文件
- 机器之间网络测速
- 所以ssh等可以把nc当代理用
常用参数
- -l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
- -p <port> 设置本地主机使用的通信端口,暂未用到。
- -s 指定发送数据的源IP地址,适用于多网卡机
- -u 指定nc使用UDP协议,默认为TCP
- -v 输出交互或出错信息,新手调试时尤为有用
- -w 超时秒数,后面跟数字
- -z 表示zero,表示扫描时不发送任何数据.据说与-l选项一起使用会有错误
- -n 直接使用IP地址,而不通过域名服务器。
- -o <输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
- -i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
- -4 使用IPV4
- -6 使用IPV6
- -X 指定协议数字,4:socks4. 5:socks5. connect:https. 如果不写默认为socks5.
- -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