FTP ze skryptu bash działającego z crona nie działa

0

Mam skrypt uruchamiany w croncelu utworzenia kopii zapasowej bazy danych MySQL i niektórych plików. Po utworzeniu tar smoły i zaszyfrowaniu jej openSSHmuszę umieścić ją na zdalnym serwerze ftp. Poniżej znajduje się kod części ftp:

    HOST='abcd.dyndns.biz'
    USER='username'
    PASSWD='password'
    FILE='myBack-'${LOCAL_HOST}'-'${DATENAME}'.enc.tar.gz'
    DIRNAME='/usr/local/backups/'

    cd ${DIRNAME}

    ftp -n ${HOST} <<END_SCRIPT
    quote USER ${USER}
    quote PASS ${PASSWD}
    cd backup
    lcd ${DIRNAME}
    put ${FILE}
    quit

END_SCRIPT

Jeśli bezpośrednio uruchomię skrypt z wiersza polecenia > sudo ./mybackup.sh, działa on płynnie i umieszczam plik kopii zapasowej na ftp, ale gdy jest uruchomiony cron, nigdy nie umieścił pliku na ftp przez inne pliki przed ftp i po ftp (takie jak konsolidacja pliku dziennika i wysłanie e-maila wynik) kroki działają dobrze. Nie jestem w stanie uzyskać niczego z plików dziennika ani też wskazać przyczyny.

UWAGA: - Nasz ip dyndns.biz nie zmienia się, ponieważ zapłaciliśmy za abonament.

TheVillageIdiot
źródło
1
Czy cron nie wysyła Ci raportu po zadaniu? Możesz znaleźć dzienniki z mailpoleceniem. Czy sprawdziłeś, że cron działa z odpowiednimi uprawnieniami?
M'vy
@ M'vy cronuruchamia zadanie jako root.
TheVillageIdiot
Jak wygląda odpowiednia sekcja crontab -l?
Kirk
sudo crontab -l `. # mh dom mon dow polecenie 0 22 * ​​* * / usr / local / backups / osback.sh`
TheVillageIdiot

Odpowiedzi:

3

Zamiast tego użyj funkcji przesyłania Curl :

curl --upload-file "$FILE" --user "$USER:$PASSWD" "ftp://$HOST/backup/"
Miś
źródło
znowu ten sam problem działa z wiersza poleceń, ale kończy się niepowodzeniem z cronem :(
TheVillageIdiot
działa również ze skryptu, ale wystąpił problem z tym samym skryptem w innym systemie. Zobacz to, jeśli możesz dowiedzieć się, co się dzieje: superuser.com/questions/299496/curl-not-uploading-file-to-ftp
TheVillageIdiot
Spróbuj określić ścieżkę, ponieważ cron domyślnie używa bardzo ograniczonej ścieżki: / usr / bin / curl ...
LatinSuD
0

Umm .. Widzę kilka punktów, dlaczego to może zawieść.

  1. nie wiesz, że ftp otworzył połączenie, gdy wysyłasz dane wejściowe, ale być może załatwi to za ciebie (nie znam twojego programu ftp ... może to być cokolwiek innego).
  2. nie rozdzielasz poleceń ftp: // średnikami lub znakami nowej linii - spróbuj dodać \ n lub;. znowu idk, czego chce twoja aplikacja

  3. nie sprawdzasz, czy plik rzeczywiście istnieje, zanim spróbujesz go umieścić.

Ярослав Рахматуллин
źródło
Jeśli nie można pobrać poleceń z partii, to jak się sudo ./mybackup.shpowiedzie? Plik istnieje, ponieważ nadal istnieje po zakończeniu skryptu.
TheVillageIdiot
To, że polecenie ftp nie ulega awarii lub nie zwraca błędu, gdy podajesz mu ciąg tekstu, nie oznacza, że ​​akceptuje tokeny jako argumenty lub polecenia. To znaczy, jeśli widziałeś gdzieś, że można to zrobić za pomocą komendy ftp, której używasz, to kontynuuj, w przeciwnym razie mówię ci, że nie możesz zakładać, że to zadziała, ponieważ protokoły tekstowe takie jak ftp często zwracają „ok” po zrobieniu uwierzytelnienia, cd itp. I musisz sobie z tym poradzić - proste przekierowanie ze stdin nie zajmuje się tym, spodziewaj się, że tak.
Ярослав Рахматуллин
Dalej - twoje zmienne prawdopodobnie zawodzą. Gdzie są zdefiniowane $ {LOCAL_HOST} i $ {DATENAME}? cron wykonuje polecenia w „nagim” środowisku, zdecydowanie innym niż sudo. Co jest nie tak ze standardowym $ {HOSTNAME}? Nieważne .. Po prostu sprawdź, czy $ {FILE} tam jest i czy nie jest to coś takiego jak `myBack -. Enc.tar.gz 'jak już wspomniałem.
Ярослав Рахматуллин
@ Ярослав Рахматуллин Nie wystawiłem całego skryptu, zmienne tam są i wszystkie pliki są tworzone, i tylko ta rzecz ftp przerabia cały program
TheVillageIdiot
więc spróbuj uruchomić inne narzędzie (inne ftp) lub uruchom ftp z oczekiwaniem. Powodzenia.
Ярослав Рахматуллин
0

Miałem podobny problem. Rozwiązanie: odnieść się bezpośrednio do katalogów bez takich zmiennych:

lcd /mpla/mpla2/dir1
cd  /mpla3/mpla4/dir2

i zadziałało. Tylko ta zmiana. quote USER $usernameI quote PASSWD $passwordpozostawiano jak jest, ale bez nawiasów klamrowych.

Michała
źródło