当我使用 Linux 时,我会处理很多配置文件,并且因为我喜欢自动化设置过程,所以我充分利用了创建自动化 shell 脚本。
我想找到一种快速有效的方法,专门将多行代码一起附加到文件末尾,但检查代码行是否作为一个整体存在在一起,如果存在则跳过。如果我要继续重新运行脚本,我不希望将重复的文本块一遍又一遍地附加到文件中。
例如,我最近将 OpenSSH 配置为严格只接受 SSH 密钥并防止使用任何密码。但是,我现在想使用匹配选项允许密码仅在特定 IP 地址子网上使用。我想将以下行附加到/etc/ssh/sshd_config文件:
Match Address 192.168.0.0/16
PasswordAuthentication yes
PermitRootLogin yes
如果这些代码行已经存在,我如何检查该文本块是否作为一个整体存在于配置文件中?
我可以使用 grep 搜索单个字符串,但是密码认证和允许根用户登录参数取决于匹配选项。
grep -qxF 'PasswordAuthentication yes' "/etc/ssh/sshd_config" || echo "PasswordAuthentication yes" >> "/etc/ssh/sshd_config"
当我刚接触 Linux 时,我常常备份配置文件,然后将整个heredocs放入该文件中。显然,我可以根据需要多次执行此操作,因为配置文件总是被我需要的内容覆盖,并且原始文件是安全的。