shell: эхо-сервер TCP

Настройка, программирование, распределённые вычисления

Модераторы: Olej, bellic, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

shell: эхо-сервер TCP

Непрочитанное сообщение Olej » 18 дек 2023, 00:44

Для отработки сетевых приложений сильно полезно иметь эхо-сервер (ретранслирующий) на определённом TCP порту: что полкчил - то и отправил обратно.
И это вполне можно вытворить на shell

P.S. Часто в статьях пишут "на bash" ... но на сегодня во многих дистрибутивах это уже и не bash а его клоны.
Сделайте в своей системе:

Код: Выделить всё

olej@R420:~/sdc3$ ls -l `which sh`
lrwxrwxrwx 1 root root 4 мар 23  2022 /usr/bin/sh -> dash
Видите: dash.
Но всё далее относится именно к таким shell: ash, bash, dash ...
Но не к: csh, tcsh и т.д.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

shell: эхо-сервер TCP

Непрочитанное сообщение Olej » 18 дек 2023, 00:56

How to make an Echo server with Bash?
... 12 лет назад ...
По мотивам:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ nc -l -k -p 50000 -c 'xargs -n1 echo'

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ nc 127.0.0.1 50000
слово
слово
два слова
два
слова
"два слова"
два слова
"целых три слова"
целых три слова
1 2
1
2
"1 2 3 4 5 6 7"
1 2 3 4 5 6 7
^C
Всё работает ОК :!:
Из особенностей:
1. Это всё работает только с реализацией nc как nc.traditional, см. nc - сетевой cat

Код: Выделить всё

olej@nvme:~$ which nc
/usr/bin/nc

olej@nvme:~$ ls -l /usr/bin/nc
lrwxrwxrwx 1 root root 20 мар 11  2022 /usr/bin/nc -> /etc/alternatives/nc

olej@nvme:~$ ls -l /etc/alternatives/nc
lrwxrwxrwx 1 root root 19 дек 17 23:09 /etc/alternatives/nc -> /bin/nc.traditional
2. Возможно, эту реализацию нужно доустанавливать, и переключать на неё умалчиваемую альтернативу: alternatives.
3. Для ретрансляции многословных строк (разделённых пробелом) их можно ретранслировать только заключив в кавычки.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

shell: эхо-сервер TCP

Непрочитанное сообщение Olej » 18 дек 2023, 01:01

Olej писал(а):
18 дек 2023, 00:56
По мотивам:
Но это всё было локально, на локалхост...
А теперь реально по сети :!:
На удалённом хосте:

Код: Выделить всё

olej@nvme:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Linuxmint
Description:	LMDE 6 (faye)
Release:	6
Codename:	faye

Код: Выделить всё

olej@nvme:~$ nc -l -p 40000 -c 'xargs -n1 echo'
nc: invalid option -- 'c'
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl]
	  [-m minttl] [-O length] [-P proxy_username] [-p source_port]
	  [-q seconds] [-s sourceaddr] [-T keyword] [-V rtable] [-W recvlimit]
	  [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]]
	  [destination] [port]
Это и есть знак того, что установлена не та реализация nc.

Код: Выделить всё

olej@nvme:~$ aptitude search netcat
v   netcat                                            -                                                             
v   netcat:i386                                       -                                                             
i   netcat-openbsd                                    - TCP/IP swiss army knife                                     
p   netcat-openbsd:i386                               - TCP/IP swiss army knife                                     
p   netcat-traditional                                - инструмент для TCP/IP4 на все случаи жизни                  
p   netcat-traditional:i386                           - инструмент для TCP/IP4 на все случаи жизни           
И нужно выправлять.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

shell: эхо-сервер TCP

Непрочитанное сообщение Olej » 18 дек 2023, 01:05

Olej писал(а):
18 дек 2023, 01:01
И нужно выправлять.

Код: Выделить всё

olej@nvme:~$ sudo apt install netcat-traditional
[sudo] пароль для olej:       
Чтение списков пакетов… Готово
Построение дерева зависимостей… Готово
Чтение информации о состоянии… Готово         
Следующие пакеты устанавливались автоматически и больше не требуются:
  linux-headers-6.1.0-12-amd64 linux-headers-6.1.0-12-common linux-image-6.1.0-12-amd64
