Подтвердить что ты не робот

Чтение файла с сервера с помощью ssh с использованием python

Я пытаюсь прочитать файл с сервера, используя ssh из python. Я использую paramiko для подключения. Я могу подключиться к серверу и запустить команду типа "имя файла cat" и вернуть данные с сервера, но некоторые файлы, которые я пытаюсь прочитать, составляют около 1 ГБ или более.

Как я могу прочитать файл на сервере по строчке с помощью python?

Дополнительная информация: то, что регулярно выполняется, запускается командой "cat filename" и сохраняет результат в переменной и отключается от нее. Но так как файл здесь довольно большой, я ищу способ прочитать строку файла за строкой с сервера.

EDIT: я могу прочитать кучу данных и разделить их на строки, но проблема в том, что данные, полученные в буфере, не всегда включают в себя полные строки. например, если буфер имеет 300 строк, последняя строка может быть только половиной строки на сервере, а следующая половина будет выбрана при следующем вызове на сервер. Я хочу полные строки

EDIT 2: какую команду я могу использовать для печати строк в файле в определенном диапазоне. Как печатать первые 100 строк, затем следующие 100 и так далее? Таким образом, буфер всегда будет содержать полные строки.

4b9b3361

Ответ 1

Класс Paramiko SFTPClient позволяет вам получить файл-подобный объект для чтения данных из удаленного файла с помощью Pythonic.

Предполагая, что у вас есть открытый SSHClient:

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()

Ответ 2

Здесь расширение @Matt Хороший ответ:

from contextlib     import closing
from fabric.network import connect

with closing(connect(user, host, port)) as ssh, \
     closing(ssh.open_sftp()) as sftp, \
     closing(sftp.open('remote_filename')) as file:
    for line in file:
        process(line)

Ответ 3

Что вы подразумеваете под строкой "строка за строкой" - существует множество буферов данных между сетевыми узлами, и ни одна из них не ориентирована на линию.

Итак, вы можете прочитать кучу данных, а затем разбить на строки в ближайшем конце.

ssh otherhost cat somefile | python process_standard_input.py | do_process_locally

Или вы можете заставить процесс читать кучу данных в дальнем конце, разбить его и форматировать по строкам и отправить его вам.

scp process_standard_input.py otherhost
ssh otherhost python process_standard_input.py somefile |  do_process_locally

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

В общем случае нет ничего плохого в использовании cat по SSH-каналу для перемещения гигабайт данных.

Ответ 4

#!/usr/bin/env python
import paramiko
import select
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('yourhost.com')
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command("cat /path/to/your/file")
while True:
  rl, wl, xl = select.select([channel],[],[],0.0)
  if len(rl) > 0:
      # Must be stdout
      print channel.recv(1024)