Copiando a chave SSH local para o host remoto, se ele já não existir

1

Existem muitos tutoriais disponíveis para uma simples cópia de chave SSH, mas nenhum que verifique se a chave já não existe remotamente. Isso deve funcionar:

cat ~/.ssh/id_rsa.pub | ssh -p <port> <user>@<hostname> 'sh -c "if ( ! grep -q ''cat -'' ~/.ssh/authorized_keys); then cat - >>~/.ssh/authorized_keys; fi"'

O cat - dentro do grep não é interpolado em uma única string, mas sim em 3, e isso elimina a coisa toda. Eu fiz isso em Ruby e funciona, mas não é o ideal. Qualquer bash pro ao redor?

  Net::SSH.start(<host>, <username>, :password => <password>, :port => <port>) do |ssh|
    local_public_key = 'cat ~/.ssh/id_rsa.pub'.chomp
    ssh.exec! %{
      if ( ! grep -q '#{local_public_key}' ~/.ssh/authorized_keys ); then echo '#{local_public_key}' >> ~/.ssh/authorized_keys; fi
    }
    
por gerhard 27.03.2011 / 01:49

3 respostas

3

Use apenas uma variável assim:

KEY=$(cat ~/.ssh/id_rsa.pub) ssh -p <port> <user>@<hostname> "if [ -z \"\$(grep \"$KEY\" ~/.ssh/authorized_keys )\" ]; then echo $KEY >> ~/.ssh/authorized_keys; echo key added.; fi;"
    
por 27.03.2011 / 04:55
0

Por que não usar apenas ssh-copy- id ?

NAME

 ssh-copy-id -- copy public   keys to a remote host

SYNOPSIS

 ssh-copy-id [-lv] [-i keyfile] [-o   option] [-p port] [user@]hostname

DESCRIPTION

 The ssh-copy-id utility copies public keys   to a remote host's
 ~/.ssh/authorized_keys file (creating the file and   directory, if
 required).

 The following options are available:

 -i   file
   Copy the public key contained in file.  This option can be speci-
   fied multiple times and can be combined with the -l option.  If a
   private key is specified and a public key is found then the pub-
   lic key will be used.

 -l        Copy the keys currently held by ssh-agent(1).  This is the
   default if the -i option was not specified.

 -o   ssh-option
   Pass this option directly to ssh(1).  This option can be speci-
   fied multiple times.

 -p   port
   Connect to the specified port on the remote host instead of the
   default.

 -v        Pass -v to ssh(1).

 The remaining arguments are a list   of remote hosts to connect to, each
 one optionally qualified by a user   name.

EXIT STATUS

 The ssh-copy-id utility exits 0 on   success, and >0 if an error occurs.

EXAMPLES

 To   send a specific key to multiple hosts:
 $ ssh-copy-id -i /path/to/keyfile.pub user@host1 user@host2
 user@host3
    
por 01.09.2017 / 16:38
0

Pergunta antiga, talvez, mas você também pode executar:

ssh -q -o "BatchMode=yes" user@hostname exit

Qual se o ssh-copy-id all happend tiver sucesso e retornar 0. Se não retornar um erro.

    
por 24.10.2018 / 16:26

Tags