Я работаю над сценарием Python, который отслеживает каталог и загружает файлы, которые были созданы или изменены с помощью scp. Это нормально, за исключением того, что я хочу, чтобы это было сделано рекурсивно, и у меня возникла проблема, если пользователь создает каталог в каталоге наблюдения, а затем изменяет файл в этом новом каталоге.

Я могу обнаружить создание каталога и создание / изменение вложенного файла. Но если я попытаюсь загрузить этот файл на удаленный сервер, он не будет работать, так как каталог на удаленном сайте не будет существовать. Есть ли простой способ сделать это БЕЗ рекурсивного копирования созданного каталога? Я хочу избежать этого, потому что я не хочу удалять удаленную папку, если она существует.

Также, пожалуйста, не предлагайте rsync. Он должен использовать только ssh и scp.

2
Falmarri 12 Сен 2010 в 07:54

3 ответа

Лучший ответ

Поскольку у вас есть ssh, вы не можете сначала создать каталог? Например, если указан файл с абсолютным путем /some/path/file.txt, перед загрузкой file.txt введите mkdir -p /home/path.

ОБНОВЛЕНИЕ: Если вы хотите уменьшить количество транзакций, лучшим способом может быть создание файла tar локально, его передача и распаковка.

2
ars 12 Сен 2010 в 04:38

Это не совсем scp, но sftp может принимать параметр -b с командным файлом. Вы можете отправить MKDIR и пут.

0
nmichaels 12 Сен 2010 в 03:58

Хотя я полагаю, что ваше конкретное приложение будет иметь свои причуды (как и мое), это может поставить вас на правильный путь. Ниже приведен небольшой фрагмент сценария, который я использую для размещения файлов на удаленном экземпляре EC2 с использованием Fabric, созданной на основе paramiko. Также обратите внимание на то, куда я помещаю команды sudo, поскольку у Fabric есть свой собственный класс "sudo". Это одна из тех причуд, о которых я говорил. Надеюсь, это кому-нибудь поможет.


from fabric.api import env, run, put, settings, cd
from fabric.contrib.files import exists

''' sudo apt-get install fabric Initially setup for interaction with an AWS EC2 instance At the terminal prompt run: fab ec2 makeRemoteDirectory changePermissions putScript '''

TARGETPATH = '/your/path/here'

def ec2(): env.hosts = ['your EC2 Instance or remote address'] env.user = 'user_name' env.key_filename = '/path/to/your/private_key.pem'

def makeRemoteDirectory(): if not exists('%s'%TARGETPATH): run('sudo mkdir %s'%TARGETPATH)

def changePermissions(): run('sudo chown -R %(user)s:%(user)s %(path)s'%{'user': env.user, 'path': TARGETPATH})

def putScript(): fileName = '/path/to/local/file' dirName = TARGETPATH put(fileName, dirName)

1
bhclowers 27 Ноя 2010 в 21:42