Для их удаления используйте «sudo apt autoremove».
Следующие НОВЫЕ пакеты будут установлены:
  netcat-traditional
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 67,9 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 146 kB.
Пол:1 http://debian.volia.net/debian bookworm/main amd64 netcat-traditional amd64 1.10-47 [67,9 kB]
Получено 67,9 kB за 0с (207 kB/s)             
Выбор ранее не выбранного пакета netcat-traditional.
(Чтение базы данных … на данный момент установлено 413348 файлов и каталогов.)
Подготовка к распаковке …/netcat-traditional_1.10-47_amd64.deb …
Распаковывается netcat-traditional (1.10-47) …
Настраивается пакет netcat-traditional (1.10-47) …
Обрабатываются триггеры для man-db (2.11.2-2) …

Код: Выделить всё

olej@nvme:~$ aptitude search netcat | grep ^i
i  netcat-openbsd - TCP/IP swiss army knife
i  netcat-traditional - инструмент для TCP/IP4 на все случаи жизни
Но теперь нужно ещё поменять альтернативу по умолчанию...
Было:

Код: Выделить всё

olej@nvme:~$ update-alternatives --display nc
nc - автоматический режим
 лучшая версия ссылки — /bin/nc.openbsd
  ссылка сейчас указывает на /bin/nc.openbsd
  ссылка nc — /bin/nc
  подчинённая nc.1.gz — /usr/share/man/man1/nc.1.gz
  подчинённая netcat — /bin/netcat
  подчинённая netcat.1.gz — /usr/share/man/man1/netcat.1.gz
/bin/nc.openbsd — приоритет 50
  подчинённый nc.1.gz: /usr/share/man/man1/nc_openbsd.1.gz
  подчинённый netcat: /bin/nc.openbsd
  подчинённый netcat.1.gz: /usr/share/man/man1/nc_openbsd.1.gz
/bin/nc.traditional — приоритет 10
  подчинённый nc.1.gz: /usr/share/man/man1/nc.traditional.1.gz
  подчинённый netcat: /bin/nc.traditional
  подчинённый netcat.1.gz: /usr/share/man/man1/nc.traditional.1.gz
Это не то!
Меняем:

Код: Выделить всё

olej@nvme:~$ sudo update-alternatives --config nc
Есть 2 варианта для альтернативы nc (предоставляет /bin/nc).

  Выбор   Путь             Приор Состояние
------------------------------------------------------------
* 0            /bin/nc.openbsd       50        автоматический режим
  1            /bin/nc.openbsd       50        ручной режим
  2            /bin/nc.traditional   10        ручной режим

Нажмите «enter», чтобы не менять текущий выбор[*], или введите нужное число: 2
update-alternatives: используется /bin/nc.traditional для предоставления /bin/nc (nc) в ручном режиме
Вот теперь это то:

Код: Выделить всё

olej@nvme:~$ update-alternatives --display nc
nc - ручной режим
 лучшая версия ссылки — /bin/nc.openbsd
  ссылка сейчас указывает на /bin/nc.traditional
  ссылка nc — /bin/nc
  подчинённая nc.1.gz — /usr/share/man/man1/nc.1.gz
  подчинённая netcat — /bin/netcat
  подчинённая netcat.1.gz — /usr/share/man/man1/netcat.1.gz
/bin/nc.openbsd — приоритет 50
  подчинённый nc.1.gz: /usr/share/man/man1/nc_openbsd.1.gz
  подчинённый netcat: /bin/nc.openbsd
  подчинённый netcat.1.gz: /usr/share/man/man1/nc_openbsd.1.gz
/bin/nc.traditional — приоритет 10
  подчинённый nc.1.gz: /usr/share/man/man1/nc.traditional.1.gz
  подчинённый netcat: /bin/nc.traditional
  подчинённый netcat.1.gz: /usr/share/man/man1/nc.traditional.1.gz

Код: Выделить всё

olej@nvme:~$ which nc
/usr/bin/nc

Код: Выделить всё

olej@nvme:~$ ls -l /usr/bin/nc
lrwxrwxrwx 1 root root 20 мар 11  2022 /usr/bin/nc -> /etc/alternatives/nc

Код: Выделить всё

olej@nvme:~$ ls -l /etc/alternatives/nc
lrwxrwxrwx 1 root root 19 дек 17 23:09 /etc/alternatives/nc -> /bin/nc.traditional

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

