Как получить последнюю папку, содержащую указанный c интересующий файл в Linux и загрузить этот файл, используя Paramiko в Python? - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь скопировать указанный файл c с удаленного сервера на мой локальный компьютер, используя Paramiko в Python 3.

Справочная информация: на конечном компьютере существует каталог mydir 198.18 .2.2, который содержит много каталогов отметок времени, которые начинаются с имени 2020...

Целевой компьютер: 198.18.2.2

Исходный компьютер: 198.18.1.1

Пока мне удалось Чтобы построить команду для выполнения следующим образом -

cd "$(ls -1d /mydir/20* | tail -1)"; scp -o StrictHostKeyChecking=no email_summary.log root@198.18.1.1:/mydir/work/logs/email_summary_198.18.2.2.log

Код:

def remote_execute(dest_ip, cmd):
    """API to execute command on remote machine"""
    result = []
    sys.stderr = open('/dev/null')
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh_client.connect(dest_ip, username='root')
        stdin, stdout, stderr = ssh_client.exec_command(cmd)
        for line in stdout.readlines():
            result.append(line.strip())
        ssh_client.close()
        return result
    except paramiko.AuthenticationException:
        print("Authentication with the remote machine failed")
        return
    except paramiko.SSHException:
        print("Connection to remote machine failed")
        return
    except paramiko.BadHostKeyException:
        print("Bad host key exception for remote machine")
        return

Вызов: remote_execute('198.18.1.1', cmd)

Проблема ls -1d /mydir/20* | tail -1 всегда дает мне последняя папка с метками времени. Но если файл email_summary.log отсутствует в этой папке, я хотел бы просмотреть следующую последнюю папку с отметкой времени, в которой находится файл email_summary.log.

По сути, scp файл из последней папки метки времени, которая содержит файл "email_summary.log". Может кто-нибудь помочь мне с этим?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Выполнение команды scp на удаленном компьютере для pu sh файл обратно на локальный компьютер является избыточным. И вообще, полагаться на команды оболочки очень просто. Лучше использовать только собственный код Python, чтобы определить последний удаленный файл и вытянуть на локальный компьютер. Ваш код будет более надежным и читабельным.


sftp = ssh.open_sftp()
sftp.chdir('/mydir')

files = sftp.listdir_attr()

dirs = [f for f in files if S_ISDIR(f.st_mode)]
dirs.sort(key = lambda d: d.st_mtime, reverse = True)

filename = 'email_summary.log'

for d in dirs:
    print('Checking ' + d.filename)
    try:
        path = d.filename + '/' + filename
        sftp.stat(path)
        print('File exists, downloading...')
        sftp.get(path, filename)
        break
    except IOError:
        print('File does not exist, will try the the next folder')

Вышеуказанное основано на:


Примечание: Не используйте AutoAddPolicy. Вы теряете безопасность, делая это. См. Paramiko "Неизвестный сервер" .

0 голосов
/ 14 февраля 2020

Как насчет поиска файла (не каталога) с использованием find?

find /mydir/20* -name email_summary.log | sort | tail -1

Это даст вам путь к последнему файлу для копирования.

Итак, ваша команда будет выглядеть так:

scp -o StrictHostKeyChecking=no "$(find /mydir/20* -name email_summary.log | sort | tail -1)" root@198.18.1.1:/mydir/work/logs/email_summary_198.18.2.2.log
...