
У меня был ~/.ssh/config
файл, который работал нормально. Он был в таком формате:
Host *
IdentityFile ~/.ssh/id_null
TCPKeepAlive no
ServerAliveCountMax 5000
Host *.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host github.com
User gcb
IdentityFile ~/.ssh/id_domain
(у него было гораздо больше доменов, но давайте пока проигнорируем их)
Он работал отлично, даже в руководстве говорилось, что более конкретные шаблоны хостов должны быть сверху, так он всегда работал отлично. Я всегда подключался по ssh к этим двум доменам, и правильные ключи идентификации подбирались просто отлично. У меня никогда не было проблем, когда к этим двум доменам пытались применить ключ null. И я использовал это годами. Всегда получал правильного пользователя и ключ. Я использовал этот же файл конфигурации и на Debian, и на Fedora, и на OSX.
Сегодня на osx 10.10 (OpenSSH_6.2p2, OSSLShim 0.9.8r 8 декабря 2011 г.), которая работала раньше, я попытался также добавить User unkown
правило *
вверху. и внезапно, теперь каждый раз, когда я пытаюсь подключиться к ssh, ssh отправляет user=unkown и identityfile=id_null, что не позволяет войти в систему. Это заставило меня прочитать страницу руководства для ssh_config и оставить все точно по книге... и это все равно не работает. Я также попытался удалить запись User
из, *
но это не исправило ситуацию.
мой текущий .ssh/config
файл
Host exact.hostname.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host *.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host github.com
User gcb
IdentityFile ~/.ssh/id_domain
Host *
IdentityFile ~/.ssh/id_null
TCPKeepAlive no
ServerAliveCountMax 50
он все равно попытается использовать id_null в качестве файла идентификации, когда я ssh exact.hostname.domain.com
. Я также пробовал использовать множественный шаблон и есть Host *.domain.com exact.hostname.domain.com
вместо повторения. Ничего не работает. Есть идеи, что там не так?
Как можно задать параметры по умолчанию User
и IdentityFile
переопределить их для каждого домена?
правка 1: я добавил Host exact.hostname.domain.com
к обеим частям до и после единицы *
и ssh -vvv
показывает:
debug1: /Users/.../.ssh/config line 1: Applying options for exact.hostname.domain.com
debug1: /Users/.../.ssh/config line 19: Applying options for *
debug1: /Users/.../.ssh/config line 37: Applying options for exact.hostname.domain.com
но я все равно в концеno such identity: .ssh/id_null: No such file or directory
правка 2: еще одна странность, которую я увидел наssh -vvv
он всегда пытается использовать все ключи, которые у меня есть. Поэтому я подумал, что у него может быть какое-то жестко закодированное значение по умолчанию для .ssh/id_rsa*
, поэтому я переместил все свои приватные ключи в , чтобы .ssh/keys/
скрыть его от этого значения по умолчанию, и обновил определенные Host
записи... оказалось, он пытается использовать ключи из всех записей хоста! даже тех, у которых нет совпадений!
Подводя итог, у меня есть по одному определенному совпадению хоста вверху и внизу файла (просто для надежности), затем хосты, которые не совпадут, и еще *
один.
но ssh -vvv показывает:
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /Users/x/.ssh/keys/id_rsa_git (0x7f954b700530),
debug2: key: /Users/x/.ssh/keys/id_rsa (0x7f954b415700), explicit
debug2: key: /Users/x/.ssh/id_null (0x0), explicit
Почему, черт возьми, он добавляет данные .ssh/keys/id_rsa_git
, если это IdentityFile
единственное, о чем упоминается ниже Host github.com
? И почему он в конечном итоге пытается отправить данные, id_null
даже если они соответствуют явным, Host exact.hostname.domain.com
как указано в отладочном выводе debug1: /Users/.../.ssh/config line 1: Applying options for exact.hostname.domain.com
?
правка 3:
после того, как я переместил все свои ключи в .ssh/keys/*
и указал там только ключи для каждого хоста в ssh_config
, теперь я вижу при каждом ssh
создании экземпляра:
/Users/me/.ssh/id_*[^p][^u][^b]: No such file or directory
но даже после этого, этовсе ещезагружает IdentityFiles издругойhosts в ssh_config при подключении. Почему?!
решение1
man ssh-config
говорит:
Поскольку для каждого параметра используется первое полученное значение, в начале файла следует указать больше специфичных для хоста объявлений, а в конце — общие значения по умолчанию.
Поэтому убедитесь, что нужная вам конфигурация находится в первой совпавшей Host
записи, как показано в ssh -vv
совпадающих строках: Applying options for
.
В общем случае это означает, что Host *
должно бытьпоследний.