使用外壳脚本检查“ diff”命令的输出

时间:2019-04-14 05:03:17

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

我正在使用以下命令将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脚本,而不在远程主机上运行。

您能帮我吗?

2 个答案:

答案 0 :(得分:1)

首先,我建议使用cmp而不是diff(我认为这样会更有效),但是此解决方案应该以任何一种方式起作用。

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

如果您决定使用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拥有正确权限的脚本!

答案 1 :(得分:1)

不需要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)