Recentemente, recebi acesso de nome de usuário / senha a uma lista de servidores e quero propagar minha chave pública SSH para esses servidores, para que eu possa efetuar login com mais facilidade.
Para que fique claro:
- Não há nenhuma chave pública preexistente nos servidores remotos que eu possa utilizar para automatizar isso
- É a primeira vez que faço login nesses servidores e gostaria de não precisar digitar constantemente minhas credenciais para acessá-los.
- Também não quero digitar minha senha repetidamente usando
ssh-copy-id
um loop for.
ssh-copy-id
, bombeando minha senha repetidamente.Respostas:
Em vez de digitar sua senha várias vezes, você pode usar
pssh
e sua-A
opção para solicitá-la uma vez e depois alimentar a senha para todos os servidores em uma lista.OBSERVAÇÃO:
ssh-copy-id
no entanto, o uso desse método não permite o uso , portanto, você precisará rolar seu próprio método para anexar seu arquivo de chave de pub SSH ao arquivo da sua conta remota~/.ssh/authorized_keys
.Exemplo
Aqui está um exemplo que faz o trabalho:
O script acima é geralmente estruturado da seguinte maneira:
pssh
Detalhes de alto nívelcat <pubkey>
gera o arquivo de chave pública parapssh
pssh
usa o-I
switch para ingerir dados via STDIN-l <remote user>
é a conta do servidor remoto (presumimos que você tenha o mesmo nome de usuário nos servidores do arquivo IP)-A
pedepssh
para solicitar sua senha e reutilizá-la para todos os servidores aos quais se conecta-i
dizpssh
para enviar qualquer saída para STDOUT em vez de armazená-la em arquivos (seu comportamento padrão)'...cmds to add pubkey...'
- esta é a parte mais complicada do que está acontecendo, então eu vou explicar isso sozinha (veja abaixo)Comandos sendo Executados em Servidores Remotos
Estes são os comandos que
Em ordem:pssh
serão executados em cada servidor:defina o umask do usuário remoto como 077, para que todos os diretórios ou arquivos que vamos criar tenham suas permissões definidas da seguinte maneira:
crie o diretório
~/.ssh
e ignore o aviso se já estiver lá$afile
com o caminho para o arquivo allowed_keyscat - >> $afile
- pegue a entrada do STDIN e adicione ao arquivo allowed_keyssort -u $afile -o $afile
- classifica exclusivamente o arquivo allowed_keys e o salvaNOTA: Esse último bit é para lidar com o caso em que você executa as opções acima várias vezes nos mesmos servidores. Isso evitará que seu pubkey seja anexado várias vezes.
Observe os carrapatos únicos!
Também preste atenção especial ao fato de que todos esses comandos estão aninhados dentro de aspas simples. Isso é importante, pois não queremos
$afile
ser avaliados até depois da execução no servidor remoto.Eu expandi o que foi exposto acima para facilitar a leitura aqui, mas geralmente executo tudo em uma única linha, da seguinte forma:
Material bônus
Usando
pssh
você pode abdicar de construir arquivos e quer fornecer conteúdo dinâmico usando-h <(...some command...)
ou você pode criar uma lista de IPs usando outro dospssh
interruptores 's,-H "ip1 ip2 ip3"
.Por exemplo:
O exemplo acima pode ser usado para extrair uma lista de IPs do meu
~/.ssh/config
arquivo. Obviamente, você também pode usarprintf
para gerar conteúdo dinâmico:Por exemplo:
Você também pode usar
seq
para gerar seqüências de números formatados também!Referências e ferramentas similares a
pssh
Se você não quiser usar
pssh
como eu fiz acima, existem outras opções disponíveis.fonte
pssh
é um script Python e pode ser instalado compip install pssh
. (2) Você também pode gerarssh
chaves em todos os servidores simultaneamente, executandossh-keygen
atravéspssh
. (3) Após gerar as chaves, você pode distribuir as chaves "todos para todos", copiando todas as chaves públicas em um loop para a máquina local, montando-as em comumauthorized_keys
e copiando-as para cada máquina.ssh_agent
/ssh_add
pode ajudar com as senhas.cat
prêmio (antigo): para iniciar um pipeline com o conteúdo de um arquivo, basta redirecionar a entrada desse arquivo.pssh
.cat ~/.ssh/*.pub | ...
. Pode ou não ser o que você deseja nesta situação.Usando alternativa
xargs
,sshpass
essh-copy-id
:Supondo que suas credenciais estejam em credentials.txt no formato
user:password@server
:Você poderia fazer:
Nota: Lembre-se de remover credentials.txt após o uso!
fonte
O ClusterSSH fornece uma janela em cada máquina e uma janela comum para controlar todas as janelas.
Se estivermos falando de 10 máquinas, isso funcionará. Se estamos falando de 100 máquinas, haverá muitas janelas.
A vantagem do ClusterSSH é que, se uma máquina não for 100% como as demais, basta clicar na janela e enviar pressionamentos de tecla apenas para essa máquina antes de voltar a enviar pressionamentos de tecla para todas as máquinas.
fonte
Usar o Ansible é bastante simples. Apenas substitua
<USER>
pelo nome de login realfonte
Algumas coisas que podem se encaixar na conta:
Como mencionado em outras respostas,
sshpass
é provavelmente a solução mais fácil.fonte
Você tem duas opções aqui:
Você pode criar um arquivo com todos os endereços IP dos servidores e faça o seguinte
Supondo que
servers.txt
seja o arquivo com IPs / nomes de host.Você pode colocar todos os seus IPs / nomes de host em um loop e executar
ssh-copy-id
como abaixo:fonte
ssh-copy-id
um loop for".