LINUX.ORG.RU

перенаправление вывода bash в сокет

 ,


0

1

открыто 2 терминала: в 1 запущено nc -lvp 4444 во 2 я хочу подключиться к 1,чтоб получать с него команды и вывод направлять в 1 терминал, ввожу: nc 127.0.0.0 4444 | bash &> /dev/tcp/127.0.0.0/4444

соединение устанавливается, но вывода от запущенного bash’а не получаю ни в одном терминале.(команды он ,по всей видимости, выполняет). Как решение нашел такую комбинацию 0>&1 , она меня в ступор вгоняет, в man’е я прочел ,что такая комбинация ([n]>word), открывает файл word на запись из потока n, но ведь 0 ,в моем случае, это входной поток и получается этой комбинацией я делаю его выводом направленым туда же куда и &1 (в /dev/tcp… ?) вообщем подскажите ,где я неправильно думаю , и почему моя комбинация изначальная не работает так как я предполагал?


По идее, ваша исходная команда устанавливала одно соединения на порт 4444 от nc, и пыталась установить второе tcp-соединения на этот же порт от bash. Но это были разные соединения (с разным исходящим портом). А nc в терминале 1 принимает только одно соединение.

Одно приложение (bash) не может подключится к tcp-соединению другого приложения (nc). Кто из них (bash или nc) устанавливал соедение с nc в первом терминале определяйте сами. Выполнял ли bash команды можно проверить, например, посмотрев список процессов, во время когда bash выполняет, допустим, «sleep 100» или дав команду, создающую файл.

В результате перенаправления 0>&1, похоже, что вы ввод/вывод bash'а направили в его сокет (/dev/tcp), а nc (и pipe) вобще стал не нужен.

В с помощью ss (или netstat), желательно от root, чтобы были имена процессов, посмотрите какие у вас tcp-соединения устанавливаются.

mky ★★★★★
()

Сервер:

#!/bin/bash

coproc nc -l localhost -p 4444

while read -r cmd; do
  case "$cmd" in
    d) date ;;
    q) kill "$COPROC_PID"
       exit ;;
    *) echo "What?" ;;
  esac
done <&${COPROC[0]} >&${COPROC[1]}
Клиент как скрипт:
#!/bin/bash
exec 42<>/dev/tcp/localhost/4444  # open bidirectional socket on fd 42
echo d >&42  # send message
cat <&42      # read response
echo q >&42  # send message
# close fd (both sides)
exec 42<&-    
exec 42>&-

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)