| <!-- source: socat-exec.html --> |
| <!-- Copyright Gerhard Rieger 2009 --> |
| <html><head> |
| <title>Executing programs using socat</title> |
| <link rel="stylesheet" type="text/css" href="dest-unreach.css"> |
| </head> |
| |
| <body> |
| |
| <h1>Executing programs using socat</h1> |
| |
| <h2>Introduction</h2> |
| <p>From its very beginning socat provided the <tt>EXEC</tt> and <tt>SYSTEM</tt> |
| address types for executing programs or scripts and exchanging data with |
| them. Beginning with version 2 - with implementation of the address chain |
| feature (inter addresses) - these address types were enhanced to allow |
| execution of programs also in inter address context. |
| </p> |
| |
| <h2>Program context types</h2> |
| |
| <p>Currently socat provides three contexts (interfaces) for program or script |
| execution: |
| <ul> |
| <li>The <em>endpoint</em> context: this is the classical situation where |
| socat equips the program with stdin and stdout. It does not |
| matter if the program uses other external communication channels. Address |
| keywords: EXEC, SYSTEM. This variant should be easy to understand in terms |
| of socat version 1 functionality and is therefore not further |
| discussed here.</li> |
| <li>The <em>bidirectional inter address</em> context: socat expects the |
| program to use two bidirectional channels: stdin and stdout on its "left" |
| side and file descriptors 3 and 4 on its "right" side. This allows to |
| provide nearly arbitrary data manipulations within the context of socat |
| chains. Address keywords: EXEC, SYSTEM.</li> |
| <li>The <em>unidirectional inter address</em> context: for easy |
| integration of standard UNIX programs socat provides the EXEC1 and SYSTEM1 |
| address types where socat provides stdin on the "left" side and stdout on |
| the "right" side of the program, or vice versa for right-to-left |
| transfers.</li> |
| </ul> |
| </p> |
| |
| <p>Note: The <em>endpoint</em> and the <em>unidirectional inter address</em> |
| contexts both just use the program's stdio to communicate with it. However, |
| in practice the last form will in most cases just manipulate and transfer |
| data, while the first form will usually have side effects by communicating |
| with exteral resources or by writing to the file system etc. |
| </p> |
| |
| <h2>Executing programs in bidirectional inter address context</h2> |
| <p>socat address chains concatenate internal modules that communicate |
| bidirectionally. |
| For example, a chain that establishes encrypted connection to a socks server |
| might look something like this (parameters and options dropped): |
| </p> |
| <p><code>"SOCKS:... | OPENSSL-CLIENT | TCP:..."</code></p> |
| <p>If you have a program that implements a new encryption protocol the chain |
| could be changed to: |
| </p> |
| <p><code>"SOCKS:... | EXEC:myencrypt.sh | TCP:..."</code></p> |
| <p>The complete example:</p> |
| <p><code>socat - "SOCKS:www.domain.com:80 | EXEC:myencrypt.sh | TCP:encrypt.secure.org:444"</code></p> |
| |
| <p>The <tt>myencrypt.sh</tt> script would be a wrapper around some myencrypt |
| program. It must adhere a few rules: It reads and writes cleartext data on |
| its left side (FDs 0 and 1), and it reads and writes encrypted data on its |
| right side (FDs 3 and 4). Thus, cleartext data would come from the left on FD |
| 0, be encrypted, and sent to the right side through FD 4. Encrypted data would |
| come from the the right on FD 3, be unencrypted, and sent to the left side |
| through FD 1. It does not matter if the encryption protocol would required |
| negotiations or multiple packets on the right side. |
| </p> |
| <p>The <tt>myencrypt.sh</tt> script might log to syslog, its own log |
| file, or to stderr - this is independend of socat. It might have almost |
| arbitrary side effects. |
| </p> |
| <p>For optimal integration the script should be able to perform half-close and |
| should be able work with different file descriptor types (sockets, pipes, |
| ptys). |
| </p> |
| <p>The socat source distribution contains two example scripts that focus on |
| partial aspects: |
| <ul> |
| <li><tt>predialog.sh</tt> implements an initial dialog on the "right" script |
| side and, after successful completion, begins to transfer data unmodified in |
| both directions.</li> |
| <li><tt>cat2.sh</tt> shows how to use two programs unidirectionally to gain |
| bidirectional transfer. The important aspects here are the shell based |
| input / output redirections that are necessary for half-close.</li> |
| </ul> |
| |
| <h2>Using unidirectional inter addresses</h2> |
| <p>There exist lots of UNIX programs that perform data manipulation like |
| compression or encoding from stdin to stdout, while related programs perform |
| the reverse operation (decompression, decoding...) also from stdin to |
| stdout. socat makes it easy to use those programs directly, i.e. without the |
| need to write a bidirectional wrapper shell script. |
| </p> |
| <p><code>socat - "exec1:gzip % exec1:gunzip | tcp:remotehost:port"</code> |
| </p> |
| <p>The % character creates a dual communication context where different |
| inter addresses are used for left-to-right and right-to-left transer (see |
| <a href="socat-addresschain.html">socat-addresschain.html#dual</a>. socat |
| generates stdin/stdout file descriptors for both programs independently. |
| </p> |
| |
| <p> |
| <small>Copyright: Gerhard Rieger 2009</small><br> |
| <small>License: <a href="http://www.fsf.org/licensing/licenses/fdl.html">GNU Free Documentation License (FDL)</a></small> |
| </p> |
| |
| </body> |
| </html> |