Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #85, ЯНВАРЬ 2006 г.

Заводной пингвин

j1m (j1m@list.ru)

Хакер, номер #085, стр. 085-100-3


Конечно, решение несколько топорное, но зато очень простое. В данном случае хорошим дополнением может стать запись результатов выполнения команд в файл и отправка его по почте с помощью команды /usr/bin/mail (или mailx).

[не привыкай к браузеру]

С соединением разобрались, теперь поговорим об автоматическом скачивании файлов. Для начала попробуем заставить ftp-клиент работать в автономном режиме. Для осуществления задуманного нам понадобится продвинутый lftp (есть в любом дистрибутиве). Выполнение команд в пакетном режиме (читая их из файла) является одной из его особенностей. Чтобы воспользоваться ею, создай файл ~/lftp.auto примерно с таким содержимым:

$ vi ~/lftp.auto

# задаем имя и пароль пользователя (пустой пароль - "")

user name passwd

# подключаемся к серверу

lftp ftp.kernel.org

# далее идут любые стандартные команды ftp-протокола (get, put, ls)

get ...

# отключаемся

exit

Задай правильные права доступа на этот файл (чтобы никто не подсмотрел пароль):

$ chmod 600 ~/lftp.auto

И запусти lftp такой командой:

$ lftp -f ~/lftp.auto > ~/lftp.log

Ftp-клиент выполнит все твои команды и отключится от сервера. Ответы сервера на приведенные команды запишутся в файл ~/lftp.log (по умолчанию они выводятся на экран). Этот файл может стать очень полезным, если в скрипте применяется команда рекурсивного обхода каталогов (ls -R). Используя один скрипт, можно организовать соединение сразу с несколькими ftp-серверами.

Соединения с ftp можно сделать еще более автономными, если использовать расширение zsh под названием zftp. Это встроенный в шелл ftp-клиент, позволяющий интегрировать команды ftp-протокола прямо в скрипты. Для демонстрации мощи такой технологии рассмотрим следующий скрипт:

$ vi ~/get_kernel.zsh

#!/bin/zsh

FTP=ftp.kernel.org

if [ $# != 0 ]; then

VER=$1

else

exit

fi

zmodload zsh/zftp

echo -n "Connecting to $FTP... "

zftp open $FTP

zftp login anonymous "" >/dev/null 2>&1

zftp binary

zftp cd pub/linux/kernel/v`echo $VER | cut -d "." -f 1-2`/

echo "Checking for new kernel..."

zftp ls | grep linux-${VER}

if [[ $? == 0 ]]; then

echo -n "Downloading... "

zftp get linux-${VER}.tar.bz2 > linux-${VER}.tar.bz2

zftp close

else

echo "Kernel $VER doesn't exist."

zftp close

fi

Скрипт предназначен для закачки ядра Linux с официального ftp-сервера. Запускать следует с одним параметром - версией ядра. Как можно заметить, zftp оперирует стандартными командами любого ftp-клиента с той лишь разницей, что после исполнения каждой команды управление возвращается обратно к шеллу. Благодаря этой особенности можно полностью контролировать весь диалог клиента с сервером, для чего раньше приходилось использовать expect.

Если есть необходимость слить файлы с http-сервера, можно воспользоваться неинтерактивным http-клиентом wget. Я применяю его в автономных интернет-соединениях, как было показано в предыдущем разделе.

$ wget URL

Назад на стр. 085-100-2  Содержание  Вперед на стр. 085-100-4