Em vez de digitar sua senha várias vezes, você pode usar psshe sua -Aopçã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:
$ cat ~/.ssh/my_id_rsa.pub \
| pssh -h ips.txt -l remoteuser -A -I -i \
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7
O script acima é geralmente estruturado da seguinte maneira:
$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'
psshDetalhes de alto nível
cat <pubkey> gera o arquivo de chave pública para pssh
psshusa o -Iswitch 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)
-Apede psshpara solicitar sua senha e reutilizá-la para todos os servidores aos quais se conecta
-idiz psshpara 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 psshserão executados em cada servidor:
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
Em ordem:
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:
$ ls -ld ~/.ssh ~/.ssh/authorized_keys
drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
-rw------- 1 remoteuser remoteuser 771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
crie o diretório ~/.sshe ignore o aviso se já estiver lá
- defina uma variável,,
$afilecom o caminho para o arquivo allowed_keys
cat - >> $afile - pegue a entrada do STDIN e adicione ao arquivo allowed_keys
sort -u $afile -o $afile - classifica exclusivamente o arquivo allowed_keys e o salva
NOTA: 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 $afileser avaliados até depois da execução no servidor remoto.
' \
..cmds... \
'
Eu expandi o que foi exposto acima para facilitar a leitura aqui, mas geralmente executo tudo em uma única linha, da seguinte forma:
$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'
Material bônus
Usando psshvocê 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 dos psshinterruptores 's, -H "ip1 ip2 ip3".
Por exemplo:
$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...
O exemplo acima pode ser usado para extrair uma lista de IPs do meu ~/.ssh/configarquivo. Obviamente, você também pode usar printfpara gerar conteúdo dinâmico:
$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....
Por exemplo:
$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09
Você também pode usar seqpara gerar seqüências de números formatados também!
Referências e ferramentas similares a pssh
Se você não quiser usar psshcomo eu fiz acima, existem outras opções disponíveis.