有时我想自动添加一个configuration到一个conf文件,我可以在后面以脚本方式删除,例如我想暂时让10台主机login到远程系统日志服务器。 所以我在剧本里是这样的
##some other commands echo "kern.* @syslog.server.local" >> /etc/syslog.conf service syslogd restart
不过经常更新一些其他的命令并再次运行脚本。 显然这不是幂等的,我不能重新应用它没有一些grep /删除jiggerpokery,我不能轻易地删除它。
所以我已经采取了这样的事情;
cat <<HEREDOC >>/etc/syslog.conf ###some unique string### echo "kern.* @syslog.server.local" ###end some unique string### HEREDOC
这使我可以做到这一点,使操作可重复…
sed -e 's/###some unique string###(*)###end some unique string###/replacement/g' /tmp/syslog.conf > /tmp/syslog.conf cat <<HEREDOC >>$dfile ###some unique string### echo "kecrn.* @syslog.server.local" ###end some unique string### HEREDOC
然而这一切似乎有点多…
(显然,/etc/httpd/conf.d/someconffile.conf安排已经解决了这个问题,为新的包)
有没有更简单的方法来做到这一点?
任何警告,我应该知道这种方法?
我用这个SVN。 假使,假设
开始pipe理这个文件的configuration
cp /etc/syslog.conf /configs/etc/ svn add /configs/etc/syslog.conf svn commit -m "Managing syslog.conf"
通过脚本进行更改
#echo some stuff into the file.. no need for extra markup/metadata cp /etc/syslog.conf /configs/etc/ svn commit -m "I added some junk temporarily" service syslogd restart
现在您可以回滚到以前的版本。 如果在添加和回滚之间进行了其他永久更改,则可以使用svn来获取版本之间的差异,并将其合并在一起。
当然,你可以用git或其他什么来代替版本控制。 还可以制作一些永久性的脚本来减less出错的机会,比如一个bash函数,cp根据path把文件放到你的签出仓库中,把一个提交注释作为参数。 pipe他呢。
如果你在svn:/// config /里有一个configuration仓库,它包含了etc / syslog.conf ,你知道仓库中最新的东西和文件系统上的活动configuration文件是一样的:
作为部署木偶项目的一部分,我发现了augeas; http://augeas.net/
这是一个configuration文件pipe理工具。
sed通常不会像这样做多线模式。 你可以这样做:
read -d '' -r replacement<<HEREDOC ###some unique string### echo "kecrn.* @syslog.server.local" ###end some unique string### HEREDOC sed -e "/beginmark/i\beginmark\n$replacement\nendmark" -e '/beginmark/,/endmark/d'` filename
你也不能redirect到同一个文件。 它将首先截断文件,然后运行sed (现在是空的)。 您必须使用临时文件或使用--in-place (或-i )选项:
sed -i 'sed commands' filename
要么
sed 'sed commands' filename > tmpfile mv tmpfile filename