SSH: файл конфигурации не используется, как я ожидал

Недавно я обновился от Trusty (14.04) до Xenial (16.04), и теперь у меня другое поведение при использовании ssh и моего файла .ssh/config.

Ранее: в файле конфигурации, когда первое правило применимо к хосту a, чтобы изменить цель Hostname с a на b, а другое правило применимо к b, второе правило будет применено.

Ранее: применяется только первое правило, второе игнорируется.

Вот пример этого нового поведения:

# I added two extra names for "127.0.0.1" : legec@Workstation[.ssh]$ head -2 /etc/hosts 127.0.0.1 localhost 127.0.0.1 foo foo.homesweethome.com # config file : legec@Workstation[.ssh]$ cat ~/.ssh/config # this rule expands "foo" to "foo.homesweethome.com" Host foo Hostname foo.homesweethome.com # this rule sets default port and user for "foo.homesweethome.com" : Host foo.homesweethome.com Port 2222 User foobar # when running ssh : legec@Workstation[.ssh]$ ssh -v foo OpenSSH_7.2p2 Ubuntu-4ubuntu2.2, OpenSSL 1.0.2g 1 Mar 2016 # as you can see in the following two lines, # the first config rule is applied debug1: Reading configuration data /home/legec/.ssh/config debug1: /home/legec/.ssh/config line 1: Applying options for foo # the second rule is skipped debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug1: Connecting to foo.homesweethome.com [127.0.0.1] port 22. debug1: Connection established. [.. extra debug messages about possible keys to present, protocol setup ... ] debug1: Next authentication method: password # I was hoping to see a connection on port 2222, # and asking the password for user foobar : legec@foo.homesweethome.com's password:

Текущий версия моего ssh lib:

legec@Workstation[.ssh]$ ssh -V OpenSSH_7.2p2 Ubuntu-4ubuntu2.2, OpenSSL 1.0.2g 1 Mar 2016

[edit]: Как напомнил мне fkraeim, версия OpenSSH в Trusty (14.04) была 6.6.

Вопросы

Что изменилось в поведении ssh? Как я могу применить оба правила в приведенном выше примере?

Примечание: для более полного контекста, в моем реальном файле конфигурации, конфигурация выглядит так:

Host bar baz Hostname %h.homesweethome.com Host foo Hostname foo.homesweethome.com Host *.homesweethome.com User foobar Port 2222
2
задан 15 December 2017 в 14:19

6 ответов

Это хорошая иллюстрация, что иногда ошибка человека - это особенность другого человека ...

Такое поведение OpenSSH в 14.04 на самом деле является ошибкой, введенной в OpenSSH 6.6 (это версия в Ubuntu 14.04) и зафиксировано в 6.8 (см. также журнал изменений). Правильный способ сделать то, что вы хотите, это

Host bar baz
    Hostname %h.homesweethome.com

Host foo
    Hostname foo.homesweethome.com

Host foo bar baz *.homesweethome.com
    User foobar
    Port 2222

. Альтернативно, возможно, канонизацизация действительно то, что вы хотите ... Например,

CanonicalizeHostname yes
CanonicalDomains homesweethome.com

Host *.homesweethome.com
    User foobar
    Port 2222

... может работать для вас , Разница с вашей текущей конфигурацией заключается в том, что если, например, goo.homesweethome.com существует, ssh goo попытается подключиться к ней.

6
ответ дан 22 May 2018 в 16:59

Это хорошая иллюстрация, что иногда ошибка человека - это особенность другого человека ...

Такое поведение OpenSSH в 14.04 на самом деле является ошибкой, введенной в OpenSSH 6.6 (это версия в Ubuntu 14.04) и зафиксировано в 6.8 (см. также журнал изменений). Правильный способ сделать то, что вы хотите, это

Host bar baz Hostname %h.homesweethome.com Host foo Hostname foo.homesweethome.com Host foo bar baz *.homesweethome.com User foobar Port 2222

. Альтернативно, возможно, канонизацизация действительно то, что вы хотите ... Например,

CanonicalizeHostname yes CanonicalDomains homesweethome.com Host *.homesweethome.com User foobar Port 2222

... может работать для вас , Разница с вашей текущей конфигурацией заключается в том, что если, например, goo.homesweethome.com существует, ssh goo попытается подключиться к ней.

6
ответ дан 18 July 2018 в 01:09

Это хорошая иллюстрация, что иногда ошибка человека - это особенность другого человека ...

