/ dev / tcp прослуховувати замість nc прослуховувати


39

З слухачем netcat:

nc -l <port> < ~/.bashrc

Я можу схопити свій .bashrc на новій машині (не має ncабо LDAP) за допомогою:

cat < /dev/tcp/<ip>/<port> > ~/.bashrc

Моє запитання: чи є спосіб імітувати можливості nc -l <port>в моєму першому рядку з / dev / tcp замість nc?

Машини, над якими я працюю, надзвичайно загартовані в середовищі лабораторії / пісочниці RHEL (ні ssh, ні nc, ні LDAP, ні yum, я не можу встановити нове програмне забезпечення, і вони не підключені до Інтернету)


окрім написання сценарію python, щоб зберегти сокет відкритим, чи є простий спосіб досягти цього?
h3rrmiller

Відповіді:


23

Якщо встановлено Perl (як це буде на машині RHEL):

perl -MIO::Socket::INET -ne 'BEGIN{$l=IO::Socket::INET->new(
  LocalPort=>1234,Proto=>"tcp",Listen=>5,ReuseAddr=>1);
  $l=$l->accept}print $l $_' < ~/.bashrc

буде працювати, якщо локальний брандмауер не дозволяє вхідні з'єднання до 1234.

Якщо встановлено socat:

socat -u - tcp-listen:1234,reuseaddr < ~/.bashrc

Якщо zsh встановлено:

zmodload zsh/net/tcp
ztcp -ld3 1234 && # start listening socket on fd 3
  ztcp -ad4 3 && # accept connection on fd 4
  ztcp -c 3 && # close the listening socket that is no longer needed
  cat < ~/.bashrc >&4 && # send the data
  ztcp -c 4 # close the communication socket to tell the other end we're finished

Чи не повинна остання ztcp -c 4команда прочитати 3? Інакше чудова інформація, чудова порада.
dezza

@dezza, див. редагувати. Сокет на fd 3 насправді не був закритий (хоча це було б, коли сценарій припиняється). Нам потрібно закрити розетку на fd 4, щоб інший кінець отримав EOF.
Стефан Шазелас

42

На жаль, це неможливо зробити просто з басом. /dev/tcp/<ip>/<port>віртуальні файли реалізовані так, як bash намагається підключитися до заданої функції <ip>:<port>за допомогою connect(2). Для того щоб створити прослуховувальний сокет, йому доведеться викликати bind(2)функцію.

Ви можете перевірити це, завантаживши bashджерела та переглянувши їх. Він реалізований у lib/sh/netopen.cфайлі в_netopen4 функції (або _netopen6, який також підтримує IPv6). Ця функція використовується функцією обгортки netopenз того самого файлу, яка в свою чергу безпосередньо використовується у файлі redir.c( redir_special_openфункції) для здійснення цього віртуального перенаправлення.

Ви повинні знайти якесь інше додаток, яке може створити розетку для прослуховування на вашій машині.


+1 bash дозволяє створити клієнтський сокет, але серверний сокет ви можете використовувати nc або можна реалізувати за допомогою perl або c, адже серверний процес буде циклічно приймати з'єднання та нерестуючі процеси або створювати потоки, або він може приймати лише одне з'єднання одним
Nahuel Fouilleul

2
@NahuelFouilleul: Це не зовсім правильно. Ви можете обробити безліч клієнтів лише одним потоком / процесом, використовуючи так зване мережеве програмування "асинхронний" або "керований на події" (спробуйте функцію googling для функції select () та як це можна використовувати в мережевому програмуванні). У багатьох випадках це набагато кращий (швидший) спосіб приймати багато клієнтів.
Кшиштоф Адамський

Дякую, я не хотів цього рішення
Nahuel Fouilleul

4
Це те, для чого xinetd. Він виконує прослуховування та породжує ваш довільний процес / сценарій для будь-яких вхідних з'єднань. З його допомогою будь-що може стати сервером TCP / IP.
Evi1M4chine

0

Немає способу слухати, тому що слухання не в курсі, як зазначив Адамський.

Але вам не потрібно слухати клієнта, так що вам не потрібна мережа на клієнті для передачі файлів, наприклад:

## To send a file to the locked down computer: 
 ## Local server where you do have netcat 
cat ~/.bashrc | nc -l -q 1 -p 8998

 ## Remote locked down computer without netcat
cat < /dev/tcp/local.server.ip.addr/8998 > latest.bashrc 

## To grab a file from the locked down computer: 
 ## First - on the local server run 
nc -l -p 8998 -q 1 > remote.bashrc < /dev/null 

 ## Then on the locked down computer run: 
cat ~/.bashrc > /dev/tcp/local.server.ip.addr/8998 0<&1 2>&1

-3

ви можете зробити це, як ви сказали, запитуючи / dev / tcp, використовуючи bash:

</dev/tcp/host/port

якщо він запускається негайно, він прослуховує, в будь-якому випадку вичерпується


4
Ні. Ви напевно цього не перевіряли, і якщо це зробили, ви не повинні розуміти результатів. Ваша пропозиція відкриє сокет (не слухає) і перенаправить на будь-яку команду, яку ви виконували. Правильна відповідь уже знайдена (майже 6 років тому ...), тому я не впевнений, чому ви вирішили некротизувати це питання.
h3rrmiller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.