shell: эхо-сервер TCP

Непрочитанное сообщение Olej » 18 дек 2023, 01:08

Olej писал(а):
18 дек 2023, 01:01
А теперь реально по сети
Вот на этом хосте:

Код: Выделить всё

olej@nvme:~$ ip -4 a s enp3s0
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.1.241/16 brd 192.168.255.255 scope global dynamic noprefixroute enp3s0
       valid_lft 100388sec preferred_lft 100388sec
Эхо сервер:

Код: Выделить всё

olej@nvme:~$ nc -l -p 50000 -c 'xargs -n1 echo'
На другом хосте клиент:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ nc 192.168.1.241 50000
123 
123
"два русских слова"
два русских слова
"1 2 3 4 5 6 7"
1 2 3 4 5 6 7
^C
Всё замечательно коннектится и ретранслируется :!:
Единственный минус для меня в том, что по завершению клиента (по ^C или любым другим способом) - сервер тоже завершается. Вот на хосте сервера после этого:

Код: Выделить всё

olej@nvme:~$ ps -A | grep nc
    555 ?        00:00:47 irqbalance
   1157 ?        00:00:13 cinnamon-launch
  25972 ?        00:00:00 jfsSync

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

shell: эхо-сервер TCP

Непрочитанное сообщение Olej » 18 дек 2023, 01:17

Olej писал(а):
18 дек 2023, 01:08
Единственный минус для меня в том, что по завершению клиента (по ^C или любым другим способом) - сервер тоже завершается.
Хорошо бы, чтоб сервер висел, как обычно бывает, и ждал следующего коннекта...
Решаю это так:
- Запуск удалённого сервера:

Код: Выделить всё

olej@nvme:~$ while true; do nc -l -p 50000 -c 'xargs -n1 echo'; done;
И к такому серверу могут поочерёдно (сервер то последовательный :!: ) подключаться сколько угодно клиентов, разного вида и из разных локаций:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ nc 192.168.1.241 50000
123
123
456
456
^C

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ nc 192.168.1.241 50000
asdgadf
asdgadf
фывафыв
фывафыв
^C

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ telnet 192.168.1.241 50000
Trying 192.168.1.241...
Connected to 192.168.1.241.
Escape character is '^]'.
12
12
3456
3456
"что желаете?"
что желаете?
telnet
telnet
^]
telnet> quit
Connection closed.
Эхо-сервер при этом висит как вкопанный ... до тех пор ровно, пока я не остановлю его по ^C

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

shell: эхо-сервер TCP

Непрочитанное сообщение Olej » 18 дек 2023, 01:34

Olej писал(а):
18 дек 2023, 00:56
По мотивам:
Поиск по-быстренькому показывает, что довольно много пишут в тему - тема актуальная: Как сделать эхо-сервер на конкретном порту в Linux
И приводятся разные варианты самого "отзеркаливающего" скрипта.
Сервер:

Код: Выделить всё

olej@R420:~/sdc3$ nc -l -p 50001 -c '/bin/cat'
Клиент:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ nc 127.0.0.1 50001
12345
12345
два слова
два слова
русская строка
русская строка
^C
Отличная особенность такого сервера в том, что для многословных строк не нужно никаких кавычек!

Код: Выделить всё

olej@R420:~/sdc3$ nc -l -p 50002 -e '/bin/cat'

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ nc 127.0.0.1 50002
123
123
45 67 89
45 67 89
русская строка
русская строка
^C
И, как я понял по публикации, такая команда будет работать и в OpenBSD реализации NetCat.
Но проверять это у меня нет уже ни сил, ни желания. :-?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

shell: эхо-сервер TCP

Непрочитанное сообщение Olej » 18 дек 2023, 01:37

Olej писал(а):
18 дек 2023, 01:34
Клиент:
Но при использовании клиентом telnet, проявляются всё те же его задрочки, что некоторые строки, по содержанию, не ретранслируются :cry:

Код: Выделить всё

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Go$ telnet 127.0.0.1 50002
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
12 3 4
12 3 4
русская строка
ещё строка
ещё строка
^]
telnet> quit
Connection closed.
Строка "русская строка" ушла "в молоко" :evil:
Но это нужно разбираться с опциями telnet, я думаю.

Ответить

Вернуться в «Сети»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 16 гостей