bash - 如何删除远程机器上 authorized_keys 文件中的重复行

标签 bash awk sed

我们的 linux 机器上有时会有很大的 /root/.ssh/authorized_keys 文件,这是因为文件中有很多重复行,如下所示

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

删除此重复行以便只显示唯一行的最佳方法是什么?

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

最佳答案

可以使用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 block ,该 block 在处理完所有行后运行。如果确实不需要备份,请删除 .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 文件不能太大而无法全部读入内存。

参见 "Command switches" in perlrun有关单线的更多信息。

请注意,上面使用的“heredoc”语法中的关键字在引号下 ('CMD'),以抑制 shell 的变量扩展。

关于bash - 如何删除远程机器上 authorized_keys 文件中的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64669823/

相关文章:

android - bash 列出所有目录,子目录,文件夹,子文件夹然后输出到一个单独的文件

linux - 用于压缩文件并通过邮件发送 zip 的脚本

linux - 如何awk打印子字符串并修剪bash中同一子字符串的尾随和结尾空格

perl - 收集具有相似列的数据

从文件中获取第 n 行的 Bash 工具

linux - 从 mysql-slow.log 文件中删除重复行

linux - 我如何更改日期格式(sed 命令)

bash cat 所有文件名中包含特定字符串的文件

linux - 运行文件夹中的所有 shell 脚本

java - 如何直接从bash启动java执行程序