Рекурсивный каталог скачать с Paramiko? - PullRequest
9 голосов
/ 13 июля 2011

Я хочу скачать каталог с неизвестным содержимым рекурсивно через SSH и пытался Paramiko.Я видел несколько примеров загрузки каталогов, но ни один из них не касается рекурсивной загрузки.

Я могу перечислить все элементы в каталоге, но не смог найти способ узнать, является ли элемент файлом (для загрузки) или каталогом (для рекурсивного вызова).

transport = paramiko.Transport((MY_IP, 22))
transport.connect(username=MY_NAME, password=MY_PASS)
sftp = paramiko.SFTPClient.from_transport(transport)

file_list = sftp.listdir(path='/home/MY_HOME_DIR')
    for item in file_list:
        # Here is an item name... but is it a file or directory?
        print(item)
sftp.close()
transport.close()

Так как мне узнать, является ли элемент файлом или каталогом?

Ответы [ 6 ]

11 голосов
/ 29 ноября 2011
from stat import S_ISDIR

def isdir(path):
  try:
    return S_ISDIR(sftp.stat(path).st_mode)
  except IOError:
    #Path does not exist, so by definition not a directory
    return False

... при условии, что sftp является открытым SFTP-соединением Paramiko.

1 голос
/ 10 апреля 2013

Старый вопрос, но решение, которое я придумала, работает довольно хорошо, оно немного неаккуратное (приведение типов, косая черта и все) - но оно работает.

Обратите внимание, что для * используется 1003 *сделать каталоги в месте назначения.

def sftp_get_recursive(path, dest, sftp=sftp):
    item_list = sftp.listdir(path)
    dest = str(dest)

    if not os.path.isdir(dest):
        local("mkdir %s" % dest)

    for item in item_list:
        item = str(item)

        if is_directory(path + "/" + item, sftp):
            sftp_get_recursive(path + "/" + item, dest + "/" + item, sftp)
        else:
            sftp.get(path + "/" + item, dest + "/" + item)
1 голос
/ 14 марта 2012

stat () метод среди других атрибутов возвращает разрешения. d (например, drwxrwxrwx) показывает, что это каталог.

Как пример:

dir = oct(sftp.stat(path).st_mode)
print dir[0:2]

выходная интерпретация: 01 пятно 02 символа специальных 04 каталог 06 блок специальный 10 обычных файлов 12 символическая ссылка 14 розетка

1 голос
/ 13 июля 2011

Вы можете использовать метод stat () вашего объекта sftp:

http://www.lag.net/paramiko/docs/paramiko.SFTPClient-class.html

0 голосов
/ 30 ноября 2018

Paramiko не поддерживает рекурсивные операции.

Вы можете использовать pysftp .Это обертка вокруг Paramiko, которая имеет больше внешнего вида Python и поддерживает рекурсивные операции.См.

Или вы можете просто создать свой кодна исходный код pysftp .Или посмотрите мой ответ на Python pysftp get_r из Linux отлично работает на Linux, но не на Windows .

0 голосов
/ 13 июля 2011

Если вы используете Linux или Unix-подобный. Вы можете использовать утилиту 'file' с popen. Или просто вы можете использовать os.path.isdir () =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...