/etc/ssh/sshd_config 文件中的允许组

/etc/ssh/sshd_config 文件中的允许组

以下sed命令添加my_unix_admins到以单词 开头的行的末尾AllowGroups

/bin/sed -i '/^AllowGroups / s/$/ my_unix_admins/' /etc/ssh/sshd_config

我只想添加 my_unix_admins如果行中尚不存在的情况(为了不重复条目)。

换句话说,检查它并仅在该行中不存在时添加它。

我怎么做 ?

答案1

一种方法是首先匹配AllowGroups行,然后如果该行不包含“my_unix_admins”,则执行您已经拥有的行尾替换:

sed '/^AllowGroups/ { /my_unix_admins/ !s/$/ my_unix_admins/; }' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new

这使用大括号将“my_unix_admins”搜索分组到AllowGroups 匹配中。这里的另一个重要特征是!反转执行 s// 替换功能仅有的在做的线上不是匹配之前的范围(此处为 /my_unix_admins/ 模式搜索)。

我已经链接到 GNU sed 在线手册,假设您使用的是 GNU sed,但大括号和反转功能都是由 POSIX 指定所以你也可以查阅当地的手册页。原始命令的唯一非 POSIX 功能是-iGNU sed 支持的选项。

我能想象的唯一极端情况是,如果您在AllowGroups行中有一个名为“astronomy_unix_admins”或“my_unix_admins_on_mars”的组;那么简单的 /my_unix_admins/ 模式匹配将错误匹配。为了避免潜在的错误匹配,您可以使用 GNU sed 并使用以下选项启用扩展正则表达式(用于交替|-E并使用:

sed -E '/^AllowGroups/ { / my_unix_admins( |$)/ !s/$/ my_unix_admins/; }' < /etc/ssh/sshd_config > /etc/ssh/sshd_config.new

这两个变化是:

  • 需要在组名称之前有一个前导空格 - 如果它是列表中的第一个组或列表中的其他任何位置,则为真。
  • 需要尾随空格(这将防止行中间的错误匹配)或行尾标记(这允许该组成为行中的最后一个)。

相关内容