博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

netcat 替代品 socat

Posted on 2015-09-23 16:49  bw_0927  阅读(1502)  评论(0编辑  收藏  举报

http://www.oschina.net/p/socat

http://salomi.blog.51cto.com/389282/272809

https://github.com/Sandtears/MyBlog/blob/master/Markdown_Files/socat.md

 

socat是一個netcat(nc)的替代產品,可以稱得上nc++。socat的特點就是在兩個流之間建立一個雙向的 通道。socat的地址類型很 多,有ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,等等。

 

简介

socat,名字来源于 SOcket CAT,其作用在某种程度上可以说是 netcat(nc) 的升级版,是 Linux 下的一个强力工具

socat 的作用建立一条连接两个端点并实现通信的通道,端点可以是文件、也可以是端口或某个进程。

使用方法

格式

socat [参数] 端点1[,选项] 端点2[,选项]

参数

-d -d -d -d根据-d的个数决定产生的记录信息的详细程度(可以一个不加)
-lf<filename> 将日志写入文件中
-v 将发出的信息不仅输出到标准输出,同时重定向到stderr,可用2>重定向到文件(某种程度上类似于tee)
-t<timeout> 一方发出EOF指令后,另一方结束连接的时间
-T<timeout> 超时等待时间
-u 只从端点1读入并输出到端点2
-U 只从端点2读入并输出到端点1

端点

TCP/UDP类:

tcp:<host>:<port>  # 通过TCP连接到host:port的端点
tcp-listen:<port>  # 通过TCP绑定在本地port的端点

# 常用选项有fork(复制连接),reuseaddr(端口复用)
# 比如
tcp-listen:8099,reuseaddr,fork
# fork 代表当有 socket 试图连接时建立一个新 socket 与之连接,可以同时与多个 socket 连接。
# reuseaddr 可以防止由于错误退出导致的端口未被释放

# udp和udp-listen使用方法类似。
# 可以用tcp4,tcp6-listen指定使用的IP协议

文件类:

-  # 代表标准输入和标准输出
# Example:
socat tcp:127.0.0.1:8888 -  # 在本机 8888 端口与标准输入输出之间建立一个连接

open:<filename>  # 打开文件
# 常用参数有 create(创建文件), rdonly(仅读取), wronly(仅写入)
# binary(二进制形式), append(追加)

其他类:

# 网络类
TUN:<IP_ADDR>,up # 创建TUN级别的VPN


# 运行shell程序
exec: <path>
system: <path>

# 以上两个常用参数有 
# pty (以伪终端形式运行),
# stderr(将错误信息也发送到另一端)
# Example:
socat exec:bash,pty tcp-listen:8888


# 除此之外还有proxy和openssl等。

常见用例

端口映射

# 将本地的 port2 端口映射为 host1 的 port1
socat tcp:<host1>:<port1> tcp-listen:<port2>,reuseaddr,fork

发往本机port2端口的数据都被转发到host1主机的port1上

将本地程序放到网上运行

# 将 bash 程序与一个 tcp-socket 连接
# 此时连接本机的port端口就可以连接到一个 bash (可用作后门)
socat tcp-listen:<port>,reuseaddr,fork exec:bash,pty,stderr 

传输文件

# A 主机 
socat -u open:<filename>,binary tcp-listen:<portA> 

# B主机
socat -u tcp:<hostA>:<portA> open:<filename>,create,binary

创建 VPN

# A 主机
socat tun:192.168.199.1/32,up tcp-listen:<portA> 
# B 主机
socat tun:192.168.199.2/32,up tcp:<hostA>:<portA>

 

=============

 

说起来有点土,事到如今才第一次用socat.

不过今天看了一眼,netcat(nc)这东西ms已经N年没有人维护了.最先有个叫nc110的东西,由于太普及, 以至于人们都不想再去改动它的功能.结果导致多年来没有任何进步…现任的RHEL5里面好像也是由nc110改出来的.另外分支出来一个netcat,这个在google上直接netcat最容易出来,但也好多年没有人动过了…由于这些情况,才使得socat应运而生.虽然它已经生了好多年了,不过我才认识…
用socat试几个netcat常用的用法,对比如下:
1. 听tcp 12345端口
# nc -l 127.0.0.1 12345
# socat tcp-listen:12345 -
2. 向远处tcp 12345端口发点字
# echo “test” | nc 127.0.0.1 12345
# echo “test” | socat - tcp-connect:127.0.0.1:12345
3. 听udp 23456端口
# nc -u -l 127.0.0.1 23456
# socat udp-listen:23456 -
4. 向远处udp 23456端口发点字
# echo “test” | nc -u 127.0.0.1 23456
# echo “test” | socat - udp-connect:127.0.0.1:23456
5. 听unix socket /tmp/unix.socket
# nc -U -l /tmp/unix.socket
netcat没有-U选项
# socat unix-listen:/tmp/unix.socket -
6. 向本地unix socket /tmp/unix.socket发点字
# echo “test” | nc -U /tmp/unix.socket
netcat没有-U选项
# echo “test” | socat - unix-connect:/tmp/unix.sock
7. 听本地unix datagram socket /tmp/unix.dg.sock
nc110搞不定,netcat也搞不定
# socat unix-recvfrom:/tmp/unix.dg.sock -
8. 向本地unix datagram socket /dev/log发点字
nc110搞不定,netcat也搞不定
# echo “test” | socat - unix-sendto:/tmp/unix.dg.sock