Чтение файла удаленно с использованием Paramiko (или нет) в python - PullRequest
0 голосов
/ 12 марта 2020

Я хотел бы прочитать файл на удаленной машине. Я могу сделать это, используя paramiko.

Файл постоянно обновляется новыми строками. Я попытался реализовать скрипт python для его чтения. Вот интересная часть кода:

import glob
import sys
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import os
import pandas as pd
from scipy.linalg import norm
import time
import paramiko
import select

if __name__ == "__main__": 
    print("...starting")

    # a lot of stuff here in the middle

    ssh_client = paramiko.SSHClient()
    ssh_client.load_system_host_keys()
    ssh_client.connect(hostname='xxx.xx.xx.xxx',username='user',password='pass')

    print("...starting transport:")
    transport = ssh_client.get_transport()
    channel = transport.open_session()
    channel.exec_command("cat /tmp/ciao.txt")
    while True:
        rl, wl, xl = select.select([channel],[],[],0.0)
        #print(rl.readlines())
        if len(rl) > 0:
            #print("printing")
            string_in_file = channel.recv(1024)
            if len(string_in_file) > 0:
                #print("printing")
                print(string_in_file)

Проблема : файл правильно читается в начале и после, каждая вновь записанная строка полностью игнорируется или, по крайней мере, это делает не оказывает никакого влияния на вывод предложенного сценария. Любые предложения о том, как читать новые строки при написании?

Любая другая идея о том, как достичь того же результата (даже без paramiko), приветствуется. Единственным ограничением является использование python.

1 Ответ

0 голосов
/ 13 марта 2020

tail -f будет продолжать следовать за файлом, давая вам больше вывода, чем вы go.

import glob
import sys
import os
import time
import paramiko
import select

if __name__ == "__main__": 
    print("...starting")

    # a lot of stuff here in the middle

    ssh_client = paramiko.SSHClient()
    ssh_client.load_system_host_keys()

    # for test get "user,pw" in ./test.pw
    user, pw = open('test.pw').readline().strip().split(",")
    ssh_client.connect(hostname='localhost',username=user,password=pw)

    print("...starting transport:")
    transport = ssh_client.get_transport()
    channel = transport.open_session()
    # 1GB is include first Gig - just a way to get all of the 
    # file instead of the last few lines
    # include --follow=name instead of -f if you want to keep
    # following files that are log rotated
    channel.exec_command("tail -f --lines=1GB /tmp/test.txt")
    while True:
        # (don't melt cpu's with a zero timeout)
        rl, wl, xl = select.select([channel],[],[])
        #rl, wl, xl = select.select([channel],[],[],0.0)
        if rl:
            string_in_file = channel.recv(1024)
            if len(string_in_file) > 0:
                print(string_in_file)
            else:
                print("channel disconnected")
                break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...