Имейте в виду, что, если сценарий установлен неправильно, любой, кто узнает структуру URL, сможет добавить себя в файл доступа и удалить другого пользователя. Это плохо. Одно из решений состоит в том, чтобы позволить запускать сценарий только пользователю admin (упомянутому в закомментированном коде в начале сценария). Другой способ обезопасить сценарий — поместить его в каталог, который уже защищен паролем.
№ 72. Синхронизация файлов с помощью SFTP
Хотя программа ftp все еще доступна в большинстве систем, она постепенно вытесняется более новыми протоколами передачи данных, такими как rsync и ssh (secure shell — защищенная командная оболочка). Это объясняется несколькими причинами. После выхода первого издания этой книги стали очевидны некоторые слабые стороны FTP, связанные с плохим масштабированием и слабой защищенностью. В новом мире «больших данных» популярность приобретают более эффективные протоколы. Кроме того, FTP осуществляет передачу данных в открытом виде, что обычно не вызывает проблем в домашних или корпоративных сетях, но только не в случаях, когда FTP используется для передачи данных в открытых сетях, например, при подключении через общественные точки доступа к Интернету в библиотеках или кофейнях, которыми пользуется масса народу.
Все современные серверы должны поддерживать более безопасный пакет ssh, обеспечивающий сквозное шифрование. Программа, осуществляющая передачу данных в зашифрованном виде, называется sftp, и хотя она еще более примитивная, чем ftp, мы все же можем пользоваться ею. В листинге 9.9 показано, как с помощью sftp организовать защищенную синхронизацию файлов.
ПРИМЕЧАНИЕ
Если в вашей системе отсутствует пакет ssh, пожалуйтесь своему поставщику или администраторам, потому что этому нет никакого оправдания. Если у вас имеются соответствующие привилегии, можете сами попробовать получить пакет на сайте http://www.openssh.com/и установить его.
Листинг 9.9.Сценарий sftpsync
··#!/bin/bash
··# sftpsync — принимая имя удаленного каталога на сервере sftp, выгружает
··#·· все новые или изменившиеся файлы в удаленную систему. Для синхронизации
··#·· использует файл с отметкой времени и удивительно изобретательно
··#·· подобранным именем. timestamp.
··timestamp=".timestamp"
··tempfile="/tmp/sftpsync.$$"
··count=0
··trap "$(which rm) −f $tempfile" 0 1 15 # Удалить временный файл по завершении.
··if [$# −eq 0]; then
····echo "Usage: $0 user@host { remotedir }" >&2
····exit 1
··fi
··user="$(echo $1 | cut −d@ −f1)"
··server="$(echo $1 | cut −d@ −f2)"
··if [$# −gt 1]; then
····echo "cd $2" >> $tempfile
··fi
··if [! -f $timestamp]; then
····# Если файл с отметкой времени отсутствует, выгрузить все файлы.
····for filename in *
····do
······if [-f "$filename"]; then
········echo "put −P \"$filename\"" >> $tempfile
········count=$(($count + 1))
······fi
····done
··else
····for filename in $(find. -newer $timestamp −type f −print)
····do
······echo "put −P \"$filename\"" >> $tempfile
······count=$(($count + 1))
····done
··fi
··if [$count −eq 0]; then
····echo "$0: No files require uploading to $server" >&2
····exit 1
··fi
··echo "quit" >> $tempfile
··echo "Synchronizing: Found $count files in local folder to upload."
··if! sftp −b $tempfile "$user@$server"; then
····echo "Done. All files synchronized up with $server"
····touch $timestamp
··fi
··exit 0
Программа sftp позволяет передать ей последовательность команд через конвейер или стандартный ввод, что делает сценарий довольно простым: основная его часть связана с конструированием последовательности команд для выгрузки всех изменившихся файлов. В самом конце эта конструкция передается программе sftp для выполнения.
Если ваша версия sftp не возвращает ненулевой код в случае неудачной попытки передать файлы, просто удалите условный блок в конце сценария
и замените его следующими командами:
sftp −b $tempfile "$user@$server"
touch $timestamp
Так как sftp требует передачи учетных данных в формате user@host, данный сценарий получился даже проще, чем эквивалентный сценарий, использующий FTP. Обратите также внимание на флаг −P в командах put: он требует от удаленного сервера сохранить локальные права доступа к файлам, а также время их создания и последнего изменения.
Читать дальше