Очевидно TCP-соединения могут использоваться в качестве файловых дескрипторов на Linux из bash / zsh. Следующая функция использует эту технику и должна быть быстрее, чем вызов netcat / telnet.
function EPHEMERAL_PORT() {
LOW_BOUND=49152
RANGE=16384
while true; do
CANDIDATE=$[$LOW_BOUND + ($RANDOM % $RANGE)]
(echo "" >/dev/tcp/127.0.0.1/${CANDIDATE}) >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo $CANDIDATE
break
fi
done
}
Инструкции по использованию: привяжите вывод к переменной и используйте в скриптах. Проверено на Ubuntu 16.04
root@ubuntu:~> EPHEMERAL_PORT
59453
root@ubuntu:~> PORT=$(EPHEMERAL_PORT)