Python - SCP против SSH для нескольких компьютеров и нескольких файлов - PullRequest
0 голосов
/ 24 октября 2011

Python 2.4.x (не может установить никаких нестандартных модулей).

Вопрос для всех вас.(при условии использования subprocess.popen)

Скажем, у вас было 20-30 машин - на каждом по 6-10 файлов, которые вам нужно было прочитать в переменную.

Вы бы предпочли scpв каждую машину, один раз для каждого файла (всего 120 - 300 команд SCP), читая каждый файл после того, как SCP-файл был записан в переменную, а затем отбрасывая файл.

Или - SSH в каждую машину, один разкаждый файл - чтение файла в память.(Всего 120 - 300 команд ssh).

?

Если нет другого способа получить все нужные файлы за один снимок на машину (файлы называются YYYYMMDD.HH.blah - диапазон будетучитывая 20111023.00 - 20111023.23).- читать их в память, о которой я не могу думать?

Ответы [ 4 ]

2 голосов
/ 24 октября 2011

В зависимости от размера файла вы можете сделать что-то вроде:

...
files= "file1 file2 ..."
myvar = ""
for tm in machine_list
         myvar = myvar+ subprocess.check_output(["ssh", "user@" + tm, "/bin/cat " + files]);
...

file1 file2 и т. Д. Разделены пробелом. Предполагая, что все являются коробками Unix, вы можете / bin / cat их все за один выстрел с каждой машины. (Это предполагает, что вы просто загружаете ВЕСЬ контент в одну переменную). Варианты выше ... SSH будет проще диагностировать.

По крайней мере, это моя мысль.

UPDATE

используйте что-то вроде

         myvar = myvar+Popen(["ssh", "user@" +tm ... ], stdout=PIPE).communicate()[0]

Надеюсь, это поможет.

0 голосов
/ 24 октября 2011

В качестве дополнения к ответу Inerdia, да, вы можете получить scp для передачи нескольких файлов в одном соединении, используя шаблоны фигурных скобок:

scp "host:{path/to/file1,path/to/file2}" local_destination"

И вы можете использовать обычные функции фигурных скобок, если ваши файлыимеют общие префиксы или суффиксы:

scp "host:path/to/{file1,file2}.thing" local_destination"

Обратите внимание, что шаблоны находятся внутри кавычек, поэтому они не раскрываются оболочкой перед вызовом scp.У меня есть хост с заметной задержкой соединения, на котором я создал два пустых файла.Затем выполнение копии, как описано выше (с указанным шаблоном фигурных скобок), привело к задержке, после чего оба файла были быстро переданы.Когда я пропустил кавычки, то локальная оболочка расширила скобки в два отдельных host:file аргумента для scp, затем произошла заметная задержка перед первым файлом и между двумя файлами.

Это подсказывает мнечто предложение Inerdia указать несколько host:file аргументов не повторно использует соединение для передачи всех файлов, но использование фигурных скобок приведет к.

0 голосов
/ 24 октября 2011

Вы можете запустить удаленную команду через ssh, которая использует tar, чтобы скомпоновать файлы, которые вы хотите вместе (позволяя результату перейти к стандартному выводу), записать вывод в переменную Python, а затем использовать Python's tarfile модуль для разделения файлов снова. Я не совсем уверен, как работает tarfile; вам, возможно, придется поместить вывод чтения в файлоподобный объект StringIO, прежде чем обращаться к нему с помощью tarfile.

Это сэкономит вам немного времени, поскольку вам придется подключаться к каждой машине только один раз, что сокращает время, затрачиваемое на согласование по ssh. Вы также избегаете использования локального дискового хранилища, которое может сэкономить немного времени и / или энергии - полезно, если вы работаете в режиме ноутбука или на устройстве с ограниченной файловой системой.

Если сетевое соединение относительно медленное, вы можете ускорить процесс, используя сжатие gzip или bzip; декомпрессия поддерживается tarfile.

0 голосов
/ 24 октября 2011

scp позволяет:

  1. Копировать целые каталоги, используя флаг -r: scp -r g0:labgroup/ .
  2. Указать шаблон глобуса: scp 'g0:labgroup/assignment*.hs' .
  3. Укажите несколько исходных файлов: scp 'g0:labgroup/assignment1*' 'g0:labgroup/assignment2*' .

Не уверен, какой тип глобализации поддерживается, скорее всего, он просто использует оболочку для этого.Я также не уверен, достаточно ли он умен, чтобы объединить копии с одного и того же сервера в одно соединение.

...