Bash: TCP/Internet-Verbindungsbehandlung

English Deutsch

Heutzutage gibt es viele Probleme, die einfacher über das Internet gelöst werden könnten. In diesem Beitrag beschreibe ich, wie man diese Probleme allein mit Bash löst.

Der Standardweg, um sich mit einem Server im Internet zu verbinden, besteht darin, den Verbindungsstrom einzubinden:

bash_tcp_connect_example.sh
exec 3<>/dev/tcp/$server/$ircPort || echo "Some text or doing, if connecting failed"

Wenn man beispielsweise die erste Seite dieses Blogs abrufen möchte, kann man Folgendes ausführen:

bash_http_get_example.sh
exec 3<>/dev/tcp/techoverflow.net/80 && echo -e "GET /index.html HTTP/1.1\r\nhost: techoverflow.net\r\nConnection: close\r\n\r\n" >&3 && cat <&3

Es können jedoch auch komplexere Verbindungen aufgebaut werden, wie dieser kleine IRC-Bot:

irc_bot.sh
#! /bin/bash

# Hier kann man einige Konfigurationen vornehmen
nickname="testBot"
server="chat.freenode.net"
ircPort=6667
channels=(\#ubuntu) # Man kann mehrere Channels zum Beitreten hinzufügen wie folgt:
# (channel1 channel2 channel3), jedoch muss man jedes # escapen
logFile=log.log

# Verbindungs- und Join-Sachen erledigen
echo "Verbindung zum Server ..."
exec 3<>/dev/tcp/$server/$ircPort || echo "Verbindungsfehler! ..."
echo -ne "NICK ${nickname}\r\n" >&3
echo -ne "USER ${nickname} localhost localhost :simple irc bash bot\r\n" >&3
echo "Mit allen Channels verbinden ..."
for ind in ${!channels[*]}
do
  echo -ne "JOIN ${channels[$ind]}\r\n" >&3
done

# Programmhauptschleife
while true
do
  # Die nächste Zeile aus der Verbindung lesen
  line=$(head -n 1 <&3)
  # Prüfen, ob (Stream-)Verbindung geschlossen wurde (Netzwerkfehler oder ähnliches)
  # Beachten, dass IRC-Server niemals leere Zeilen senden
  if [ "$line" == "" ] || [ "$(ls /proc/$$/fd | grep -w '3')" != "3" ]
  then
    echo "Verbindung zum IRC-Server wurde geschlossen! Beenden ..."
    break
  fi
  # Ausgabe auf dem Bildschirm (Beachten, dass das \n durch den head-Befehl entfernt wurde)
  echo "Empfange ..."
  printf "%s\n" "$line" | hd
  # PONG auf PING antworten, sonst geht der IRC-Server davon aus, dass man nicht mehr zuhört
  # und einen kickt
  if [ "${line:0:5}" == "PING " ]
  then
    echo -n "PONG ${line:5}" >&3
    echo -ne "\r\n" >&3
  fi
  # Hier kann weitere Interaktion hinzugefügt werden
  echo $line >> $logFile
done

exec 3>&- # Ausgabeverbindung schließen
exec 3<&- # Eingabeverbindung schließen

Check out similar posts by category: Allgemein