Такое поведение OpenSSH в 14.04 на самом деле является ошибкой, введенной в OpenSSH 6.6 (это версия в Ubuntu 14.04) и зафиксировано в 6.8 (см. также журнал изменений). Правильный способ сделать то, что вы хотите, это

Host bar baz Hostname %h.homesweethome.com Host foo Hostname foo.homesweethome.com Host foo bar baz *.homesweethome.com User foobar Port 2222

. Альтернативно, возможно, канонизацизация действительно то, что вы хотите ... Например,

CanonicalizeHostname yes CanonicalDomains homesweethome.com Host *.homesweethome.com User foobar Port 2222

... может работать для вас , Разница с вашей текущей конфигурацией заключается в том, что если, например, goo.homesweethome.com существует, ssh goo попытается подключиться к ней.

6
ответ дан 24 July 2018 в 17:20

Я не знаю, что изменилось между 14.04 и 16.04, но опция CanonicalizeHostnames, похоже, играет определенную роль. Из man ssh_config:

CanonicalizeHostname
 Controls whether explicit hostname canonicalization is performed.
 The default, “no”, is not to perform any name rewriting and let
 the system resolver handle all hostname lookups.  If set to “yes”
 then, for connections that do not use a ProxyCommand, ssh(1) will
 attempt to canonicalize the hostname specified on the command
 line using the CanonicalDomains suffixes and
 CanonicalizePermittedCNAMEs rules.  If CanonicalizeHostname is
 set to “always”, then canonicalization is applied to proxied
 connections too.

 If this option is enabled, then the configuration files are
 processed again using the new target name to pick up any new
 configuration in matching Host and Match stanzas.

Обратите внимание на последний абзац. И когда я добавляю:

Host *
  CanonicalizeHostname yes

Получаю ожидаемый результат:

$ ssh foo                
ssh: connect to host foo.homesweethome.com port 2222: Connection refused
2
ответ дан 22 May 2018 в 16:59
  • 1
    Не кажется хорошей идеей, чтобы включить CanonicalizeHostname только для принудительного повторного анализа; это, конечно, не его цель. – fkraiem 15 December 2017 в 13:55

Я не знаю, что изменилось между 14.04 и 16.04, но опция CanonicalizeHostnames, похоже, играет определенную роль. Из man ssh_config:

CanonicalizeHostname Controls whether explicit hostname canonicalization is performed. The default, “no”, is not to perform any name rewriting and let the system resolver handle all hostname lookups. If set to “yes” then, for connections that do not use a ProxyCommand, ssh(1) will attempt to canonicalize the hostname specified on the command line using the CanonicalDomains suffixes and CanonicalizePermittedCNAMEs rules. If CanonicalizeHostname is set to “always”, then canonicalization is applied to proxied connections too. If this option is enabled, then the configuration files are processed again using the new target name to pick up any new configuration in matching Host and Match stanzas.

Обратите внимание на последний абзац. И когда я добавляю:

Host * CanonicalizeHostname yes

Получаю ожидаемый результат:

$ ssh foo ssh: connect to host foo.homesweethome.com port 2222: Connection refused
2
ответ дан 18 July 2018 в 01:09

Я не знаю, что изменилось между 14.04 и 16.04, но опция CanonicalizeHostnames, похоже, играет определенную роль. Из man ssh_config:

CanonicalizeHostname Controls whether explicit hostname canonicalization is performed. The default, “no”, is not to perform any name rewriting and let the system resolver handle all hostname lookups. If set to “yes” then, for connections that do not use a ProxyCommand, ssh(1) will attempt to canonicalize the hostname specified on the command line using the CanonicalDomains suffixes and CanonicalizePermittedCNAMEs rules. If CanonicalizeHostname is set to “always”, then canonicalization is applied to proxied connections too. If this option is enabled, then the configuration files are processed again using the new target name to pick up any new configuration in matching Host and Match stanzas.

Обратите внимание на последний абзац. И когда я добавляю:

Host * CanonicalizeHostname yes

Получаю ожидаемый результат:

$ ssh foo ssh: connect to host foo.homesweethome.com port 2222: Connection refused
2
ответ дан 24 July 2018 в 17:20
  • 1
    Не кажется хорошей идеей, чтобы включить CanonicalizeHostname только для принудительного повторного анализа; это, конечно, не его цель. – fkraiem 15 December 2017 в 13:55

Другие вопросы по тегам:

Похожие вопросы: