bash - 如何删除远程机器上的 authorized_keys 文件中的重复行
问题描述
我们有时 /root/.ssh/authorized_keys
在我们的 linux 机器上有很大的文件,这是因为文件中有很多重复的行,如下所示
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6yaJuzX2QldXj9jI/IYbJQuYDTUf232IbkefUDG4sZxkkScbiqC4skJs9bC58iovYxMVLB7YijIHDri7ONfKzixooSfpf8x18JdmSTkEl7WVTPm3TI/fPVP7DDOoBbqpTeZzS6cFVRMceve3ecFp/Z
D02RfLy6FHu3Y9o55g4Hlm+IgRq+QflsSoY3khZhaxofyzYIchg9NI1RzEZJQEBIMlQZMd+bRiBoAtzqI2BtKd5YmnBmxGHhnZLswSeo7hz+2cAPe+Ng37V91cSuygQJyKf20f1DmhSKHvHEDU3EXDPbjO8H0LNz6OEhsjwUj+G5dcJA04wY0Y1+qCfRz
kR root@server1.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6yaJuzX2QldXj9jI/IYbJQuYDTUf232IbkefUDG4sZxkkScbiqC4skJs9bC58iovYxMVLB7YijIHDri7ONfKzixooSfpf8x18JdmSTkEl7WVTPm3TI/fPVP7DDOoBbqpTeZzS6cFVRMceve3ecFp/Z
D02RfLy6FHu3Y9o55g4Hlm+IgRq+QflsSoY3khZhaxofyzYIchg9NI1RzEZJQEBIMlQZMd+bRiBoAtzqI2BtKd5YmnBmxGHhnZLswSeo7hz+2cAPe+Ng37V91cSuygQJyKf20f1DmhSKHvHEDU3EXDPbjO8H0LNz6OEhsjwUj+G5dcJA04wY0Y1+qCfRz
kR root@server1.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6yaJuzX2QldXj9jI/IYbJQuYDTUf232IbkefUDG4sZxkkScbiqC4skJs9bC58iovYxMVLB7YijIHDri7ONfKzixooSfpf8x18JdmSTkEl7WVTPm3TI/fPVP7DDOoBbqpTeZzS6cFVRMceve3ecFp/Z
D02RfLy6FHu3Y9o55g4Hlm+IgRq+QflsSoY3khZhaxofyzYIchg9NI1RzEZJQEBIMlQZMd+bRiBoAtzqI2BtKd5YmnBmxGHhnZLswSeo7hz+2cAPe+Ng37V91cSuygQJyKf20f1DmhSKHvHEDU3EXDPbjO8H0LNz6OEhsjwUj+G5dcJA04wY0Y1+qCfRz
kR root@server1.com
删除这些重复行以便只出现唯一行的最佳方法是什么?
我们需要删除远程机器上 VIA ssh 的重复行
解决方案
可以使用ssh
客户端在远程服务器上运行命令
ssh hostname '
cd /root/.ssh;
cp -a authorized_keys authorized_keys.orig;
sort -u authorized_keys -o authorized_keys
'
为了便于阅读,这被写成多行代码。整个内容也可以放在一行上(在这种情况下,无需将其括在''
中)。
.orig
如果绝对不需要备份 ( ),只需删除该cp ...
行。
这样做显然会改变行的顺序。如果这是一个问题,您可以运行一个脚本,或一个单行,这可以保留订单。
如果还有更多工作要做,那么在远程服务器上运行 one-liner 的一种方法是
ssh hostname << 'CMD'
cd /root/.ssh/
perl -i.orig -wne'$uniq{$_} = 1; }{ print for keys %uniq' authorized_keys
CMD
该}{
语法启动一个END
块,该块在处理完所有行后运行。如果备份肯定不需要 remove .orig
,那么只留下switch (就地-i
更改文件)。
以上仍然只是删除重复项,但可以用''
可能需要的其他 Perl 代码替换或修改下面的代码。例如,要保持唯一行之间的顺序,可以使用这个 Perl 命令行程序(“one-liner”)而不是上面的那个
perl -MList::Util=uniq -i.orig -wne'
push @lines, $_; END { print for uniq @lines }' authorized_keys
这里我们使用uniq
核心模块List::Util,它从输入列表中返回唯一元素。它保留第一个(可能)重复元素并保持顺序。我假设authorized_keys
文件不能太大而无法全部读入内存。
有关单行的更多信息,请参阅perlrun 中的“命令开关” 。
请注意,上面使用的“ heredoc ”语法中的关键字位于引号 ( 'CMD'
) 下,以抑制 shell 的变量扩展。
推荐阅读
- c# - 为 Blazor 网站的每个页面使用多种解决方案
- python - 如何在csv中选择一个随机单元格
- excel - 具有变量名称的 Excel 结构化引用
- swift - 只有纵向模式不适用于 iPad / Xcode / SwiftUI
- java - 是否需要索引具有唯一约束的列?
- angular - *ngFor 中的角度翻译
- python - 将列表转换为字典的最快方法,列表值作为键,列表索引作为值
- laravel - Laravel 7 whereIn 查询只返回第一个索引
- r - 使用 df1 的两列中的值从 df2 中获取值,并将它们用作索引。与 Excel 中的 index(match(),match()) 方法相同
- powerbi - 查询编辑器中的关键字搜索