Понадобился мне пару лет назад скрипт для сохранения локально логов некоторых интересных мне IRC каналов. Скрипт планировалось запускать на роутере, поэтому хотелось иметь самый простой скрипт без дополнительных зависимостей и написанный на баше. Вооружившись netcat'ом был написан простенький скрипт из нескольких срочек, который работал до первого PING'а от сервера. Слегка подпавив скрипт, получилась работающая версия:
Обратная связь внутри цикла позволяет использовать скрипт и как простейший IRC клиент. IRC комманды перенаправленные в $config файл будут исполнены на сервере. Например для отсылки сообщения в канал нужно записать в файл следующее:
Вместо комманды nc можно использовать и telnet без ущерба функциональности. В этом случае в скрипте будут использоваться только комманды доступные в busybox, что позволит использовать скрипт без установки дополнительных пакетов.
root@Alix:~# cat ./irclogbot.sh
#!/bin/sh
nick="blb$$"
channel=testchannel
server=irc.freenode.net
config=/tmp/irclog
[ -n "$1" ] && channel=$1
config="${config}_${channel}"
echo "NICK $nick" > $config
echo "USER $nick +i * :$0" >> $config
echo "JOIN #$channel" >> $config
trap "rm -f $config;exit 0" INT TERM EXIT
tail -f $config | nc $server 6667 | while read MESSAGE
do
case "$MESSAGE" in
PING*) echo "PONG${MESSAGE#PING}" >> $config;;
*QUIT*) ;;
*PART*) ;;
*JOIN*) ;;
*NICK*) ;;
*PRIVMSG*) echo "${MESSAGE}" | \
sed -n -r "s/^:([^!]+).*PRIVMSG[^:]+:(.*)/[$(date '+%R')] \1> \2/p";;
*) echo "${MESSAGE}";;
esac
done
Обратная связь внутри цикла позволяет использовать скрипт и как простейший IRC клиент. IRC комманды перенаправленные в $config файл будут исполнены на сервере. Например для отсылки сообщения в канал нужно записать в файл следующее:
echo "PRIVMSG #testchannel :Testing bash bot. Ignore it" >> /tmp/irclog_testchannel
Вместо комманды nc можно использовать и telnet без ущерба функциональности. В этом случае в скрипте будут использоваться только комманды доступные в busybox, что позволит использовать скрипт без установки дополнительных пакетов.