Похоже, что расширение% h просто не работает в директиве Port. Если вы не против заполнить .ssh / config большим количеством записей, нетрудно сгенерировать их динамически (особенно если у вас есть список или они последовательные):
$(for port in `seq 2000 2900`
do
echo Host $port
echo " Hostname localhost"
echo " Port ${port}"
echo ""
done) >> ~/.ssh/config
Поскольку мы можем посмотреть исходный код код для ssh, можно подтвердить, что расширение не выполняется для порта:
readconf.c: https://github.com/openssh/openssh-portable/blob/dc664d1bd0fc91b24406a3e9575b81c285b8342b/readconf.c
Вызывает функцию percent_expand для параметров хоста и exec - это, по-видимому, функция, которая преобразует% h в имя хоста. Эта же функция вызывается из ssh.c. Интересно, что ProxyCommand откладывает расширение этих переменных на потом. Это не требуется для директивы Port.
https://github.com/openssh/openssh-portable/blob/ed877ef653847d056bb433975d731b7a1132a979/misc.c