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 представляют собой порт, удаленный хост и порт соответственно.
