ssh-copy-id e duplicatas em authorized_keys

3

Eu quero digitar a senha apenas uma vez ao conectar ao SSH, então eu uso o ssh-copy-id e instalo o meu pubkey em chaves autorizadas.

Mas eu não rastreeio quais servidores já possuem minha chave e quais não, então eu emito ssh-copy-id novamente, o que adiciona chave duplicada a authorized_keys?

  1. Como impedir que o ssh-copy-id instale a chave quando ela já estiver instalada?
  2. / * Como tornar a instalação da chave automática e transparente ao conectar-se ao SSH (sem explícito ssh-copy-id ? * /
por Vi. 30.03.2011 / 11:05

3 respostas

2

How to prevent ssh-copy-id from installing the key when it is already installed?

Escreva seu próprio roteiro. Tudo que o ssh-copy-id faz é anexar uma linha a um arquivo. O seguinte seria verificar a existência da chave:

#!/bin/bash
cat ~/.ssh/id_* | ssh "$@" 'mkdir -pm 0700 ~/.ssh &&
    while read -r ktype key comment; do
        if ! (grep -Fw "$ktype $key" ~/.ssh/authorized_keys | grep -qsvF "^#"); then
            echo "$ktype $key $comment" >> ~/.ssh/authorized_keys
        fi
    done'

How to make key installation automatic and transparent when connecting to SSH (without explicit ssh-copy-id?

Você não pode, porque se o servidor não tiver sua chave pública, ela também não saberá de onde obtê-la.

    
por 30.03.2011 / 12:18
1

Para evitar duplicatas, você pode modificar ssh-copy-id .

Eu fiz isso para o ssh-copy-id distribuído com o openssh-client do Debian, que para mim era a versão 1: 6.0p1-4. Em resumo, modifiquei

cat >> ~/.ssh/authorized_keys

para

t=$(tempfile); cat ~/.ssh/authorized_keys - | sort -u > $t && mv $t ~/.ssh/authorized_keys

Aqui está um patch ( diff -c /usr/bin/ssh-copy-id.orig /usr/bin/ssh-copy-id )

*** /usr/bin/ssh-copy-id.orig   2013-02-08 23:18:09.000000000 +0100
--- /usr/bin/ssh-copy-id    2013-12-12 23:14:48.705964476 +0100
***************
*** 41,47 ****
  # strip any trailing colon
  host='echo $1 | sed 's/:$//''

! { eval "$GET_ID" ; } | ssh $host "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1 || true)" || exit 1

  cat <<EOF
  Now try logging into the machine, with "ssh '$host'", and check in:
--- 41,47 ----
  # strip any trailing colon
  host='echo $1 | sed 's/:$//''

! { eval "$GET_ID" ; } | ssh $host 'sh -c "umask 077; mkdir -p ~/.ssh ; t=$(tempfile); cat ~/.ssh/authorized_keys - | sort -u > \$t && mv \$t ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1 || true)"' || exit 1

  cat <<EOF
  Now try logging into the machine, with "ssh '$host'", and check in:

Quanto a 2 (automático), você não pode, mas se você corrigir o ssh-copy-id para evitar duplicatas, não importa se você executar ssh-copy-id demais.

    
por 12.12.2013 / 16:17
-1

O link funciona para você? Basicamente, o truque é você primeiro adicionar a chave e depois disso você exclui todas as ocorrências da chave com a exceção da última (Dólar + Ponto de Exclamação):

#!/bin/bash -ex
# ssh-copy-id-uniq.sh

user=$1
host=$2
publicKey=$3
privateKey=$4

LOCAL_HOST_NAME='hostname'

USAGE="Usage: 'basename $0'    "

if [ $# -ne "4" ] 
then
 echo $USAGE
  exit 1 
fi

su $user -c "ssh-copy-id -i $publicKey $user@$host"
ssh -i $privateKey $user@$host "sed -i \"\\$!{/$user@$LOCAL_HOST_NAME/d;}\" ~/.ssh/authorized_keys"
    
por 20.07.2012 / 05:32