如何删除远程计算机上的authorized_keys文件中的重复行

问题描述 投票:0回答:2

我们的 Linux 机器上有时会有巨大的

/root/.ssh/authorized_keys
文件,这是因为文件中有很多重复行,如下所示

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6yaJuzX2QldXj9jI/IYbJQuYDTUf232IbkefUDG4sZxkkScbiqC4skJs9bC58iovYxMVLB7YijIHDri7ONfKzixooSfpf8x18JdmSTkEl7WVTPm3TI/fPVP7DDOoBbqpTeZzS6cFVRMceve3ecFp/Z
D02RfLy6FHu3Y9o55g4Hlm+IgRq+QflsSoY3khZhaxofyzYIchg9NI1RzEZJQEBIMlQZMd+bRiBoAtzqI2BtKd5YmnBmxGHhnZLswSeo7hz+2cAPe+Ng37V91cSuygQJyKf20f1DmhSKHvHEDU3EXDPbjO8H0LNz6OEhsjwUj+G5dcJA04wY0Y1+qCfRz
kR [email protected]
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6yaJuzX2QldXj9jI/IYbJQuYDTUf232IbkefUDG4sZxkkScbiqC4skJs9bC58iovYxMVLB7YijIHDri7ONfKzixooSfpf8x18JdmSTkEl7WVTPm3TI/fPVP7DDOoBbqpTeZzS6cFVRMceve3ecFp/Z
D02RfLy6FHu3Y9o55g4Hlm+IgRq+QflsSoY3khZhaxofyzYIchg9NI1RzEZJQEBIMlQZMd+bRiBoAtzqI2BtKd5YmnBmxGHhnZLswSeo7hz+2cAPe+Ng37V91cSuygQJyKf20f1DmhSKHvHEDU3EXDPbjO8H0LNz6OEhsjwUj+G5dcJA04wY0Y1+qCfRz
kR [email protected]
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6yaJuzX2QldXj9jI/IYbJQuYDTUf232IbkefUDG4sZxkkScbiqC4skJs9bC58iovYxMVLB7YijIHDri7ONfKzixooSfpf8x18JdmSTkEl7WVTPm3TI/fPVP7DDOoBbqpTeZzS6cFVRMceve3ecFp/Z
D02RfLy6FHu3Y9o55g4Hlm+IgRq+QflsSoY3khZhaxofyzYIchg9NI1RzEZJQEBIMlQZMd+bRiBoAtzqI2BtKd5YmnBmxGHhnZLswSeo7hz+2cAPe+Ng37V91cSuygQJyKf20f1DmhSKHvHEDU3EXDPbjO8H0LNz6OEhsjwUj+G5dcJA04wY0Y1+qCfRz
kR [email protected]

删除这些重复行以便只出现唯一行的最佳方法是什么?

我们需要通过远程计算机上的 ssh 删除重复的行

bash ssh
2个回答
5
投票

可以使用

ssh
客户端在远程服务器上运行命令

ssh hostname '
    cd /root/.ssh; 
    cp -a authorized_keys authorized_keys.orig;
    sort -u authorized_keys -o authorized_keys
'

为了可读性,将其编写为多行代码。整个内容也可以在一行上(在这种情况下,无需将其括在

''
中)。

如果绝对不需要备份 (

.orig
),只需删除
cp ...
行即可。

这样做明显改变了行的顺序。如果这是一个问题,您可以运行一个脚本或单行代码,它可以保留顺序。


如果还有更多工作要做,在远程服务器上运行单行代码的一种方法是

ssh hostname << 'CMD'
cd /root/.ssh/
perl -i.orig -wne'$uniq{$_} = 1; }{ print for keys %uniq' authorized_keys
CMD

}{
语法启动一个
END
块,该块在处理完所有行后运行。如果确实不需要备份,请删除
.orig
,因此仅保留
-i
开关(以就地更改文件)。

上面仍然只是删除重复项,但可以用可能需要的其他 Perl 代码替换或修改

''

 下的代码。例如,要保留唯一行之间的顺序,可以使用此 Perl 命令行程序(“one-liner”)而不是上面的程序

perl -MList::Util=uniq -i.orig -wne' push @lines, $_; END { print for uniq @lines }' authorized_keys
这里我们使用核心模块 

List::Util

 中的 
uniq,它从输入列表中返回唯一元素。它保留(可能)重复元素中的第一个元素并保持顺序。我假设 authorized_keys
 文件不能太大而无法全部读入内存。

有关单行代码的更多信息,请参阅

perlrun 中的“命令开关”。 请注意,上面使用的“

heredoc

”语法中的关键字位于引号 ('CMD') 下,以抑制 shell 的变量扩展。

    


3
投票

ssh ... "cd ~/.ssh; mv authorized_keys authorized_keys.bkup; sort -u authorized_keys.bkup > authorized_keys; chmod 600 authorized_keys"

假设从头开始重建
authorized_keys

将是一个主要的PITA,我选择保留当前文件的副本......以防万一拼写错误弄乱了

authorized_keys
的内容,在这种情况下你有一个可以恢复的备份副本(一旦您可以成功登录到远程主机)。
我还想追踪哪个进程正在生成所有重复条目并修复它(以便它不会生成重复条目)。

© www.soinside.com 2019 - 2024. All rights reserved.