ос.прогулка по удаленному серверу Linux

#python #linux #os.walk

#python #linux #os.walk

Вопрос:

Возможно ли os.walk() прочитать содержимое удаленного сервера Linux без каких-либо сторонних библиотек?

Я знаю, что в Windows мы можем использовать UNC-пути, например:

 os.walk(r"\serversharenamepathdir")
  

Но как мы можем сделать это в Linux? (Удаленный сервер Linux строго контролируется и не имеет установленного Samba demon; кроме того, локальная машина также строго контролируется и не допускается установка каких-либо сторонних библиотек, только стандартных библиотек Python 3.8.)

Комментарии:

1. можете ли вы подключиться по ssh к удаленному серверу?

2. Работают ли обе машины под управлением Linux? У вас есть разрешения на подключение удаленного сервера? Если это так, вы можете использовать что-то вроде sshfs утилиты; руководство . Затем пройдитесь по структуре, как если бы это был локальный каталог.

3. Да, я могу подключиться по ssh к удаленному серверу. Оба сервера работают под управлением Linux (хотя один может быть CentOS, а другой Debian или что-то еще). Я не уверен, есть ли у нас sshfs или нам разрешено его устанавливать, но я могу изучить это. Спасибо.

4. Ваш вопрос не ясен. Возможен ли ssh от локального к удаленному? Если да, то почему бы не запустить что-нибудь на удаленном компьютере, чтобы получить список файлов? Если python установлен на удаленном компьютере, то вы уже знаете об os.walk. В противном случае существует множество команд оболочки, таких как find, которые могут возвращать дерево имен файлов.

5. Установите sshfs на локальном компьютере, смонтируйте удаленный ящик в произвольный каталог и «пройдитесь» по нему … конечно, будут проблемы с разрешениями / владельцами (я искренне надеюсь, что вы не можете использовать ssh как root), но это максимально близко к именам Windows / CIFS и UNC.

Ответ №1:

Мы не можем напрямую работать os.walk на удаленной машине. Но мы можем написать аналогичную функцию, не совсем с той же функциональностью, но с наилучшим подходом с помощью open_sftp , listdir_attr и paramiko . Один пример, который я попробовал.

 import paramiko
from stat import S_ISDIR

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('ip_address_remote_machine', username='username', password='password', banner_timeout=60)
sftp = client.open_sftp()

        def sftpwalk(dl):
            remotepath = dl
            files = []
            folders = []
            for f in sftp.listdir_attr(remotepath):
                if S_ISDIR(f.st_mode):
                    folders.append(f.filename)
                    #print(dl f.filename)
                    sftpwalk(dl f.filename "/")
                else:
                    # if
                    files.append(f.filename)
            # print (path,folders,files)
            print( remotepath,folders,files)
    
    dl= '/home/generic/Nizam/'
    sftpwalk(dl)
    client.close
  

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

Под Nizam у меня есть dir1, dir2, dir3, а у dir1 есть dir11, dir12 с некоторыми файлами.

Вывод этого:

 (u'/home/generic/Nizam/dir2/', [], [])
(u'/home/generic/Nizam/dir1/dir12/', [], [])
(u'/home/generic/Nizam/dir1/dir11/', [], [u'11.txt'])
(u'/home/generic/Nizam/dir1/', [u'dir12', u'dir11'], [u'2.txt', u'1.txt', u'3.txt'])
(u'/home/generic/Nizam/dir3/', [], [])
('/home/generic/Nizam/', [u'dir2', u'dir1', u'dir3'], [])