websocat

Netcat, curl and socat for WebSockets.

Build Status Gitter

Examples

Connect to public echo server

$ websocat ws://echo.websocket.org 123 123 ABC ABC

Serve and connect

``` A$ websocat -s 1234 Listening on ws://127.0.0.1:1234/ ABC 123

B$ websocat ws://127.0.0.1:1234/ ABC 123 ```

Open a tab in Chromium's using remote debugging.

``` $ chromium-browser --remote-debugging-port=9222& $ curl -sg http://127.0.0.1:9222/json/new | grep webSocketDebuggerUrl | cut -d'"' -f4 | head -1 ws://127.0.0.1:9222/devtools/page/A331E56CCB8615EB4FCB720425A82259 $ printf '{"id":2,"method":"Page.navigate","params":{"url":"%s"}}\n' https://example.com | websocat -n1 --origin http://127.0.0.1:9222 --protocol tcp ws://127.0.0.1:9222/devtools/page/A331E56CCB8615EB4FCB720425A82259 {"id":2,"result":{"frameId":"A331E56CCB8615EB4FCB720425A82259","loaderId":"EF5AAD19F2F8BB27FAF55F94FFB27DF9"}}

```

Proxy TCP connections to WebSocket connections and back.

$ websocat --oneshot -b ws-l:127.0.0.1:1234 tcp:127.0.0.1:22& $ websocat --oneshot -b tcp-l:127.0.0.1:1236 ws://127.0.0.1:1234/& $ nc 127.0.0.1 1236 SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u3 qwertyu Protocol mismatch.

Broadcast all messages between connected WebSocket clients

A$ websocat -t ws-l:127.0.0.1:1234 broadcast:mirror: B$ websocat ws://127.0.0.1:1234 C$ websocat ws://127.0.0.1:1234

Features

Usage

```websocat 1.0.0 Vitaly "_Vi" Shukela vi0oss@gmail.com Command-line client for web sockets. Like netcat, but for WebSockets. Designed like socat.

USAGE: websocat ws://URL | wss://URL (simple client) websocat -s port (simple server) websocat [FLAGS] [OPTIONS] (advanced mode)

FLAGS: (some flags are hidden, see --help=long) -E, --exit-on-eof Close a data transfer direction if the other one reached EOF -0, --null-terminated Use \0 instead of \n for linemode -1, --one-message Send and/or receive only one message. Use with --no-close and/or -u/-U. --oneshot Serve only once. Not to be confused with -1 (--one-message) -q Suppress all diagnostic messages, except of startup errors -s, --server-mode Simple server mode: specify TCP port or addr:port as single argument -S, --strict strict line/message mode: drop too long messages instead of splitting them, drop incomplete lines. -u, --unidirectional Inhibit copying data in one direction -U, --unidirectional-reverse Inhibit copying data in the other direction (or maybe in both directions if combined with -u) -v Increase verbosity level to info or further -b, --binary Send message to WebSockets as binary messages -n, --no-close Don't send Close message to websocket on EOF -t, --text Send message to WebSockets as text messages

OPTIONS: (some options are hidden, see --help=long)

-B, --buffer-size <buffer_size>                Maximum message size, in bytes [default: 65536]
-H, --header <custom_headers>...
        Add custom HTTP header to websocket client request. Separate header name and value with a colon and
        optionally a single space. Can be used multiple times.
-h, --help <help>
        See the help.
        --help=short is the list of easy options and address types
        --help=long lists all options and types (see [A] markers)
        --help=doc also shows longer description and examples.
    --origin <origin>                          Add Origin HTTP header to websocket client request
    --protocol <websocket_protocol>            Specify Sec-WebSocket-Protocol: header
    --websocket-version <websocket_version>    Override the Sec-WebSocket-Version value
    --ws-c-uri <ws_c_uri>                      [A] URI to use for ws-c: overlay [default: ws://0.0.0.0/]

ARGS: In simple mode, WebSocket URL to connect. In advanced mode first address (there are many kinds of addresses) to use. See --help=types for info about address types. If this is an address for listening, it will try serving multiple connections. In advanced mode, second address to connect. If this is an address for listening, it will accept only one connection.

Basic examples: Command-line websocket client: websocat ws://echo.websocket.org/

WebSocket server websocat -s 8080

WebSocket-to-TCP proxy: websocat --binary ws-l:127.0.0.1:8080 tcp:127.0.0.1:5678

Partial list of address types: ws:// Insecure (ws://) WebSocket client. Argument is host and URL. wss:// Secure (wss://) WebSocket client. Argument is host and URL. ws-listen: WebSocket server. Argument is host and port to listen. stdio: Same as -. Read input from console, print to console. tcp: Connect to specified TCP host and port. Argument is a socket address. tcp-listen: Listen TCP port on specified address. sh-c: Start specified command line using sh -c or cmd /C (depending on platform) cmd: Start specified command line using sh -c (even on Windows) readfile: Synchronously read a file. Argumen is a file path. writefile: Synchronously truncate and write a file. appendfile: Synchronously append a file. udp: Send and receive packets to specified UDP socket, from random UDP port
udp-listen: Bind an UDP socket to specified host:port, receive packet mirror: Simply copy output to input. No arguments needed. literalreply: Reply with a specified string for each input packet. literal: Output a string, discard input. Partial list of overlays: broadcast: Reuse this connection for serving multiple clients, sending replies to all clients. autoreconnect: Re-establish underlying connection on any error or EOF ```

Reference

There is a work-in-progress reference document that contains more options and examples.

Technical details

It runs singlethreaded. There is old non-async threaded version in legacy branch of releases prior to 0.5.

IPv6 supported, just use specifiers like ws-l:[::1]:4567

Web socket usage is not obligatory, you can use any specs on both sides.

If you want wss:// server, use socat or nginx in addition to websocat until this function is implemented properly (see nginx.conf sample in the reference document).

Pre-built binaries for Linux (usual and musl), Windows, OS X and Android (ARM) are available on the releases page.

Limitations

Planned features

There are also checkboxes on issues #1 and #5.

See also