У меня есть несколько устройств с удаленным управлением согласно этому описанию , так что для подключения с моего сервера я набираю:
ssh localhost -p 2870
Поскольку у меня есть связка хостов, которыми я управляю, я хотел сократить это, чтобы я мог просто набрать:
ssh 2870
Я не хочу использовать псевдонимы bash (с тех пор я не мог также использовать SCP и Ansible), поэтому попробовал это в ~ / .ssh / config
:
Host 28??
HostName localhost
Port %h
Это не удается, поскольку по какой-либо причине% h не расширяется в строке порта (это будет в HostName и других). Поэтому попробовал это вместо этого:
Host 28??
ProxyCommand ssh -v localhost -p %h
Здесь% h расширяется ОК, и я вижу, что он входит в сервер ОК (через открытый ключ), но я не получаю приглашения.
Есть идеи, как я могу сделать это «псевдоним» в конфигурации ssh?
Похоже, что расширение% 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