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:
$ 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...'
pssh
Detalhes de alto nível
cat <pubkey>
gera o arquivo de chave pública para pssh
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
pede pssh
para solicitar sua senha e reutilizá-la para todos os servidores aos quais se conecta
-i
diz pssh
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 pssh
serã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 ~/.ssh
e ignore o aviso se já estiver lá
- defina uma variável,,
$afile
com 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 $afile
ser 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 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 dos pssh
interruptores '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/config
arquivo. Obviamente, você também pode usar printf
para 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 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.