我只想在连接到 SSH 时输入一次密码,因此我使用 ssh-copy-id 并将我的公钥安装到授权密钥中。
但是我没有跟踪哪些服务器已经拥有我的密钥,哪些服务器没有,所以我有时会再次发出 ssh-copy-id,这会将重复的密钥添加到authorized_keys中吗?
- 当密钥已安装时,如何防止 ssh-copy-id 安装密钥?
- /* 如何在连接到 SSH 时使密钥安装自动且透明(无需显式
ssh-copy-id
?*/
答案1
当密钥已安装时,如何防止 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?
你不能,因为如果服务器还没有你的公钥,它就不知道从哪里获取它。
答案2
为了避免重复,您可以修改ssh-copy-id
。
我已经对 Debian openssh-client 中分发的 ssh-copy-id 进行了此操作,对我来说,它是版本 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:
ssh-copy-id
至于 2(使其自动),你不能,但如果你修补 ssh-copy-id 以避免重复,那么运行太多也没关系。
答案3
将要http://thinkinginsoftware.blogspot.com/2012/07/avoid-duplicates-in-authorizedkeys.html对你有用吗?基本上,诀窍是先添加键,然后删除所有出现的键,但最后一个除外(美元符号+感叹号):
/bin/bash -ex # ssh-复制-id-uniq.sh 用户=$1 主机=$2 公钥=$3 私钥=$4 LOCAL_HOST_NAME=`主机名` USAGE="用法:`basename $0`" 如果[$#-ne“4”] 然后 回显 $USAGE 出口 1 菲 su $用户-c“ ssh-copy-id -i $公钥$用户@$主机” ssh -i $privateKey $user@$host "sed -i \"\\\$!{/$user@$LOCAL_HOST_NAME/d;}\" ~/.ssh/authorized_keys"