LINUX.ORG.RU

Чем проще всего слушать сходящие TCP соединения?

 


0

1

Задача: слушать входящие tcp соединения на порту, скажем, 4444 и при подключении к нему кого-либо и передачи сообщения «Privet» запускать shell-скриптик "./start.sh ip-адрес-подключившегося".

Хочется всё сделать максимально просто. Пошерстив в интернетах выяснилось что, вроде как, netcat умеет слушать входящие tcp, но вот как его заставить распознавать текст сообщения и передавать ip адрес входящего подключения пока выяснить не удалось...


я как-то фонендоскоп к компьютеру прикладывал. Но ничего особенного не услышал, такое разочарование.

vvff
()
Ответ на: комментарий от AITap

knockd - на сколько я понял он работает только со своим клиентом, а это мне не подходит inetd - вроде бы подходит для моих целей - нада читать мануалы...

tERBO
() автор топика

netcat -e script.sh
можно чтобы порт слушался твоим скриптом,внутри него все разберешь

zolden ★★★★★
()
Ответ на: комментарий от zolden

zolden

netcat -e script.sh

можно чтобы порт слушался твоим скриптом,внутри него все разберешь

Это хорошо, но если я не ошибаюсь при таком раскладе скрипту будет сыпаться только текст который шлёт удалённая машина на локальный порт. А мне нужно знать её ip-шник.

tERBO
() автор топика
Ответ на: комментарий от tERBO

Логику надо будет вынести в сам скрипт, netstat или lsof спасут отца русской демократии
Но может и сам netcat знает адрес на той стороне, надо раскурить ман на всякий случай

zolden ★★★★★
()

самое-самое простое - shell скрипт через inetd (xinetd). «Privet» читается со стандартного ввода, удалённый адрес должен быть в $REMOTE_HOST.

MKuznetsov ★★★★★
()
Ответ на: комментарий от zolden

Да, xinetd лучше

...the -e argument specifies a program to exec after making or receiving a successful connection. In the listening mode, this works similarly to «inetd» but only for a single instance. Use with GREAT CARE. This piece of the code is normally not enabled; if you know what you're doing, have fun. This hack also works in UDP mode. Note that you can only supply -e with the name of the program, but no arguments. If you want to launch something with an argument list, write a two-line wrapper script or just use inetd like always.

zolden ★★★★★
()
Ответ на: комментарий от MKuznetsov

Сделал через inetd - работает

service knopka
{
socket_type     = stream
protocol        = tcp
wait            = no
port            = 7700
user            = root
server          = /mnt/dir/knopka.sh
}
правда без проверки «Привета», ну да ладно.

Всем спасибо за советы!

tERBO
() автор топика

както примерно так...

#/usr/bin/env python
# -*- mode: python; coding: utf-8 -*-

import functools, subprocess
from tornado import ioloop, netutil, iostream, gen

MARKER = 'Privet'
CMD = './start.sh'

def marker_handler(connection, address):
    subprocess.check_call([CMD, address])

@gen.engine
def conn_handler(connection, address):
    stream = iostream.IOStream(connection)
    
    data = yield gen.Task(stream.read_bytes, len(MARKER))
    
    if data == MARKER:
        ioloop.IOLoop.instance().add_callback(
                functools.partial(marker_handler, connection, address),
                )

if __name__ == '__main__':
    sockets = netutil.bind_sockets(4444)
    for sock in sock_list:
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
        netutil.add_accept_handler(sock, conn_handler)

    ioloop.IOLoop.instance().start()

(скрипт чисто теоретический... ошибки не исправленны и не запускася мной вообще)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Сишечка тут упомянута не для того, чтобы питон утопить, а для того, чтобы указать на отсутствие смысла мучительного поиска существующей тулзы.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.