socat 命令 ================================================================================ 项目地址: http://www.dest-unreach.org/socat/ 参考文档:https://www.redhat.com/sysadmin/getting-started-socat 软件安装 .. code-block:: sudo apt update && sudo apt install socat socat 将两个指定的地址的数据发往对端,其中地址可以是如下形式: * Files * Pipes * Devices (serial line, pseudo-terminal, etc) * Sockets (UNIX, IP4, IP6 - raw, UDP, TCP) * SSL sockets * Proxy CONNECT connections * File descriptors (stdin, etc) * The GNU line editor (readline) * Programs * Combinations of two of these 使用 socat -------------------------------------------------------------------------------- 格式 .. code-block:: socat [options]
有用选项 .. code-block:: -h|-? print a help text describing command line options and addresses -hh like -h, plus a list of all common address option names -hhh like -hh, plus a list of all available address option names -d[ddd] increase verbosity (use up to 4 times; 2 are recommended) -ly[facility] log to syslog, using facility (default is daemon) -lf log to file -ls log to stderr (default if no other log) -v verbose text dump of data traffic -x verbose hexadecimal dump of data traffic 地址格式 .. code-block:: [类型][地址][选项] 类型:file tcp udp stdio ... 和运行的模式 地址:每个类型的合法地址,如 file 是文件名,tcp 是 ip 地址和端口 选项:接近 io 模型的选项,如 fork,reuseaddr,retry 具体格式可以查看 socat 的帮助信息,其中 - 代表 stdio,是别名,可以简化后续操作 访问 22 端口 .. code-block:: ~$ chen@chen-VirtualBox:~$ socat -dd - tcp:127.0.0.1:22 2024/09/14 15:27:18 socat[2004034] N reading from and writing to stdio 2024/09/14 15:27:18 socat[2004034] N opening connection to AF=2 127.0.0.1:22 2024/09/14 15:27:18 socat[2004034] N successfully connected from local address AF=2 127.0.0.1:50000 2024/09/14 15:27:18 socat[2004034] N starting data transfer loop with FDs [0,1] and [5,5] SSH-2.0-OpenSSH_9.3p1 Ubuntu-1ubuntu3 ^C2024/09/14 15:27:20 socat[2004034] N socat_signal(): handling signal 2 2024/09/14 15:27:20 socat[2004034] N exiting on signal 2 2024/09/14 15:27:20 socat[2004034] N socat_signal(): finishing signal 2 2024/09/14 15:27:20 socat[2004034] N exit(130) * -dd 增加 debug 信息 * - 本地地址 * tcp:127.0.0.1:22,类型是tcp,那么他的合法格式就是ip地址加端口 在 2048 端口创建可接受多个客户端的服务器,在其它终端发送数据 .. code-block:: socat - tcp-listen:2048,fork,reuseaddr .. code-block:: socat - tcp:127.0.0.1:2048 将上面的 - 换成文件,可将数据写入文件 .. code-block:: socat -U open:./tcp.log,creat,append tcp-listen:2048,fork,reuseaddr 根据帮助信息,可得出文件的地址为 open:./tcp.log,后续为文件创建选项:新建和追加 此外,我们注意到,命令指定了方向,socat 是将两边地址的数据发往对端,如果不指定方向,那么 也会将文件的数据发到另外一端,然后因为文件数据发送完毕而关闭连接。 .. code-block:: socat open:./tcp.log,creat,append tcp-listen:2048,fork,reuseaddr 以上命令去除了方向,此时启动客户端就会在另外一端输出文件内容,然后断开连接。 通过以上内如不难得出以下结论: * 对地址的理解:根据不同的情况选择地址类型,并填写地址信息和附加选项 * 对 IO 模型的理解:socat 是直接转发两端数据,文件作为地址时就要考虑文件结束的情况 * socat 本身不难,但它提供了无限的可能,只能用什么查什么 其它例子 -------------------------------------------------------------------------------- 端口转发,将8080 收到的地址发到 192.168.1.3:80 .. code-block:: socat TCP-LISTEN:8080,fork,reuseaddr TCP:192.168.1.3:80 文件传输 .. code-block:: socat -u TCP-LISTEN:8080 open:record.log,create # 服务端接收文件 socat -u open:record.log TCP:localhost:8080 # 客户端发送文件 透明代理 .. code-block:: socat TCP-LISTEN:<本地端口>,reuseaddr,fork SOCKS:<代理服务器IP>:<远程地址>:<远程端口>,socksport=<代理服务器端口> socat TCP-LISTEN:<本地端口>,reuseaddr,fork PROXY:<代理服务器IP>:<远程地址>:<远程端口>,proxyport=<代理服务器端口>