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 <&3Es 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ßenCheck out similar posts by category:
Allgemein
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow