我的谷歌搜索结果没什么帮助,所以我在这里问。
我的 Ubuntu 服务器现在在两个文件中都有许多重复的~/.ssh/authorzied_keys
条目~/.ssh/known_hosts
我想知道是否有一个命令/实用程序可以删除这些重复的行并仅列出它们一次?
答案1
命令行实用程序称为uniq
和sort
。您可以简单地通过它们管道传输文件以仅获取唯一的条目:
sort ~/.ssh/authorized_keys | uniq > ~/.ssh/authorized_keys.uniq
然后用新文件替换旧文件:
mv ~/.ssh/authorized_keys{.uniq,}
它们~/.ssh/known_hosts
由自身处理ssh
,不应包含任何重复项(如果您手动修改它,它可以,然后您可以使用与上面相同的方法)。
答案2
ssh-keygen -R hostname
将删除指定主机名的条目
答案3
我的问题是来自一台具有不同主机密钥的主机的多个条目。这是来自 Jenkins 构建奴隶。应用程序服务器已重建。主机名/IP 已移至新服务器,但主机密钥不同。这是我想出的一个衬里:
cat known_hosts | cut -f1 -d' ' | sort | uniq -c | \
sed '/^ *1 /d' | awk '{print $2}' | while read line; do \
ssh-keygen -R $line; ssh-keyscan $line; \
done
获取known_hosts中的第一个字段,对其进行排序,uniq -c
以计算每个主机名的实例数,sed
删除计数为1的任何行,然后ssh-keygen -R
删除主机,最后ssh-keyscan
将当前主机密钥添加回known_hosts。
警告:如果您不希望主机密钥发生更改,那么您应该在运行此命令之前弄清楚它们为什么会更改。主机密钥可确保您连接到您期望的主机(而不是中间主机中的某个人)。
答案4
由于您想保留每个重复项之一,最简单的解决方案可能是仅使用文本编辑器删除每个文件中不再包含正确信息的行。