Aqui está minha situação: estou configurando um equipamento de teste que, a partir de um cliente central, iniciará várias instâncias de máquina virtual e, em seguida, executará comandos nelas via ssh
. As máquinas virtuais terão nomes de host e endereços IP não utilizados anteriormente, portanto, não estarão no ~/.ssh/known_hosts
arquivo no cliente central.
O problema que estou tendo é que o primeiro ssh
comando executado em uma nova instância virtual sempre aparece com um prompt interativo:
The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?
Existe uma maneira de contornar isso e fazer com que o novo host já seja conhecido pela máquina cliente, talvez usando uma chave pública que já esteja incorporada à imagem da máquina virtual? Eu realmente gostaria de evitar ter que usar o Expect ou qualquer outra coisa para responder ao prompt interativo, se puder.
IMO, a melhor maneira de fazer isso é o seguinte:
Isso garantirá que não haja entradas duplicadas, que você esteja coberto para o nome do host e o endereço IP, e também fará o hash da saída, uma medida de segurança extra.
Defina a
StrictHostKeyChecking
opção comono
, no arquivo de configuração ou via-o
:ssh -o StrictHostKeyChecking=no [email protected]
Para os preguiçosos:
-H hashe o nome do host/endereço IP
Como mencionado, usar o key-scan seria a maneira correta e discreta de fazê-lo.
O acima fará o truque para adicionar um host, SOMENTE se ainda não tiver sido adicionado. Também não é seguro de simultaneidade; você não deve executar o trecho na mesma máquina de origem mais de uma vez ao mesmo tempo, pois o arquivo tmp_hosts pode ficar sobrecarregado, levando o arquivo known_hosts a ficar inchado ...
Você pode usar
ssh-keyscan
o comando para pegar a chave pública e anexá-la ao seuknown_hosts
arquivo.É assim que você pode incorporar o ssh-keyscan ao seu jogo:
esta seria uma solução completa, aceitando a chave do host apenas pela primeira vez
Para fazer isso corretamente, o que você realmente quer fazer é coletar as chaves públicas do host das VMs conforme você as cria e soltá-las em um arquivo em
known_hosts
formato. Você pode usar o-o GlobalKnownHostsFile=...
, apontando para esse arquivo, para garantir que está se conectando ao host ao qual acredita que deveria estar se conectando. No entanto, como você faz isso depende de como você está configurando as máquinas virtuais, mas lê-lo no sistema de arquivos virtual, se possível, ou até mesmo fazer com que o host imprima o conteúdo/etc/ssh/ssh_host_rsa_key.pub
durante a configuração pode resolver o problema.Dito isso, isso pode não valer a pena, dependendo do tipo de ambiente em que você está trabalhando e de quem são seus adversários esperados. Fazer um simples "armazenar na primeira conexão" (por meio de uma varredura ou simplesmente durante a primeira conexão "real"), conforme descrito em várias outras respostas acima, pode ser consideravelmente mais fácil e ainda fornecer um pouco de segurança. No entanto, se você fizer isso, sugiro fortemente que você altere o arquivo de hosts conhecidos do usuário (
-o UserKnownHostsFile=...
) para um arquivo específico para esta instalação de teste específica; isso evitará poluir seu arquivo de hosts conhecidos pessoais com informações de teste e facilitará a limpeza das agora inúteis chaves públicas quando você excluir suas VMs.Eu faço um script de uma linha, um pouco longo mas útil para fazer essa tarefa para hosts com vários IPs, usando
dig
ebash
O seguinte evita entradas duplicadas em ~/.ssh/known_hosts: