#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'], [])