You can connect to a socket using Bash by using exec and redirecting to and from the pseudo-path /dev/tcp/<hostname>/<port> or /dev/udp/<hostname>/<port>. For instance, to connect to your localhost SSH port using TCP:
exec 3<>/dev/tcp/localhost/22
Then, use cat and echo to read or write to the socket. Here is an example read:
cat <&3
SSH-2.0-OpenSSH_5.6
Notice that there is no such file as /dev/tcp or /dev/udp. Bash interprets the pseudo-path.
ls -l /dev/tcp
ls: cannot access /dev/tcp: No such file or directory
ls -l /dev/udp
ls: cannot access /dev/udp: No such file or directory
As another example, maybe you want to download a webpage:
exec 3<>/dev/tcp/www.fedora.org/80
echo -e "GET /\n" >&3
cat <&3
Finally, let's say you wanted to connect to an IRC server. Here is an example:
#!/bin/bash
##########################################################
# Config
NICK="mynick"
SERVER="irc.freenode.net"
PORT=6667
CHANNEL="#bashirc"
##########################################################
# Main
exec 3<>/dev/tcp/${SERVER}/${PORT}
echo "NICK ${NICK}" >&3
echo "USER ${NICK} 8 * : ${NICK}" >&3
echo "JOIN ${CHANNEL}" >&3
cat <&3
exit $?
Sources
tldp.org: Advanced Bash-Scripting Guide - Chapter 29
thesmithfam.org: Bash socket programming with /dev/tcp
Internet Relay Chat (IRC), a form of Internet chat was created by Jarkko Oikarinen in 1988. Here is a list of Linux clients that will get you connected to IRC Networks. For an extensive list of IRC clients and their features, see the Wikipedia Comparison of Internet Relay Chat clients page.