Bash-скрипт OSX работает, но не работает в crontab по SFTP - PullRequest
0 голосов
/ 23 июля 2011

эта тема обсуждалась довольно долго, однако у меня есть вариант на тему, который я просто не могу взломать.Два дня в этом сейчас и решили пинговать сообщество.THx заранее для чтения ..

Exec.Резюме у меня есть сценарий в OS X, который работает нормально и выполняется без проблем или ошибок, когда выполняется вручную.Когда я помещаю скрипт в crontab для ежедневного запуска , он по-прежнему запускается , но он не запускает все команды (в частности, SFTP).

Я прочитал достаточно сообщений, чтобы пройти по путипроблемы среды, поэтому, как вы увидите ниже, я жестко сослался на местоположение SFTP в случае возникновения проблемы PATH ...

Единственное, о чем я могу думать, - это IdentityFile.ПРИМЕЧАНИЕ: я помещаю это в crontab для моего пользователя, а не root.Так что я понимаю, что должен подхватить на id_dsa.pub, который я создал (и который уже был передан на сервер) ..

Я не пытаюсь сделать что-то напуганноекоманды для обхода пароля и т. д. Я не знаю, почему при запуске из cron он пропускает строку SFTP.

см. код ниже .. и помощь очень ценится .. thx

#!/bin/bash
export DATE=`date +%y%m%d%H%M%S`
export YYMMDD=`date +%y%m%d`
PDATE=$DATE
YDATE=$YYMMDD
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
FEED="~/Dropbox/"

USER="user"
HOST="host.domain.tld"

A="/tmp/5nPR45bH"

>${A}.file1${PDATE}
>${A}.file2${PDATE}

BYEbye ()
{
rm ${A}.file1${PDATE}
rm ${A}.file2${PDATE}

echo "Finished cleaning internal logs"
exit 0 
}


echo "get -r *" >> ${A}.file1${PDATE}
echo "quit" >> ${A}.file1${PDATE}

eval mkdir ${FEED}${YDATE}
eval cd ${FEED}${YDATE}


eval /usr/bin/sftp -b ${A}.file1${PDATE} ${USER}@${HOST}

BYEbye
exit 0

1 Ответ

3 голосов
/ 23 июля 2011

Не ответ, просто комментарии о вашем коде.

  • Способ обработки имен файлов с пробелами заключается в заключении в кавычки переменной: "$var" - eval - это не тот путь. Привыкайте цитировать все переменные, если вы не хотите использовать побочные эффекты отказа от цитирования.

  • вам не нужно export свои переменные, если только вы не вызовите команду, которая ожидает их увидеть в среде.

  • вам не нужно вызывать date дважды, потому что значение YYMMDD является подстрокой ДАТЫ: YYMMDD="${DATE:0:6}"

  • просто предпочтение: я использую $HOME над ~ в скрипте.

  • вы никогда не используете временный файл file2 - зачем вы его создаете?

  • , поскольку ваш пакетный файл sftp довольно прост, вам не нужен файл для него:

    printf "%s\n" "get -r *" "quit" | sftp -b - "$USER@$HOST"


Вот переписать, значительно сокращен:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
FEED_DIR="$HOME/Dropbox/$(date +%Y%m%d)"
USER="user"
HOST="host.domain.tld"

mkdir "$FEED_DIR" || { echo "could not mkdir $FEED_DIR"; exit 1; }
cd "$FEED_DIR"
{
  echo "get -r *"
  echo quit
} | 
sftp -b - "${USER}@${HOST}"
...