Проверка вывода команды diff с помощью скрипта оболочки - PullRequest
0 голосов
/ 14 апреля 2019

Я сравниваю файл на моем компьютере с Linux с другим файлом на удаленном компьютере (оба экземпляра AWS) с помощью следующей команды:

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

Я хочу написать сценарий оболочки, который ничего не делает, когда оба файла одинаковы, и обновляет файл на удаленном компьютере, когда файл на машине linux (хосте) изменяется.

Я хочу, чтобы скрипт оболочки проверял удаленный файл каждые 30 секунд.

Я запускаю сценарий оболочки только на моем хост-компьютере, а не на удаленном.

Не могли бы вы помочь мне с этим?

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Нет необходимости в 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)
1 голос
/ 14 апреля 2019

Прежде всего, я бы рекомендовал использовать cmp вместо diff (я считаю, что это более эффективно), но это решение должно работать в любом случае.

Все, что вам нужно сделать, это написать скрипт bash с оператором if. Если команда cmp или diff ничего не возвращает, вам не нужно предпринимать никаких действий. В другом случае вам просто нужно 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, прокомментируйте ниже, и я могу написать что-то действительно быстрое, что эквивалентно.

Проверка удаленного файла (запуск сценария bash) каждые 30 секунд может быть немного излишней, но это действительно ваше дело. Для выполнения периодической проверки (это работает только для временных интервалов свыше 1 минуты), вы можете использовать планировщик cron. Я рекомендую использовать Crontab Guru для создания расписаний cron и понять, как они работают. Для вашей цели вам просто нужно добавить одну строку в ваш crontab (в вашем терминале введите crontab -e, чтобы отредактировать ваш crontab) следующим образом:

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

Убедитесь, что у вас есть chmod скрипт с необходимыми правами доступа!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...