2017-04-18 4 views
1

Bisher habe ich eine grundlegende IRC-Bot, die ich hoffe, in der Lage zu sein, erfolgreich PRIVMSG selbst mit aber auf dem Server, auf dem ich testen, erfordert eine PONG-Antwort auf PING.Antwort auf IRC PING mit PONG in Bash-Skript

Ich habe absolut keine Ahnung, wie man das umgehen kann. Wie antworte ich auf den PING?

Mein aktueller Code:

#!/bin/bash 

function ircpreamble { 
echo "NICK ${1}" 
} 

function privmsg { 
TARGET=$1 
sed -re "s/^(.*)\$/PRIVMSG ${TARGET} :\1/" 
} 

function delay { 
while read LINE; do 
sleep 2 
echo $LINE 
done 
} 

function messages { 
msg=`cat pmmsg.txt` 
echo $msg 
} 

function disconnect { 
echo "QUIT goodbye :)" 
} 


( 
nick=`cat randnick.txt` 
pms=`cat pmnickname.txt` 
ircpreamble "$nick"; 
messages | privmsg "$pms"; 
disconnect; 
) | delay | nc irc.seersirc.net 6667 

Antwort

1

Als erstes müssen Sie "fangen" die Server-Antworten. Dies kann wie geschehen:

jetzt
$ nc irc.seersirc.net 6667 |while read res;do echo "==>$res";done 
==>:irc.seersirc.net NOTICE AUTH :*** Looking up your hostname... 
==>:irc.seersirc.net NOTICE AUTH :*** Couldn't resolve your hostname; using your IP address instead 

Da Sie die Antwort in einer Variablen zu fangen, können Sie diese Antworten herausfiltern und die entsprechenden Befehle zurück an den Server senden.

Das Problem ist, dass beim Ausführen von Netcat/Telnet von einem Skript eine einfache echo "PONG" sendet die Nachrichten nicht zurück zum Server, sondern echo druckt die Nachrichten lokal in Ihrem Terminal.

Um Nachrichten an den Server zu senden, müssen Sie entweder diese Nachrichten am Anfang an netcat weiterleiten (die Technik, die Sie bereits verwenden) oder eine Art von expect-Skript verwenden oder eine Datei als Feed für das netcat verwenden.

In Bezug auf die PONG-Antwort, beachten Sie, dass in der Reihenfolge Pong vom Server akzeptiert werden muss, muss die Nachricht vom Server mit seiner Ping-Anfrage gesendet werden. Ihr Server sendet so etwas wie PING :D7AA1D1D (jedes Mal anders) und damit die richtige pong Antwort ist PONG :D7AA1D1D

Als Ergebnis kann man einfach nicht eine Pong-Antwort in den ersten Nachrichten sendet am Anfang netcat enthalten, da Sie don‘ Ich weiß, welche ID der Server zusammen mit der Ping-Anfrage an Sie sendet.

Dies ist ein Arbeitsentwurf Skript eine Datei mit kontinuierlich die netcat zu füttern:

rm .ircbot 
touch .ircbot 
prmnick="gv" 
tail -f .ircbot |nc irc.seersirc.net 6667 |while read res 
do 
echo "==>$res" 
if [[ "$res" == *"Couldn't resolve your hostname; using your IP address instead"* ]];then 
    sleep 2 
    echo "NICK gvgv" >>.ircbot 
    tail -n1 .ircbot #used just to display the last line of the helper file in my screen. 
elif [[ "$res" == *"PING"* ]]; then 
    sleep 2 
    echo "$res" |sed 's/PING/PONG/' >>.ircbot 
    tail -n1 .ircbot 
    sleep 2 
    echo "USER gvgv 8 * :gvgv " >>.ircbot 
    tail -n1 .ircbot 
    sleep 2 
    echo "PRIVMSG $prmnick : hello from bot" >>.ircbot 
    tail -n1 .ircbot 

fi 
done 

Tipp: Durch einen zweiten Anschluss zu öffnen, können Sie manuell „Kontrolle“ über Bot von mehr Befehle an die .ircbot Datei zu senden (dh $ echo "JOIN #channel" >>.ircbot), die auch netcat zugeführt werden.

Übrigens, einige Web-Suche über bash irc bots wird einige nützliche Ergebnisse zurückgeben.
Dieser einfache Bash-Skript ist als ein IRC-Bot zu verwenden: https://github.com/Newbrict/bash-irc-bot/blob/master/bot.sh

auch gefunden, ich diese nützliche IRC über Telnet Führung: http://archive.oreilly.com/pub/h/1963

Schließlich ist dies eine Alternative, um das/dev/tcp direkt mit: https://gist.github.com/Wollw/3330337