我必须编辑一些文件来取消注释一行、更改该行上的值或取消注释一行。我正尝试通过 bash 脚本执行此操作。
我正在尝试编辑/etc/ssh/sshd_config
和更改
IgnoreRhosts yes
#RhostsRSAAuthentication no
到
IgnoreRhosts no
RhostsRSAAuthentication no
并改变
#PermitRootLogin yes
到
PermitRootLogin no
AllowUsers mroberts
并编辑/etc/pam.d/system-auth
文件以便更改
password sufficient pam_unix.so try_first_pass use_authtok nullok md5
到
password sufficient pam_unix.so try_first_pass use_authtok nullok md5 shadow
我还需要将此行添加到/etc/pam.d/system-auth
文件中:
/etc/pam.d/system-auth file password required pam_unix.so remember=10
我一直使用手动方式完成所有这些操作vi
,并且我可以通过该编辑器进行更改。但是,我必须在很多主机上执行此过程,并且无法一次在一台主机上重复该过程。我犯了一个错误,忘记添加AllowUsers mroberts
,导致被锁定在主机之外近 36 小时。
我不知道如何搜索一行并更改其中的一部分而不是整行。
有没有办法从终端或通过 bash 脚本进行这样的更改?
答案1
一次做出多项改变
取出原始文件并将其保存为
sshd_config.orig
。sshd_config
按照您喜欢的内容进行编辑。跑步
diff sshd_config.orig sshd_config >config.patch
将文件保存
config.patch
在安全的地方。
现在,只要您有新的未编辑版本sshd_config
并且想要应用相同的编辑,请运行:
patch sshd_config /path/to/config.patch
这会将相同的编辑应用于新文件,或者如果存在某些不一致之处而没有您的帮助就无法解决,则会向您发出警告。
进行个别更改
Unix 还具有强大的命令行工具,无需编辑器即可更改文件。
使用sed
,例如:
sed -i.bak 's/IgnoreRhosts yes/IgnoreRhosts no/' sshd_config
或者,使用 GNU awk 执行相同的更改:
gawk -i inplace '$1=="IgnoreRhosts" {$2="no"} 1' sshd_config
该patch
方法可让您轻松地同时进行多项更改。对于较少数量的更改,sed
请awk
使用 Excel。要了解有关 的更多信息sed
,请参阅,例如本教程。要了解更多信息awk
,请参阅本教程。