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

6268
Vi.

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

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

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

3 ответа на вопрос

2
grawity

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

Write your own script. All ssh-copy-id does is append a line to a file. The following would check for key's existence:

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

You cannot, because if the server doesn't have your public key already, it will not know where to get it from, either.

"You cannot" -> I can, it is like trying to run "ssh-copy-id" every time before connecting or auto-executing certain commands after connecting. Vi. 13 лет назад 0
Хорошо, вы можете запускать `ssh-copy-id` каждый раз перед подключением - но имхо, это лениво и неэффективно. (В моем $ LOCATION рукопожатие SSH иногда может занимать до 5 секунд, поэтому мне это не нравится.) Достаточно будет скопировать один раз ключ - просто не забудьте сделать это * при первом * подключении к новый сервер. (Если вы управляете десятками или сотнями серверов, значит, вы используете неправильный метод аутентификации.) grawity 13 лет назад 0
"just remember to do it the first time you connect to a new server" -> such things should be "remembered" by computer, not user. Vi. 13 лет назад 0
@Vi: Но только пользователь знает, следует ли скопировать ключ _should_ в удаленную систему (и если да, то какой ключ: у меня их четыре). Кроме того, где именно ключ должен быть помещен и в каком формате - у OpenSSH есть один, но не единственный (к сожалению, RFC 4819 не очень распространен). grawity 13 лет назад 0
@Vi: [Этот хак] (http://pastie.org/1736206) может работать как `ProxyCommand` в вашей конфигурации клиента SSH. grawity 13 лет назад 0
1
mivk

Чтобы избежать дубликатов, вы можете изменить 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слишком много.

-1
Nestor Urquiza

Will http://thinkinginsoftware.blogspot.com/2012/07/avoid-duplicates-in-authorizedkeys.html work for you? Basically the trick is you first add the key and after that you delete all occurrences of the key with the exception of the last one (Dollar+Exclamation Mark):

#!/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" 
Было бы более полезно, если бы он удалял ключи на основе самого ключа, но не комментария - комментарий может отличаться для одного и того же ключа. OTOH может быть несколько ключей с одним и тем же комментарием, которые следует сохранить. blueyed 12 лет назад 2
@blueyed: Не уверен, что вы имели в виду, но я добавил некоторые пояснения на случай, если команда sed не ясна. Строка удаляется не по комментарию, а по комбинации имени пользователя и хоста. Там не должно быть никаких других ключей для этого пользователя и имени хоста, мы согласились бы. Nestor Urquiza 12 лет назад 0

Похожие вопросы