gate() { mkfifo /tmp/sock1 /tmp/sock2 &> /dev/null && nc -p $1 -l < /tmp/sock1 | tee /tmp/sock2 & PID=$! && nc $2 $3 < /tmp/sock2 | tee /tmp/sock1; kill -KILL $PID; rm -f /tmp/sock1 /tmp/sock2 ; }
Эта команда создает одноразовый TCP прокси с копированием в stdout. Она выполняет следующие действия:
1. mkfifo /tmp/sock1 /tmp/sock2 &> /dev/null
: Создает именованные каналы (FIFO) /tmp/sock1
и /tmp/sock2
, игнорируя вывод ошибок.
2. nc -p $1 -l < /tmp/sock1 | tee /tmp/sock2
: Запускает netcat
(nc) на порту $1
и слушает входящие соединения, передавая данные из /tmp/sock1
в tee
, что позволяет копировать данные в stdout и в /tmp/sock2
.
3. PID=$!
: Сохраняет идентификатор процесса (PID) nc -l
в переменной $PID
.
4. nc $2 $3 < /tmp/sock2 | tee /tmp/sock1
: Запускает netcat
для подключения к удаленному хосту и порту $2:$3
, передавая данные из /tmp/sock2
в tee
, что также позволяет копировать данные в stdout и в /tmp/sock1
.
5. kill -KILL $PID
: Завершает процесс nc -l
с сигналом KILL
, закрывая прокси после завершения обмена данными.
6. rm -f /tmp/sock1 /tmp/sock2
: Удаляет временные именованные каналы после завершения прокси-сервера.
Эта команда полезна для создания временного TCP прокси-сервера с возможностью копирования данных в stdout. Альтернативные способы включают использование утилиты socat
или написание собственной программы на основе сокетов. Аргументы $1
, $2
и $3
представляют собой порт, удаленный хост и порт соответственно.