Using bash Net-Redirection

Problem

You need to send or receive very simple network traffic but you do not have a tool such as netcat installed.

Solution

If you have bash version 2.04+ compiled with --enable-net-redirections (it isn’t compiled this way in Debian and derivatives), you can use bash itself. The following example is also used in Finding My IP Address:

$ exec 3<> /dev/tcp/www.ippages.com/80
$ echo -e "GET /simple/?se=1 HTTP/1.0
" >&3
$ cat <&3
HTTP/1.1 200 OK
Date: Tue, 28 Nov 2006 08:13:08 GMT
Server: Apache/2.0.52 (Red Hat)
X-Powered-By: PHP/4.3.9
Set-Cookie: smipcomID=6670614; expires=Sun, 27-Nov-2011 08:13:09 GMT; path=/
Pragma: no-cache
Cache-Control: no-cache, must-revalidate
Content-Length: 125
Connection: close
Content-Type: text/plain; charset=ISO-8859-1

72.NN.NN.225 (US-United States) http://www..com Tue, 28 Nov 2006 08:13:09 UTC/GMT
flagged User Agent - reduced functionality

Warning

As noted, this recipe will probably not work under Debian and derivatives such as Ubuntu since they expressly do not compile bash with --enable-net-redirections.

Discussion

As noted in Redirecting Output for the Life of a Script, it is possible to use exec to permanently redirect file handles within the current shell session, so the first command sets up input and output on file handle 3. The second line sends a trivial command to a path on the web server defined in the first command. Note that the user agent will appear as “-” on the web server side, which is what is causing the “flagged User Agent” warning. The third command simply displays the results.

Both TCP and UDP are supported. Here is a trivial way to send syslog messages to a remote server (although in production we recommend using the logger utility, which is much more user friendly and robust):

echo "<133>${0##*/}[$$]: Test syslog message from bash" > /dev/udp/loghost.example.com/514

Since UDP is connectionless, this is actually much easier to use than the previous TCP example. <133> is the syslog priority value for local0.notice, calculated according to RFC 3164. See the RFC “4.1.1 PRI Part” and logger manpage for details. $0 is the name, so ${0##*/} is the “basename” and $$ is the process ID of the current program. The name will be -bash for a login shell.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.139.83.151