PDA

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



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

Исходные данные:
из дополнительных программ для скриптов нужен только screen (если не стоит - поставьте)

ipkg install screen

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

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

dnrun

#!/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

#!/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

#!/bin/sh
screen -r dnload
вытаскивает из фона уже запущенный процесс, чтобы посмотреть как там у него дела. чтобы убрать обратно - Ctrl-A, D. Если надо закрыть - Ctrl+С


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

P.S.
впоследствии планирую прикрутить удобности, типа сортировки по каталогам, которые будут указываться в самом списке.
что-то типа этого:

==>music
http://www.*******.com/1.mp3
http://www.*******.com/2.mp3
==>video
http://www.*******.com/1.avi
ftp://ftp.********.ru/2.avi

а совсем в дальних планах сделать веб интерфейс (хотя может и не сделаю, как человеку выращенному на досе, мне более близки консольные приложения)

Dmitry
19-10-2006, 10:39
А может вместо


cnt=0
for y in $(cat $sourcedir/list)
do
if [ "$cnt" -ne "0" ]
then
echo $y >> $sourcedir/list.b
fi
cnt=1
done
использовать более простую конструкцию? (роутера под рукой нет, проверить не могу, но на солярисе работает)


awk 'NR>1 {print $0}' $sourcedir/list > $sourcedir/list.b

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

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

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

Speedy Gonzalez
22-10-2006, 14:08
Dmitry
Да, спасибо. Просто я многого ещё не знаю, поэтому не всегда иду кратчайшим путём (мне надо было написать быстро и чтобы работало, а на оптимизацию времени особо не было)

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

Grey
16-12-2006, 10:48
[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]$

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

Grey
16-12-2006, 14:58
проблема ушла после пересоздания файлов со скриптами
что это было - так и не понял...

Zein
12-01-2007, 21:09
Лично мне проще в опере во вкладке "cсылки" выделить нужные линки со страницы и одним Copy-Paste отправить на роутер
Про отправление на роутер можно подробнее для лопуха?
Задача та же - не умея кодить на Линухе, поставить на ночь на роутер качать большую файлу на прикрученный usb диск
Через телнет или еще как...

seeker
13-01-2007, 01:36
Про отправление на роутер можно подробнее для лопуха?
Задача та же - не умея кодить на Линухе, поставить на ночь на роутер качать большую файлу на прикрученный usb диск
Через телнет или еще как...

я тоже полный лопух в линухе, поэтому всё на что япока способен - это в телнете набить

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

l2net
06-10-2008, 01:01
Speedy Gonzalez

если есть возможность опишите последовательность действий для интеграции оперы и данного метода загрузки
заранее спасибо за помощь

Guncka
23-02-2009, 13:47
При попытки запуска любого скрипта из командной строки, выдается Permission Denied. Из-за чего такое может быть?

Visionary
26-02-2009, 18:49
нужно сделать их исполняемыми.
cmod +x имя

Guncka
02-03-2009, 22:00
Спасибо. Попробую.

Power
03-03-2009, 00:12
нужно сделать их исполняемыми.
cmod +x имя

Только не cmod, а chmod.