В Bash есть малоизвестная возможность работать с TCP через псевдоустройства
/dev/tcp.Никакого
nc, telnet или отдельного сетевого клиента не требуется.▪️Проверить, доступен ли TCP-порт
if (echo > /dev/tcp/127.0.0.1/5432) 2>/dev/null; then
echo "порт открыт"
else
echo "соединение не установлено"
fi
Bash сам пытается выполнить TCP
connect() к указанному адресу.▪️Можно получить обычный файловый дескриптор
exec 3<>/dev/tcp/example.com/80
Теперь FD
3 связан с TCP-соединением:printf 'GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n' >&3
cat <&3
exec 3>&-
То есть сетевой сокет можно использовать почти как файл.
▪️Почему это удобно в скриптах
Например, простая проверка нескольких сервисов:
for port in 22 80 443 8080; do
if (echo > /dev/tcp/127.0.0.1/$port) 2>/dev/null; then
echo "$port: open"
else
echo "$port: closed"
fi
done
Это удобно для минимальных recovery/health-check скриптов, когда не хочется зависеть от
nc.▪️Но есть важный нюанс
/dev/tcp - не настоящий файл устройства. Bash распознаёт специальный путь и превращает обращение к нему в сетевой системный вызов.Поэтому:
ls -l /dev/tcp
не покажет какой-то TCP-интерфейс.
И работает это именно как возможность Bash, а не универсальная функция любого
/bin/sh.Например, в Bash:
bash -c 'echo > /dev/tcp/127.0.0.1/22'
а поведение другого shell может быть совершенно другим.
BashTex 📱 #bash #TCP