瑞士军刀:netcat(nc)、socat

1 老版瑞士军刀:netcat(nc)

参考:https://zhuanlan.zhihu.com/p/83959309

netcat 主要有 GNU版 和 OpenBSD版,一般软连接为nc
查看方法:readlink -f $(which nc)
/bin/nc.traditional: 默认 GNU 基础版本,一般系统自带。
/bin/nc.openbsd: openbsd 版本,强大很多。
nmap 自带的一个更好的 netcat 分支,比 openbsd 版本还强

  • 部分参数:

-N 传输完就退出
-n 不进行dns解析
-l 侦听
-p 端口号
-u 代表udp协议
-z 代表不发送数据,仅连接
-vv 显示更多信息 -v、-vv、-vvv

  • 示例:

# http端口测试(tcp 80):
$ nc -vz 192.168.32.13 80     # 类别telnet 192.168.32.13 80


# tcp端口测试:
$ nc -l -p 8080         # 服务器端侦听8080端口,默认tcp协议
$ nc 192.168.1.2 8080   # 连接服务器(192.168.1.2)的8080端口


# udp端口测试:
$ nc -u -l -p 8080        # 服务器端侦听8080端口
$ nc -u 192.168.1.2 8080


# 传输目录:
$ nc -l -p 3333 | tar -x ./                  # 服务器端侦听3333端口。收到tar包数据流,并解包到当前目录
$ tar -cO ./2018 | nc -N 192.168.32.13 3333  # 创建tar包,并输出到标准输出,再通过管道传输到服务器(192.168.32.13)的3333端口。  说明:-O 输出到标准输出。
## 或压缩后传输:
$ nc -l -p 3333 | tar -zx ./                 # 服务器端侦听3333端口。收到tar.gz包数据流,并解压解包到当前目录
$ tar -zcO ./2018 | nc -N 192.168.32.13 3333 # 创建tar.gz包,并输出到标准输出,再通过管道传输到服务器(192.168.32.13)的3333端口。


# 传输目录为tar文件:
$ nc -l -p 3333 > xx.tar.gz                  # 服务器端侦听3333端口。收到tar.gz包数据流保存到xx.tar.gz
$ tar -zcO ./2018 | nc -N 192.168.32.13 3333 # 创建tar.gz包,并输出到标准输出,再通过管道传输到服务器3333端口


# 传输文件:
$ nc -l -p 3333 > xx.tar.gz                  # 服务器端侦听3333端口。收到tar.gz包数据流保存到xx.tar.gz
$ nc -N 192.168.32.13 3333  < xx.tar.gz      # 将文件xx.tar.gz输出到服务器3333端口


# 网速吞吐量测试:
$ nc -vv -n -l -p 3333 > /dev/null                               # 服务器端侦听3333端口。将收到的数据丢弃
$ dd if=/dev/zero bs=1MB count=100 | nc -N -n 192.168.32.13 3333 # 通过dd输入 100x1MB 数据到服务器3333端口
## 或方法二即时显示网速
$ nc -l -p 3333 | pv         # 需要安装:sudo apt install pv
$ nc 192.168.32.13 3333 < /dev/zero


# 连接bash shell:
$ mkfifo /tmp/f                                               # 新建管道文件
$ cat /tmp/f | /bin/bash 2>&1 | nc -v -n -l -p 3333 > /tmp/f  # 这个命令要从nc命令处开始理解,首先nc收到远程传来的内容(命令),将其输出到管道,然后将管道里的内容cat到bash,然后bash执行完成后又输出到stdout,stdout又会被输出到远程的屏幕进行回显
$ nc 192.168.32.13 3333
## 用完注意将 /tmp/f 这个 fifo 管道文件删除。

2 新版瑞士军刀:socat

参考:https://zhuanlan.zhihu.com/p/347722248

  • 基本命令:

socat [参数] <地址1> <地址2>

[参数]请参考help

使用 socat 需要提供两个地址,然后 socat 做的事情就是把这两个地址的数据流串起来,把第左边地址的输出数据传给右边,同时又把右边输出的数据传到左边。最简单的地址就是一个减号“-”,代表标准输入输出,例如:

$ socat - -          # 把标准输入和标准输出对接,输入什么显示什么
  • 示例:

# 网络测试:
$ socat - TCP-LISTEN:8080          # 启动 server 监听 TCP
$ socat - TCP:192.168.32.13:8080   # 连接server 8080
## 或:
$ socat TCP-LISTEN:8080 -
$ socat TCP:192.168.32.13:8080 -
## 说明:上面两种方法效果一样,因为就是把左右两个地址的输入输出接在一起,除非前面指明 -u 或者 -U 显示指明数据“从左到右”还是“从右到左”。

# 也可以用udp协议:
$ socat - UDP-LISTEN:8080               # 终端1 上启动 server 监听 UDP
$ socat - UDP:192.168.32.13:8080        # 终端2 上启动 client 链接 UDP

# 一般如果客户端结束结束会话,服务端也会结束,但加额外参数可以避免:
$ socat - TCP-LISTEN:8080,fork,reuseaddr      # 终端1 上启动 server
$ socat - TCP:192.168.32.13:8080              # 终端2 上启动 client
## 注释:
## fork      能同时应答多个链接过来的客户端,每个客户端会 fork 一个进程出来进行通信
## reuseaddr 地址重用,防止链接没断开玩无法监听的问题


# 端口转发1:
$ socat TCP-LISTEN:8080,fork,reuseaddr  TCP:www.baidu.com:443  # 转发本地端口的数据到远程www.baidu.com:443

# 端口转发2:
$ socat TCP-LISTEN:8080,fork,reuseaddr  EXEC:/usr/bin/bash    # 服务端提供 shell
$ socat - TCP:192.168.32.13:8080                              # 客户端登录

3 最后

img

爱你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值