Exemplo simplificado:
host one
user cat
host two
hostname 2
host three
hostname 3
host *
hostname 1
host *
user apple
identityFile ~/.ssh/id_rsa
host y
hostname 7
host t
hostname 8
host *
user duck
identityFile ~/.ssh/quack
Isso é possível?
Os hosts acima do primeiro host *
herdariam apenas seus valores, e os segundos hosts herdariam apenas os host *
abaixo deles.
Se não, existe uma maneira de conseguir isso?
Não sei exatamente o que você deseja alcançar aqui, mas sei três coisas:
Salvo indicação em contrário no manual , para cada parâmetro será utilizado o primeiro valor obtido.
Host
restringe as seguintes declarações (até a próximaHost
ouMatch
palavra-chave) apenas para os hosts que correspondem a um dos padrões fornecidos após a palavra-chave.É bom não pensar em
Host
/Match
como seções separadas. É bom perceber o arquivo de configuração como uma única configuração grande onde algumas configurações são filtradas .Nesta resposta vou chamá-los de "seções", apenas porque preciso chamá-los de alguma coisa .
No seu exemplo simplificado,
hostname 1
no primeirohost *
irá "ganhar" com qualquerhostname
posterior no arquivo porquehost *
sempre corresponde. E tudo abaixo do últimohost *
é totalmente inútil porqueuser
apareceidentityFile
anteriormente no arquivo abaixo do segundohost *
.O manual afirma explicitamente:
Múltiplas
Host *
seções são permitidas, ou seja, elas não quebrarão a sintaxe; mas quase nunca fazem sentido. Supondo que você não use nenhum parâmetro que se acumule quando usado diversas vezes (há poucos), considere o seguinte procedimento:Seções vizinhas
Host *
(como a 1ª e a 2ª) podem ser escritas como uma seção. MesclarHost *
seções sempre que possível. Caso algum parâmetro apareça em mais de umaHost *
seção a ser mesclada então lembre-se que o primeiro irá "ganhar", descarte todos os outros.Para cada
Host *
seção, de cima para baixo:Host *
seção não estiver no final e declarar um parâmetro que aparece mais tarde no arquivo (ou seja,Host whatever
mais tarde no arquivo), então a declaração posterior será irrelevante e poderá ser removida porque aquela naHost *
seção (ou algo anterior) vencerá de qualquer maneira . Remova a declaração irrelevante. Faça um loop até que não haja mais nada para remover.Host *
seção não está no final e contém apenas parâmetros que não aparecem posteriormente no arquivo (ou seja,Host whatever
mais adiante no arquivo). Isso significa que a seção também pode estar no final. Mova-o até o fim.Host *
seções no final. Se sim, mescle-os.Este procedimento fornecerá exatamente uma
Host *
seção no final do arquivo de configuração.Uma
Host *
seção que não esteja no final do arquivo faz sentido nestes casos:Para parâmetros que se acumulam quando usados diversas vezes. Geralmente a ordem deles é importante. Por exemplo, você pode querer especificar uma
Host *
seção comIdentityFile
no início do arquivo, para que uma determinada chave "principal" sempre seja tentada primeiro , não importa qual seja o host. Em seguida,Host whatever
as seções podem especificar chaves (específicas para hosts) a serem tentadas posteriormente . Finalmente, umaHost *
seção no final do arquivo pode especificar chaves "genéricas" a serem tentadas por último .Caso você queira substituir alguns parâmetros que possam aparecer posteriormente no arquivo no futuro. Imagine que você deseja ter certeza de que se alguém (incluindo você) tentar definir esse parâmetro posteriormente no arquivo (por exemplo, em
Host y
), sua tentativa será inútil. No entanto, isso pode facilmente levar à frustração.Caso você queira substituir temporariamente alguns parâmetros que aparecem posteriormente no arquivo. Para isso você cria uma
Host *
seção temporária não no final do arquivo e não aplica o procedimento acima (isso moveria a seção para o final), porque você deseja reverter facilmente a alteração simplesmente removendo a seção e assim restaurando o estado antigo do arquivo de configuração. A aplicação do procedimento possivelmente removeria algumas declarações em outras seções e a reversão não seria tão fácil.