bash — wget -N проверка значения if else

#linux #bash #ftp #wget #timestamping

#linux #bash #ftp #wget #временная метка

Вопрос:

Я работаю над сценарием bash, который извлекает файл с FTP-сайта, только если временная метка на удаленном устройстве отличается от локальной. После того, как он помещает файл, он копирует файл на 3 других компьютера через samba (smbclient).

Все работает, но файл копируется, даже если wget -N ftp://insertsitehere.com возвращает значение, указывающее на то, что файл на удаленном компьютере не был более новым. Каков наилучший способ проверить выходные данные скрипта, чтобы копирование происходило только в том случае, если новая версия была извлечена с FTP?

В идеале я бы хотел, чтобы при копировании на компьютеры сохранялась временная метка, как это делает команда wget -N.

Вот пример того, что у меня есть:

 #!/bin/bash

OUTDIR=/cats/dogs

cd $OUTDIR
wget -N ftp://user:password@sitegoeshere.com/filename

if [ $? -eq 0 ]; then
   HOSTS="server1 server2 server3"
   for i in $HOSTS; do
      echo "Uploading to $i..."
      smbclient -A /root/.smbclient.authfile //$i/path -c "lcd /cats/dogs; put fiilename.txt"
      if [ $? -eq 0 ]; then
        echo "Upload to $i successful..."
      else
        echo "There was an issue uploading to host $i..."
      fi
   done
else
   echo "There was an issue with the FTP Download...."
   exit 1
fi
 

Комментарии:

1. Выделите весь ваш код с помощью мыши, затем щелкните {} инструмент (форматирование) в левом верхнем углу окна редактирования, чтобы сделать ваш код читаемым. Похоже, что это должно сработать на основе справочной страницы wget. Для отладки я бы ssh user@sitesgoeshere.com '/bin/ls -l filename' перед и подтвердил, что дата действительно старше текущей. Возможны ли проблемы с часовыми поясами? Нужно ли добавлять смещение на час между временными метками из разных систем? Хороший первый вопрос. Продолжайте публиковать и удачи.

2. Временная метка работает при извлечении wget, но вторая часть скрипта для ее копирования на server1, server2 и serve3 выполняется независимо от того, был ли файл загружен снова или нет. В этом проблема. Кроме того, при копировании на каждый сервер не сохраняется правильная временная метка с помощью команды wget -N.

3. Извините, должен был лечь спать несколько часов назад. Вы имеете в виду, что тест if [ $? -eq 0 ] возвращает true, когда он не должен? Это единственный способ вызвать smbclient, поэтому он должен быть true. Возможно -eq 0 , это неправильный оператор, который я использую if wget .... ; then для устранения таких проблем. У меня нет доступа к smbclient. Надеюсь, при просмотре man smbclient вы найдете такой вариант, как scp -p (сохранить права доступа к файлам (и временные метки). Удачи!

4. Спасибо! Я буду смотреть дальше в этом. И да, если я повторю $? я получаю возвращаемое значение 0, несмотря ни на что. Похоже, что он говорит об успешном завершении, если файл загружается или нет (потому что он подчиняется переключателю -N). Я могу протестировать его обновление до if then, но имея какую-то проверку, чтобы сказать, не был ли файл загружен, тогда не копируйте, если файл был загружен (потому что файл был более новым), продолжайте копировать. (и сохранение временных меток)

5. Ну, самым простым (не таким элегантным, как правильное значение в $? ) может быть to cd /tmp/working; wget ...; if [[ -f newFileVer ]] ; then smbclient ... ; etc ; и избавиться от файла в /tmp/working (или, как вам нравится, управлять рабочими файлами). Удачи.

Ответ №1:

Возвращаемое значение wget отличается от 0 только в случае ошибки. Если -N используется и удаленный файл старше локального файла, он все равно будет иметь возвращаемое значение 0, поэтому вы не можете использовать его для проверки, был ли файл изменен.

Вы можете проверить mtime файла, чтобы узнать, изменился ли он или содержимое. Например, вы могли бы использовать что-то вроде:

 md5_old=$( md5sum filename.txt 2>/dev/null )
wget -N ftp://user:password@sitegoeshere.com/filename.txt
md5_new=$( md5sum filename.txt )

if [ "$md5_old" != "$md5_new" ]; then
    # Copy filename.txt to SMB servers
fi
 

Что касается smbclient , к сожалению, нет способа сохранить временные метки в get put командах или. Если вам это нужно, вы должны использовать какой-то другой инструмент ( scp -p , rsync -t …)

Ответ №2:

 touch -r foo.txt foo.old
wget -N example.com/foo.txt
if [ foo.txt -nt foo.old ]
then
  echo 'Uploading to server1...'
fi
 
  1. «Сохранить» текущую временную метку в новый пустой файл
  2. Используется wget --timestamping только для загрузки файла, если он более новый
  3. Если файл более новый, чем файл «сохранить», выполните следующие действия