Автоматизация для бедных. Часть 2 – отсылка файлов на SFTP

Первая часть была о том, как простенько сделать автоматическую отправку документов с приложением в виде шифрованных архивов ZIP. Пока заметка писалась, один из партнеров согласился открыть доступ по SFTP.
Офисные сотрудники и протоколы Интернета по определению не совместимы, поэтому даже такую несложную операцию лучше автоматизировать.
Конфигурация серверов остается полностью той же, добавляется один скрипт пересылки файлов, дополнительная задача в crontab и пару рабочих каталогов. Для использования SFTP в скриптах необходимо, чтобы вход на удаленный сервер проходил без пароля, по ключу. Как настроить такую удобную штуку, я писал здесь 10 лет назад.

1. Структура каталогов и рабочие файлы
/var/transfer/partner2/
/var/transfer/partner2/out/ <- очередь на пересылку
/var/transfer/partner2/backup/ <- копии отправленных файлов
/var/transfer/partner2/transfer <- скрипт отсылки
/var/transfer/partner2/sftp.job <- батник для sftp

2. Скрипт отсылки
#!/bin/sh

# Find and deliver files to Partner2

src=/mnt/company/#secure_transfer_partner2/
dst=/var/transfer/partner2/out/
bkp=/var/transfer/partner2/backup/

# Только файлы старше 3 минут, игнорировать каталоги, подкаталоги и скрытые dot-файлы
/usr/bin/find $src -maxdepth 1 -not -path '*/\.*' -mmin +3 -type f -exec mv '{}' $dst \;
/usr/bin/sftp -b /var/transfer/partner2/sftp.job company@ftp.partner2.com
if [ $? -eq 0 ]
then
mv $dst/* $bkp/
fi

3. Батник для sftp
rat@assistant:~$ cat /var/transfer/partner2/sftp.job
lcd /var/transfer/partner2/out
cd /in
put *

Кстати, одним бантиком можно файлы положить, забрать, перенести. Причем, из множества каталогов.

4. Crontab
rat@assistant:~$ cat /etc/cron.d/securetransfer
# /etc/cron.d/securetransfer: crontab entry to deliver files to Partner2 SFTP

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

*/5 * * * * root /usr/bin/test -x /var/transfer/partner2/transfer && /var/transfer/partner2/transfer >/dev/null 2>&1

Логирование, нотификации передающей и принимающей сторонам не включены, но в планах.

Теперь небольшой хак как использовать sftp в скриптах, но на принимающей стороне нет возможности прописать свой публичный ключ. Есть утилитка sshpass, которая позволяет подать пароль для ssh, sftp или scp из переменной, из файла или (для безмозглых) в открытом виде.
rat@assistant:~$ sudo apt-get update && sudo apt-get install sshpass

Тогда вызов SFTP из скрипта без ручного ввода пароля может выглядеть так:
rat@assistant:~$ /usr/bin/sshpass -f ~/.partner2 /usr/bin/sftp -b ~/partner2_sftp.job customer@ftp.partner2.com, где:
~/.partner2 – пароль к аккаунту customer@ftp.partner2.com, -f – чтение из файла;
~/partner2_sftp.job – батник со списком sftp-команд, например:
lcd /var/transfer/partner2/out
cd /in
put *

SCP в таком случае выглядит предпочтительнее, но, если удаленный сервер сконфигурирован “sftp only”, scp и ssh работать не будут.

Еще пара любопытных примеров как положить или скачать отдельный файл с удаленного сервера по sftp, не вводя дополнительных команд:
Скачать: sftp {user}@{host}:{remoteFileName} {localFileName}
Положить: sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'

Пример взят со StackOverflow в "Single Line sftp from Terminal".

Leave a comment

Your comment