/ dev / tcp listen вместо nc listen

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, я не могу установить новое программное обеспечение, и они не подключены к Интернету)

h3rrmiller
источник
Если не считать написания скрипта на Python для поддержания сокета открытым, есть ли простой способ сделать это?
h3rrmiller
Связанный stackoverflow.com/questions/4739196/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

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

К сожалению, это невозможно сделать только с помощью bash. /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, фактически серверный процесс зацикливает принятие соединений и процессы порождения или создание потоков, или он может принимать только одно соединение одним
Науэль Фуйе
2
@NahuelFouilleul: Это не совсем правильно. Вы можете обрабатывать множество клиентов одним потоком / процессом, используя так называемое «асинхронное» или «управляемое событиями» сетевое программирование (попробуйте поискать в Google функцию select () и то, как ее можно использовать в сетевом программировании). Во многих случаях это гораздо лучший (более быстрый) способ приема большого количества клиентов.
Кшиштоф Адамски
Спасибо, я не
думал
4
Для этого и есть xinetd. Он выполняет прослушивание и порождает ваш произвольный процесс / скрипт для любых входящих соединений. С ним все может стать сервером TCP / IP.
Evi1M4chine
0

Нет способа слушать, потому что слушание не в духе, как указал Адамски.

Но вам не нужно слушать на клиенте, поэтому вам не нужен netcat на клиенте для передачи файлов, например:

## 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
A.Danischewski
источник
-3

вы можете сделать это, как вы сказали, спросив / dev / tcp, с помощью bash:

</dev/tcp/host/port

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

serpiko
источник
4
Нет. Вы определенно не проверяли это, и если вы это сделали, вы не должны понимать результаты. Ваше предложение откроет сокет (не слушает) и перенаправит на любую команду, которую вы запустили. Правильный ответ уже найден (почти 6 лет назад ...), поэтому я не уверен, почему вы выбрали этот вопрос.
h3rrmiller