【问题标题】:Checking the output of "diff" command using shell script使用 shell 脚本检查“diff”命令的输出
【发布时间】:2019-04-14 05:03:17
【问题描述】:

我正在使用以下命令将我的 linux 机器上的一个文件与远程机器(两个 AWS 实例)上的另一个文件进行比较:

diff -s main <(ssh -i /home/ubuntu/sai_key.pem ubuntu@w.x.y.z 'cat /home/ubuntu/c1')

我想编写一个shell脚本,当两个文件相同时什么都不做,并在linux机器(主机)中的文件发生变化时更新远程机器中的文件。

我希望 shell 脚本每 30 秒检查一次远程文件。

我只在我的主机而不是远程主机上运行 shell 脚本。

你能帮我解决这个问题吗?

【问题讨论】:

    标签: python linux amazon-web-services shell ubuntu


    【解决方案1】:

    首先,我建议使用cmp 而不是diff(我相信它更有效),但是这个解决方案应该可以工作。

    您需要做的就是编写一个包含 if 语句的 bash 脚本。如果cmpdiff 命令没有返回任何内容,则无需执行任何操作。在另一种情况下,您只需要将当前的main 文件scp 传送到远程主机。

    如果您决定使用cmp,则 if 语句只需如下所示:

    if cmp -s main <(ssh -i /home/ubuntu/sai_key.pem ubuntu@w.x.y.z 'cat /home/ubuntu/c1')
    then
        echo "Match!"
    else
        echo "No match!"
        scp ...
    fi
    

    如果你真的对使用 diff 很执着,请在下面发表评论,我可以很快写出一些类似的东西。

    每 30 秒检查一次远程文件(运行此 bash 脚本)可能有点矫枉过正,但这完全取决于您。要实现定期检查(这只适用于 1 分钟以上的时间间隔),您可以使用 cron 调度程序。我建议使用Crontab Guru 创建 cron 计划并了解它们是如何工作的。为了您的目的,您只需要在您的 crontab 中添加一行(在您的终端中运行 crontab -e 以编辑您的 crontab),如下所示:

    * * * * * /absolute/path/to/shell/script.sh
    

    确保您chmod 脚本也具有正确的权限!

    【讨论】:

      【解决方案2】:

      不需要 bash, diff, cmd, cron, ... Python 可以在 ssh 的帮助下完成所有事情:

      import subprocess
      import time
      
      key_pair = 'AWS_Linux_key_pair.pem'
      remote_name = 'ec2-user@ec2-3-16-214-98.us-east-2.compute.amazonaws.com'
      file_name = 'fibonacci.py'
      cat_string = "cat " + file_name
      
      while True:
          command = 'ssh -i ' + key_pair + ' ' + remote_name + " '" + cat_string + "'"
          remote_lines = subprocess.getoutput(command)
          local_lines = subprocess.getoutput(cat_string)
      
          if remote_lines != local_lines:
              print("update")
              command = 'scp -i ' + key_pair + ' ' + file_name + ' ' + remote_name + ':'
              subprocess.getoutput(command)
          else:
              print("the same")
          time.sleep(30)
      

      【讨论】:

      • 我知道 OP 标记了这个 python,但即便如此,这对于本质上是一个 shell 单线的东西来说几乎没有改进。
      • 我的代码已经过测试并且可以正常工作。外壳单线(有 7 行),这只是一个草图 :-) 再也没有了。我刚刚提出了替代方案,它也适用于 iMac 和 Windows。
      • scpssh 不是 Windows 上的标准安装。
      • Python 也是如此。我猜你会在 Windows 上使用 Bash :-)
      • @AlexanderLopatin 感谢您提供信息!我还需要用 Python 实现一些非常相似的东西。这会很有帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 2019-01-06
      相关资源
      最近更新 更多