Eu tenho um número arbitrário de servidores com a mesma combinação de usuário / passe. Quero escrever um script (que chamo uma vez) para que
ssh-copy-id user@myserver
é chamado para cada servidor. Como todos eles têm o mesmo usuário / senha, isso deve ser fácil, mas ssh-copy-id
quer que eu digite a senha separadamente cada vez, o que anula o objetivo do meu script. Não há opção para inserir uma senha, ou seja ssh-copy-id -p mypassword user@myserver
.
Como posso escrever um script que preenche automaticamente o campo de senha quando ssh-copy-id
solicitado?
Respostas:
Dê uma olhada no sshpass . Coloque sua senha em um arquivo de texto e faça algo assim:
fonte
Você pode usar o esperar para ouvir o prompt de senha e enviar sua senha:
Salve o script, torne-o executável e chame-o como:
./login.expect user@myserver
fonte
spawn
? Por razões que não consigo controlar, estou preso ao bash v3.2.spawn: command not found
spawn
é uma palavra-chave expect (consulte o manual expect (1)). Parece que o script está sendo interpretado como shell, e não como esperado. Você espera instalado? O que acontece se você executar esperar diretamente:expect -f login.expect user@myserver
spawn ssh-copy-id -o StrictHostKeyChecking=no $argv
A resposta do quanta é muito boa, mas requer que você coloque sua senha em um arquivo de texto.
Na página do manual "sshpass":
Portanto, o que você pode fazer é capturar a senha uma vez durante o script, armazená-la em uma variável, repetir a senha e canalizar para sshpass como entrada.
Eu faço isso o tempo todo e funciona bem. Exemplo:
echo "Please insert the password used for ssh login on remote machine:" read -r USERPASS for TARGETIP in $@; do echo "$USERPASS" | sshpass ssh-copy-id -f -i $KEYLOCATION "$USER"@"$TARGETIP" done
fonte
Este é um problema com o ssh-copy-id; Ele também adiciona uma chave toda vez que você a executa. Se você estiver automatizando o processo, seu arquivo allowed_keys ficará rapidamente cheio de chaves duplicadas. Aqui está um programa Python que evita os dois problemas. Ele é executado no servidor de controle e coloca as chaves de um servidor remoto em outro servidor remoto.
fonte
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, será necessário rolar seu próprio método para anexar o arquivo de chave de publicação 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 criaremos 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
Ansible's authorized_key_module
parece não funcionar para nova máquina. Eu tenho que ssh-copy-id xxx primeiro, então estou procurando uma maneira de usar ansible add ssh-key para nova máquina, alguma idéia?Uma das ferramentas SSH paralelas (clusterssh, mssh, pssh) pode ser apropriada para você.
Por exemplo, use cssh para efetuar login em todas as máquinas e acrescentar a chave você mesmo.
fonte
Algumas coisas que podem se encaixar na conta:
Como mencionado em outras respostas, o sshpass é provavelmente a solução mais fácil.
fonte
Quero enfatizar o quão ruim é uma idéia:
Aqui está uma implementação que é um pouco mais segura ...
fonte