Me deparei com esse comportamento e queria saber se ele é intencional e/ou documentado, porque não consegui encontrar nada.
A página de manual da minha versão do ssh indica ssh_config
/ Include
:
A diretiva include pode aparecer dentro de um bloco Match ou Host para realizar a inclusão condicional.
Dados os seguintes arquivos:
# ~/.ssh/config
Host doesnotexist.nonexistanttld
Include ~/.ssh/inc
# ~/.ssh/inc
Match host * exec "touch do-not-touch"
Posso observar isso:
$ ssh foo
ssh: Could not resolve hostname foo: nodename nor servname provided, or not known
$ ls
do-not-touch
A razão para isso parece ser esta:
debug3: $HOME/.ssh/config line 2: Including file $HOME/.ssh/inc depth 0 (parse only)
debug2: checking match for 'host * exec "touch do-not-touch"' [...]
(observe o parse only
)
Eu não esperaria que isso acontecesse. Então, novamente, isso é intencional? Existe uma boa razão para isso em vez de apenas ler, analisar e executar correspondências em arquivos realmente incluídos?
Presumo que, como em muitas outras sintaxes de arquivos de configuração, a
Include
diretiva e a suaInclude ~/.ssh/inc
não são realmente 100% condicionais (apesar da sua indentação e do manual). Mas sim, o analisador de configuração primeiro inclui todo e qualquer trecho de configuração (aninhado) em uma única configuração efetiva (substituindo efetivamente aInclude file_name
linha pelo conteúdo defile_name
) e só então avalia esse arquivo de configuração mesclado.O resultado mesclado para o seu exemplo seria
Uma
Host
diretiva restringe as diretivas de configuração subsequentes até a próxima diretivaHost
ouMatch
e, portanto, não há configurações específicas para doesnotexist.nonexistanttld eexec "touch do-not-touch"
será executada para cada host.A propósito, estas perguntas e respostas relatam o mesmo https://unix.stackexchange.com/q/734537