ssh-copy-id и дубликаты в авторизованных ключах

Я хочу набрать пароль только один раз при подключении к SSH, поэтому я использую ssh-copy-id и устанавливаю свой pubkey в авторизованные ключи.

Но я не отслеживаю, на каких серверах уже есть мой ключ, а на каких нет, поэтому иногда я снова выдаю ssh-copy-id, который добавляет дублированный ключ к авторизованному ключу?

  1. Как предотвратить ssh-copy-id от установки ключа, когда он уже установлен?
  2. / * Как сделать автоматическую и прозрачную установку ключей при подключении к SSH (без явного ssh-copy-id? */

3 ответа

Как предотвратить ssh-copy-id от установки ключа, когда он уже установлен?

Напишите свой собственный сценарий. Все ssh-copy-id делает это добавить строку в файл. Следующее будет проверять наличие ключа:

#!/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'

Как сделать установку ключей автоматической и прозрачной при подключении к SSH (без явного ssh-copy-id?

Вы не можете, потому что, если на сервере еще нет вашего открытого ключа, он также не будет знать, где его получить.

Чтобы избежать дубликатов, вы можете изменить ssh-copy-id,

Я сделал это для ssh-copy-id, распространяемого с openssh-клиентом Debian, который для меня был версией 1:6.0p1-4. Короче я модифицировал

cat >> ~/.ssh/authorized_keys

в

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

Вот такой патч (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:

Что касается 2 (сделать это автоматически), вы не можете, но если вы исправите ssh-copy-id, чтобы избежать дублирования, не имеет значения, если вы запустите ssh-copy-id перебор.

Будет ли у вас работать http://thinkinginsoftware.blogspot.com/2012/07/avoid-duplicates-in-authorizedkeys.html? В основном хитрость заключается в том, что вы сначала добавляете ключ, а после этого удаляете все вхождения ключа, за исключением последнего (доллар + восклицательный знак):

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

Пользователь =$1
хост =$2
ОткрытыйКлюч =$3
PrivateKey = $ 4

LOCAL_HOST_NAME = `hostname`

USAGE = "Использование: `basename $0`    "

если [ $# -ne "4" ] 
затем
 echo $USAGE
  выход 1 
фи

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"
Другие вопросы по тегам