Как с помощью bash создать сервер сокетов и разрешить нескольким клиентам использовать один и тот же порт?

Вы можете попробовать html2text . Если не помогло, предоставьте дополнительную информацию.

2
21.04.2019, 19:35
2 ответа

ncне поддерживает параллельную работу с несколькими подключенными клиентами и не подходит для этой задачи. Для этой работы есть несколько подходящих инструментов, в том числе:

  1. Бернштейнtcpserver(оригинал или djbwares )или Хоффманtcpserver:
    tcpserver -v -R -H -l 0 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  2. моя tcpserverпрокладка:
    tcpserver -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  3. мой UCSPI -инструменты TCP:
    tcp-socket-listen 88.109.110.161 100 tcp-socket-accept --verbose sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  4. Беркоs6-tcpserver4:
    s6-tcpserver4 -v 2 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  5. Bercot s6 -сетевые инструменты:
    s6-tcpserver4-socketbinder 88.109.110.161 100 s6-tcpserver4d -v 2 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  6. Папеtcpsvd:
    tcpsvd -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/
  7. Сэмпсонonenetd:
    onenetd -v 88.109.110.161 100 sh -c 'exec cat 1>&2' 2>&1 |
    cyclog port100/

И можно заменить multilog, s6-log, svlogdили tinylogна cyclog.

Дополнительная литература

8
27.01.2020, 21:52

Очень жаль, что нет стандартного/легкодоступного инструмента для такой простой задачи, но если у вас нет какой-либо встраиваемой системы и у вас есть какой-нибудь скриптовый язык вроде perlили python, вы можете быстро поставить что-нибудь вместе:

TCPSRV:

#! /usr/bin/perl
use strict;
use IO::Socket::INET6;
die "usage: $0 host:port { shell_cmd | cmd args... }\n" unless @ARGV >= 2;
my $h = shift;
my $s=new IO::Socket::INET6(ReusePort=>1, Listen=>6, LocalAddr=>$h)
        or die "IO::Socket::INET($h): $!";
warn "listening on ", $s->sockhost, "/", $s->sockport, "\n";
$SIG{CHLD} = sub { use POSIX qw(WNOHANG); 1 while waitpid(-1, WNOHANG) > 0 };
while(1){
        my $a = $s->accept or do { die "accept: $!" unless $!{EINTR}; next };
        warn "connection from ", $a->peerhost, "/", $a->peerport, "\n";
        die unless defined(my $p = fork);
        close($a), next if $p;
        open STDIN, "<&", $a and open STDOUT, ">&", $a or die "dup: $!";
        close $s and close $a or die "close: $!";
        exec(@ARGV); die "exec @ARGV: $!";
}

Использование:tcpsrv host:port cmd

Это будет прослушивать host:port, и каждый раз, когда клиент подключается к host:host, он будет разветвляться и выполняться cmdс перенаправлением его stdin и stdout из/в соединение:

tcpsrv :9999 ls.
tcpsrv 127.0.0.1:7000 uptime
tcpsrv [::]:7000 uptime
tcpsrv 88.109.110.161:2000 'cat > port2000.txt'
0
27.01.2020, 21:52

Теги

Похожие вопросы