Как читать несколько файлов с нескольких удаленных серверов в Python? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть список серверов AWS Ubuntu, например:

ubuntu@ec2-bla-95-blablabla-23.amazonaws.com
ubuntu@ec2-bla-95-blablabla-43.amazonaws.com
ubuntu@ec2-bla-95-blablabla-24.amazonaws.com
...

На каждом из этих серверов у меня есть папка с переменным количеством файлов, путь для каждого сервера одинаков, например /roth/files/

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

Как мне получить содержимое этих файлов на удаленных серверах?

Способ входа в систему на этих серверах

ssh -i  path/aws.pem ubuntu@ec2-bla-95-blablabla-23.amazonaws.com

например, с помощью ключа

Я нашел ответ на подобный вопрос здесь

sftp_client = ssh_client.open_sftp()
remote_file = sftp_client.open('remote_filename')
try:
    for line in remote_file:
        # process line
finally:
    remote_file.close()

Но я не вижу, где вы предоставляете имя сервера и ключ ...

РЕДАКТИРОВАТЬ: В качестве небольшого исправления к ответу Ганеша вам нужно выполнить следующее для извлечения каждого файла, иначе вы получите сообщение об ошибке, сообщающее, что вы пытаетесь получить каталог:

lobj = sftp.listdir_attr(target_folder_remote)
    for o in lobj:
        name = o.filename
        sftp.get(os.path.join(target_folder_remote, name), os.path.join(target_folder_local, name))

1 Ответ

3 голосов
/ 08 ноября 2019
aws_host_list = [] # Your list here

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
dest_list = list()
for host in aws_host_list:
    client.connect(host, username=<User Name>, key_filename=<.PEM File path)
    sftp = client.open_sftp()
    lobj = sftp.listdir_attr(target_folder_remote)
    for o in lobj:
        name = o.filename
        sftp.get(os.path.join(target_folder_remote, name), os.path.join(target_folder_local, name))
        dest_list.append(os.path.join(target_folder_local, name))
    sftp.close()
    client.close()

# Then process you files
for f in dest_list:
    # Combine it
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...