使用Bash,SSH和rsync替换/同步某些行

时间:2015-09-30 19:11:24

标签: bash ssh rsync

我正在寻找一个快速而又脏的单行程序来同步远程配置文件中的某些设置。需要保留唯一的和同步通用设置。例如:

Config1.conf:

HOSTNAME=COMP1
IP=10.10.13.10

LOCATION=SITE_A
BUILDING=DEPT_IT
ROOM=COMP_LAB1

远程Config2.txt:

HOSTNAME=COMP2
IP=10.10.13.11

LOCATION=FOO
BUILDING=BAR
ROOM=BAZ

我需要同步或复制仅替换ssh上的底部3行。顺便说一句,行号是可预测的。在这种情况下,始终是第4,5和6行。

这是一个工作想法,缺少一件(我用来替换本地配置中的变量的非标准实用程序的标准替代品):

for var in $(ssh root@10.10.8.12 'sed -n "4,6p" /etc/conf1.conf');do <missing piece> ${var/=*}=${var/*=} local-conf.conf; done

因此,这使用变量扩展和非标准实用程序,但需要像sed或Perl例程来替换本地conf中的信息。

更新
最后一行代码实际上有效。经过测试和工作!但是 - 缺少的部分是一个自定义的非标准实用程序。我问是否有人可以用标准的Linux工具来解决这个问题。

一种解决方案是采取左侧匹配,然后更换右侧。这基本上就是该实用程序的功能。在conf中查找变量然后设置它。使用变量扩展是一种方式(如图所示)。

1 个答案:

答案 0 :(得分:0)

这是一个替代解决方案,不需要命令具有文件内容的特殊知识:

  1. 获取要同步的文件的副本。然后,在副本中,故意破坏(任意修改)想要同步的行。只要行数相同并且它们永远不会与实际文件内容匹配,它们所说的并不重要。玩得开心。这将成为您的基础版本。您的示例可能如下所示:

    HOSTNAME=foo
    IP=bar
    
    LOCATION=SITE_A
    BUILDING=DEPT_IT
    ROOM=COMP_LAB1
    
  2. rsync将远程文件放入临时位置。这是远程版本。

  3. 对于每个文件,采取三向差异。

    diff3 -3 <localfile> <basefile> <remotefile>
    

    diff3的输出是一个“ed脚本”,它描述了对本地文件进行的编辑,使其看起来像远程文件。

    -3选项告诉它只输出非冲突的差异。这就是我们首先破坏基础文件的原因:因此 这些行会发生冲突。

  4. 获得文件的ed脚本后,如果选择,可以直观地检查它,然后使用patch应用更新:

    cat <ed-script> | patch --ed <localfile>
    
  5. 因此,要以递归方式执行此操作,您可能需要:

    cd $localdir
    for file in `find . -type f`; do
        diff3 -3 "$file" "$basedir/$file" "$remotedir/$file" | patch --ed "$file"
    done
    

    您可能需要添加一些基本和远程文件实际存在的检查。