Чтение файла с сервера с помощью ssh с использованием python
Я пытаюсь прочитать файл с сервера, используя ssh из python. Я использую paramiko для подключения. Я могу подключиться к серверу и запустить команду типа "имя файла cat" и вернуть данные с сервера, но некоторые файлы, которые я пытаюсь прочитать, составляют около 1 ГБ или более.
Как я могу прочитать файл на сервере по строчке с помощью python?
Дополнительная информация: то, что регулярно выполняется, запускается командой "cat filename" и сохраняет результат в переменной и отключается от нее. Но так как файл здесь довольно большой, я ищу способ прочитать строку файла за строкой с сервера.
EDIT: я могу прочитать кучу данных и разделить их на строки, но проблема в том, что данные, полученные в буфере, не всегда включают в себя полные строки. например, если буфер имеет 300 строк, последняя строка может быть только половиной строки на сервере, а следующая половина будет выбрана при следующем вызове на сервер. Я хочу полные строки
EDIT 2: какую команду я могу использовать для печати строк в файле в определенном диапазоне. Как печатать первые 100 строк, затем следующие 100 и так далее? Таким образом, буфер всегда будет содержать полные строки.
Ответы
Ответ 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)