Results 1 to 13 of 13

Thread: Скрипты для скачивания файлов по http/ftp

  1. #1
    Join Date
    Sep 2006
    Location
    SVAO, Moscow, Russia
    Posts
    42

    Скрипты для скачивания файлов по http/ftp

    В соседней ветке я поделился скриптами для скачивания торрентов. Думаю, что может быть кому-нибудь пригодятся и мои скрипты для скачивания файлов по ftp/http. В принципе, это всего лишь первая версия скриптов (честно говоря, с линуксом и shell скриптами для него я познакомился всего 10 дней назад), но тем не менее скрипты вполне стабильны и более-менее защищены от "дурака" и от случайных сбоев.

    Исходные данные:
    из дополнительных программ для скриптов нужен только screen (если не стоит - поставьте)
    Code:
    ipkg install screen
    я создал каталоги /opt/source и /opt/download, в первый необходимо положить список файлов, которые надо скачать*, во второй, собственно, эти файлы будут качаться.
    *) список должен иметь название list (без расширения), внутри находится просто список файлов. Список можно создавать и в виндах в обычном notepad-е, а потом скидывать на роутер. Несмотря на то, что в виндах строчки текстовых файлов заканчиваются 0Dh 0Ah, скрипт просто 0D игнорирует (а заодно пробелы и tab-ы). Так что всё будет ок.

    сами скрипты:

    dnrun
    Code:
    #!/bin/sh
    [ "$(ps | grep "dnload" | grep "SCR")" != "" ] && exit
    clear
    echo "RUN: FTP/HTTP download client"
    /opt/bin/screen -dmS dnload /opt/bin/dnload
    просто запускает скрипт dnload в фоновом режиме. для запуска используйте именно его. запуск можно прописать сразу в post-mount
    -----------
    dnload
    Code:
    #!/bin/sh
    sourcedir="/opt/source"
    targetdir="/opt/download"
    if [ ! -f $sourcedir/list ]; then echo "$sourcedir/list not found!"; exit; fi
    filelist=$(cat $sourcedir/list | tr -d '\015\040\011')
    for x in $filelist
    do
    rm -f $sourcedir/list.b
    echo "---$x---"
    wget -c -P $targetdir $x
    errcode=$?
    if [ "$errcode" -ne "0" ]
    then 
    echo "ERROR                        - $x - [$errcode]" >> $targetdir/list.out
    else
    echo "$(date) - $x" >> $targetdir/list.out
    fi
    cnt=0
    for y in $(cat $sourcedir/list)
    do
    if [ "$cnt" -ne "0" ]
    then
      echo $y >> $sourcedir/list.b
    fi
    cnt=1
    done
    [ -f $sourcedir/list.b ] && cp $sourcedir/list.b $sourcedir/list || rm -f $sourcedir/list
    echo " " 
    done
    основной скрипт.
    делает следующее:
    последовательно запускает wget для скачивания файлов (кому хочется - можете вместо wget пользовать axel или curl какой-нибудь)
    имена папок тоже можно легко поменять, как кому удобно.
    по завершении скачивания каждого файла, ссылка уничтожается из файла list чтобы в случае если процесс прервут или электричество отрубится, закачаные файлы второй раз заливаться не будут, а если загрузка прервалась на середине какого-либо файла, то закачка продолжится с места на котором оборвалась (конечно, если сервер поддерживает докачку, иначе прерванный файл будет заливаться сначала).
    также по завершении закачки каждого файла информация об этом дописывается в файл list.out (он не перезаписывается, информация просто добавляется в конец), если загрузка прошла успешно, то пишется дата/время завершения и имя файла, если произошла ошибка при загрузке, то пишет ERROR, имя файла и код ошибки.
    по завершении всех закачек исходный список (list) уничтожается.
    -----------
    dn
    Code:
    #!/bin/sh
    screen -r dnload
    вытаскивает из фона уже запущенный процесс, чтобы посмотреть как там у него дела. чтобы убрать обратно - Ctrl-A, D. Если надо закрыть - Ctrl+С


    если у кого будут вопросы - пишите.

    P.S.
    впоследствии планирую прикрутить удобности, типа сортировки по каталогам, которые будут указываться в самом списке.
    что-то типа этого:
    Code:
    ==>music
    http://www.*******.com/1.mp3
    http://www.*******.com/2.mp3
    ==>video
    http://www.*******.com/1.avi
    ftp://ftp.********.ru/2.avi
    а совсем в дальних планах сделать веб интерфейс (хотя может и не сделаю, как человеку выращенному на досе, мне более близки консольные приложения)
    Last edited by Speedy Gonzalez; 17-10-2006 at 21:45.

  2. #2
    А может вместо
    Quote Originally Posted by Speedy Gonzalez View Post
    cnt=0
    for y in $(cat $sourcedir/list)
    do
    if [ "$cnt" -ne "0" ]
    then
    echo $y >> $sourcedir/list.b
    fi
    cnt=1
    done
    использовать более простую конструкцию? (роутера под рукой нет, проверить не могу, но на солярисе работает)
    Code:
    awk 'NR>1 {print $0}' $sourcedir/list > $sourcedir/list.b

  3. #3
    Если список писать в винде руками, то зачем скрипты? Пишите список вида
    -c -nc proto://url
    .......

    и запускайте строку типа
    wget -b -i downloadlist

    вообще wget может выкачивать и каталогами, и сайтами...
    Как человек, выросший в DEC RT11 вообще не люблю скрипты
    Да и диск таких размеров не у каждого в Асусу прикручен. У меня например 1Gb флешка, что туда качать? И зачем, если под рукой пара серверов и своя машина - невыключаемая...

  4. #4
    Join Date
    Sep 2006
    Location
    SVAO, Moscow, Russia
    Posts
    42
    Dmitry
    Да, спасибо. Просто я многого ещё не знаю, поэтому не всегда иду кратчайшим путём (мне надо было написать быстро и чтобы работало, а на оптимизацию времени особо не было)

    SinClaus
    Если Вам проще руками - то никто не заставляет пользоваться скриптами. Обязаловки тут никакой нет
    Лично мне проще в опере во вкладке "cсылки" выделить нужные линки со страницы и одним Copy-Paste отправить на роутер (а учитывая огромные возможности оперы по кастомизации, можно сделать вообще в меню по правой кнопке чтобы линк автоматом добавлялся к списку на роутере).
    Уж вбивать -c -nc перед каждым линком меня совсем не прёт. Тем более тот wget, что в комплекте, идёт сильно обрезанный по функциям. Думаю, он не умеет списки закачивать. Полный надо ставить (опять же лишние телодвижения)

  5. #5
    [admin@Server bin]$ ls -al
    drwxr-xr-x 2 admin root 1024 Dec 16 12:34 .
    drwxr-xr-x 12 admin root 1024 Dec 16 11:36 ..
    ------8<-------
    -rwxr-xr-x 1 admin root 724 Dec 16 11:58 dnload
    -rwxr-xr-x 1 admin root 157 Dec 16 12:29 dnrun
    ------8<-------

    [admin@Server bin]$ cat dnrun
    #!/bin/sh
    [ "$(ps | grep "dnload" | grep "SCR")" != "" ] && exit
    clear
    echo "RUN: FTP/HTTP download client"
    /opt/bin/screen -dmS dnload /opt/bin/dnload
    [admin@Server bin]$ dnrun
    -sh: dnrun: not found
    [admin@Server bin]$

    как так может быть!?!?
    на что шелл ругается?

  6. #6
    проблема ушла после пересоздания файлов со скриптами
    что это было - так и не понял...

  7. #7
    Quote Originally Posted by Speedy Gonzalez View Post
    Лично мне проще в опере во вкладке "cсылки" выделить нужные линки со страницы и одним Copy-Paste отправить на роутер
    Про отправление на роутер можно подробнее для лопуха?
    Задача та же - не умея кодить на Линухе, поставить на ночь на роутер качать большую файлу на прикрученный usb диск
    Через телнет или еще как...

  8. #8
    Quote Originally Posted by Zein View Post
    Про отправление на роутер можно подробнее для лопуха?
    Задача та же - не умея кодить на Линухе, поставить на ночь на роутер качать большую файлу на прикрученный usb диск
    Через телнет или еще как...
    я тоже полный лопух в линухе, поэтому всё на что япока способен - это в телнете набить

    nohup wget -c http://.... >> download.log
    вроде работает

  9. #9
    Join Date
    Jan 2008
    Location
    Украина
    Posts
    107
    Speedy Gonzalez

    если есть возможность опишите последовательность действий для интеграции оперы и данного метода загрузки
    заранее спасибо за помощь
    Last edited by l2net; 06-10-2008 at 00:43.
    Asus WL500GP

  10. #10
    При попытки запуска любого скрипта из командной строки, выдается Permission Denied. Из-за чего такое может быть?

  11. #11
    нужно сделать их исполняемыми.
    cmod +x имя

  12. #12
    Спасибо. Попробую.

  13. #13
    Join Date
    May 2007
    Location
    Истра
    Posts
    1,246
    Quote Originally Posted by Visionary View Post
    нужно сделать их исполняемыми.
    cmod +x имя
    Только не cmod, а chmod.

Similar Threads

  1. Replies: 92
    Last Post: 31-03-2008, 18:43

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •