Python подключить сетевой диск
Сегодня мы узнаем о ftp-операциях в python. FTP – это аббревиатура от File Transfer Protocol. Как и звучит, этот протокол используется для передачи файлов по сети от источника к машине назначения.
В этом посте мы увидим, как подключиться к FTP-серверу, загрузить файлы загрузки и многое другое.
В Python модуль ftplib предоставляет все функции, которые могут нам понадобиться для выполнения действий по протоколу FTP. Начнем изучение этого урока с простой попытки подключения.
Отправка команды на сервер с помощью функции sendcmd()
Когда мы запускаем этот скрипт, мы видим полный вывод на нашей собственной консоли:
Доступ к каталогам с помощью функции retrlines()
Теперь, как и в открытой оболочке SSH, мы можем использовать ftplib для доступа к каталогам на сервере, навигации по ним и изменения их в зависимости от потребностей.
Посмотрите на последнюю строку, мы использовали retrlines() функцию для вывода списка текущих каталогов. Результатом этого сценария будет:
Скачивание файлов с помощью функции retrbinary()
Используя модуль ftpliob, мы даже можем загружать файлы локально. Стоит отметить, что для этого у вас должен быть надлежащий доступ к серверу, а также должны быть известны каталоги, имена файлов и точные пути.
Мы просто получим доступ к файлу на сервере и загрузим его локально:
Я добавляю несколько операторов печати между ними, чтобы сделать вывод более понятным. Давайте запустим эту программу сейчас:
И вот файл, который был загружен:
Обратите внимание, что вам нужно будет изменить местоположение загрузки файла в зависимости от пути к локальному компьютеру перед запуском этого кода.
Мое решение:
Есть ли способ лучше решить проблему? Не думаю, что мой сокращенный синтаксический анализ - "хорошее" решение .
Сетевое расположение (не только сетевые диски!):
Разбираю вывод net use . Грязно, но работает на всех окнах.
Эта «Сетевая папка» представляет собой ярлык в «% AppData% \ Microsoft \ Windows \ Network Shortcuts», который отображается в папке виртуального компьютера. Это не подключенный привод, который будет указан в списке net use .
Вы можете использовать комбинацию PyWin32 и ctypes, чтобы получить IShellItem для FOLDERID_ComputerFolder . Привяжите его к IEnumShellItems , чтобы отобразить папку. Для каждого элемента проверьте, является ли это ссылкой через GetAttributes(SFGAO_LINK) . Если это так, получите целевой элемент оболочки, привязав к BHID_LinkTargetItem , а затем получите путь к файловой системе через GetDisplayName(SIGDN_FILESYSPATH) , который должен быть UNC-путем.
Я в замешательстве. Вы предпочитаете, чтобы все работало так, как раньше? Или вам специально нужно переключиться с сетевых дисков на сетевые ярлыки (не из-за изменений ОС, а потому, что вы так выбрали)? Вопрос по этому поводу неясен.
@ivan_pozdeev Я обновил вопрос, чтобы прояснить свою проблему!
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Изменение каталогов с помощью функции cwd()
В приведенном выше примере мы перечислили каталоги, к которым в настоящее время обращается наш скрипт. Чтобы добавить, мы можем легко увидеть текущий каталог как:
Здесь мы переключаемся на один из подкаталогов, замеченных нами ранее, и получаем следующие результаты:
Переданный атрибут LIST просто извлекает файлы и папки в текущем каталоге вместе с их информацией, которую мы затем печатаем.
Пример
Ответы 1
(The first section is background information. Scroll to the next horizontal line for concrete suggestions.)
Фактически вы подключаете сетевые диски в Win10 так же, как и в предыдущих версиях: Как подключить сетевой диск в Windows 10.
На скриншоте вы показали нет подключенный диск, а скорее «ярлык сети». В XP была аналогичная функция под названием «Сетевое окружение», которая собирала автоматически сгенерированный список последних посещенных сетевых ресурсов - то же самое, что и «Недавние» для недавно открытых файлов; эта папка имеет KNOWNFOLDERID FOLDERID_NetHood и использовала папку NetHood в профиле пользователя. Эта функция была удалена в Vista, потому что она оказалась бесполезной.. Этот же KNOWNFOLDERID теперь используется для функции «Сетевые расположения», которая в основном такая же, но список составляется вручную и / или администраторами домена через групповую политику, и по умолчанию он занимает папку Network Shortcuts .
Обратите внимание, что подключенные диски и сетевые расположения предназначены для каждого пользователя.
Теперь, чтобы сделать свой код надежным, все, что вам нужно, - это не полагаться на «внутренние знания» о расположении и форматах, а по возможности использовать предоставленные API:
Не указывайте путь к папке жестко, а получите его с помощью GetKnownFolderPath . Эта функция не предоставляется pywin32 начиная с v223 , но мы можем использовать более старый совместимый SHGetFolderPath :
Для чтения ярлыки и новомодные «ярлыки папок», вместе называемые «Shell Links» shell32 предоставляет официальный интерфейс, но только на базе COM IUnknown , IShellLink (реализуется COM-классом ShellLink ), который, таким образом, является не может использоваться pywin32 . Я также подтвердил, что Wscript.Shell может работать только с обычными ярлыками. Итак, ваш алгоритм для этого достаточно хорош.
Привет, спасибо за ответ, я этого не знал! Но проблема остается, на моем ноутбуке сетевое местоположение добавляется ИТ-отделом, поэтому я не могу изменить метод, который они используют. Похоже, они просто добавляют сетевые расположения, а не сетевые диски (сейчас в Windows 10). Но все же приятно знать, что по идее ничего не изменилось;)
Для известных папок вы можете вызвать SHGetKnownFolderIDList через ctypes. Настройка там немного запутана для комментария. Затем преобразуйте адрес в PIDL через shell.AddressAsPIDL PyWin32. В остальном все просто. shell_item = shell.SHCreateShellItem(None, None, pidl); items = list(shell_item.BindToHandler(None, shell.BHID_EnumItems, shell.IID_IEnumShellItems)) . Затем, если item.GetAttributes(shellcon.SFGAO_LINK) , получите цель ссылки через link_item = item.BindToHandler(None, shell.BHID_LinkTargetItem, shell.IID_IShellItem); target_path = link_item.GetDisplayName(shellcon.SIGDN_FILESYSPATH) .
Использование с функцией getwelcome()
Подключение к FTP-серверу с помощью функции login()
Мы начнем с подключения к FTP-серверу. Мы будем использовать общедоступный для использования сервер ftp.cse.buffalo.edu. Не стесняйтесь выбирать любой сервер, просто убедитесь, что вы выбрали правильный, иначе вы столкнетесь с ошибками подключения.
Напишем простой скрипт для подключения к указанному серверу:
Посмотрите, как мы можем войти в систему без имени пользователя и пароля? Это поддерживается только несколькими серверами. Давайте посмотрим на результат:
В этом примере мы начали с импорта одного класса из полного модуля с именем FTP. Мы использовали его объект для подключения к хосту и анонимного входа на сервер.
Конечно, мы не передали порт для подключения. Это означает, что, как и любой другой запрос, он будет доставлен на порт сервера по умолчанию. Чтобы изменить это, также укажите порт для подключения:
Убедитесь, что порт, к которому вы подключаетесь, действительно поддерживает входящее FTP-соединение.
Путь к каталогу с функцией pwd()
Мы можем получить путь к текущему рабочему каталогу сервера, на котором сейчас присутствует наше соединение:
Вывод для этого скрипта просто покажет текущий рабочий каталог:
Закрытие соединения с функцией close()
Мы должны закрыть ftp-соединение, как только мы закончим с любыми необходимыми задачами:
Добрый день, коллеги. Со времени написания первой статьи прошло достаточно много времени. За это время моя библиотечка для доступа к диску научилась работать со встроенными SMART-тестами и их логами а также механизмами безопасности современных накопителей.
На этот раз я расскажу о создании приложения для тестирования жестких дисков на базе этой библиотеки.
Мне нужно было приложение, которое можно запустить на сервере с hot-swap корзиной и тестировать на нем диски, заменяя их по мере прохождения тестов. Лучшим решением для этого мне показалось запускать процесс тестирования каждого диска в отдельном потоке. Поскольку опыта многопоточного программирование в python у меня не было, я начал изучать вопрос. Для создания многопоточных приложений в питоне есть модуль threading. Поскольку потоки создаются в пределах одного процесса, нет никакой проблемы с доступом к общим данным. Все выглядит очень просто. К сожалению меня поджидала проблема. Моя библиотека отказалась работать в режиме многопоточности. Значит путь мой лежал к написанию приложения с несколькими процессами и всеми прелестями межпроцессного взаимодействия. В питоне для этого есть модуль multiprocessing.
Архитектура приложения мне виделась следующим образом: Основной поток занимается взаимодействием с пользователем. Выводит список дисков, принимает команды и отображает прогресс тестов. Каждая команда диску запускается в отдельном процессе. Чтобы быть уверенным, что тест выполнится именно на том диске, на который отдавалась команда в меню, (диски например можно случайно переставить местами и забыть перечитать в программе) ключом для выполнения команды сделан серийный номер диска. Перед выполнением команды проверяется соответствие серийного номера переданного команде при запуске, серийному номеру подключенного диска. При несовпадении номеров команда отклоняется со звуковым сигналом. Полезная функция, чтобы случайно не запустить деструктивный тест на диске, подключенном чтобы посмотреть SMART.
Для обмена данными между основным процессом и процессами тестирования было создано несколько словарей. Ключами словарей являются серийные номера дисков. Мне не очень нравится решение в виде пачки словарей, но лучшего я пока не придумал.
Вот, как выглядит главное окно программы.
Каждый диск в программе имеет режим, в котором он находится. По умолчанию это режим простоя «idle». При запуске теста этот режим изменяется на название выполняемого теста. Процесс теста регулярно проверяет соответствие режима своему названию а при несовпадении прерывает тест. Таким образом основной процесс может прервать выполнение теста поменяв диску режим на idle. Программа может запускать на дисках встроенные SMART-тесты (Short и Extended), проверять диски последовательным чтением и записью. При этом тест записи сделан цикличным, прописывающим диск снова и снова, отмечая сколько циклов было сделано. Непрерывная циклическая запись позволяет «добить» диски у которых «сыпется» поверхность, но которые еще не набрали нужное количество ошибок для возврата поставщику. За несколько дней в таком режиме они обычно доходят до состояния SMART status bad, что является основанием для замены. На экране, при тестировании показывается скорость прохождения теста (где это возможно), количество ошибок диска и количество «медленных» секторов. Время, после которого сектор считается «медленным» задается константой в программе. Программа также умеет показывать основную информацию по диску, SMART и логи SMART-тестов.
Тест записи может прописывать диск как нулевыми значениями так и уникальным паттерном, по которому можно будет определить, что диск уже тестировался этой программой. Метод записи переключается тоже константой. Поскольку программа рассчитывалась на загрузку тестовой среды по сети, в ней есть возможность отключить в меню пункт выхода из программы.
Вот такая получилась утилитка, может кому нибудь пригодится. Код утилиты и библиотеки, на которой она построена доступен на github.
Samba4 имеет встроенный интерфейс на Python. Многие утилиты (samba-tool, например) полностью реализованы на Python с применением этого интерфейса.
Все, что делалось из LDAP-интерфейса, можно сделать на Samba 4 Python Scripting. Преимущества — файловый доступ, значит высокая скорость, некоторые фичи, которых нет в LDAP. Например, можно взять хэш паролей пользователей из одной базы и перекинуть в другую. Да и самих пользователей с их SID-ами, паролями и всем прочим перекинуть в другой домен (без заморочек с SID-history).
Документации маловато, но есть примеры в каталоге /python/samba, если есть исходники, иначе где-то в /usr/lib/python2.7/dist-packages/samba.
Наибольший интерес представляет файл samdb.py — реализация большинства операций в AD.
Пусть мы имеем установленную Samba4 в конфигурации AD domain controller. Попробуем подключиться к базе AD из Python-программы. Для начала импортируем необходимые библиотеки:
Подключение к основной базе /sam.ldb:
(Возможно подключение и при нестандартном расположении файлов и каталогов инсталляции Samba4 и даже к отдельно стоящей временной базе. Об этом ниже.)
Теперь объект sam позволяет осуществлять поиск и модификацию базы AD в полном соответствии с синтаксисом LDAP.
Например, поиск по базе (base — узел дерева LDAP типа «CN=Users,DC=myDom,DC=lan», expression — необязательное условие отбора, attrs — список желаемых атрибутов):
Пусть пользователи лежат в ОУ:
Создадим пользователя «tst» c паролем «secret». Класс SamDB имеет готовый метод — newuser(), но можно попробовать и так:
Как видим, SamDB поддерживает транзакции.
Всю базу AD, если она не очень большая, можем посмотреть (и отредактировать) командой:
Но лучше ограничивать выборку с помощью опции -s или -b (база), например, -b 'CN=RID Manager$,CN=System,DC=myDom,DC=com'.
Перенос хешей паролей можно сделать по такой схеме:
Пусть у нас есть старая база AD — тоже на Samba4. Можно получить реплику базы из Win AD, подключив новую инсталляцию Samba4 в качестве дополнительного AD DC — хорошо документированная и простая процедура — см. здесь.
Скопируем и подключимся к ней — назовем соединение sam0. Подключение с нестандартными путями (пусть скопирована в /tmp/priv и там же его smb.conf):
Чтобы получить весь список пользователей, да еще с паролями, сделаем такой запрос:
Будем перебирать базу пользователей и добавлять их в новую базу. Схематически это выгляди так:
Теперь реальный пример переноса пользователей из домена под Win 2003 в Samba4.
В старом домене накопились проблемы (начиная даже с неправильного имени домена). Нормальная репликация с DC на Samba4 (в обратную сторону — Samba4 DC -> W2003 DC) никак не завелась, вероятно из-за внутридоменных проблем.
Задача отягощалась наличием файлового сервера на Samba3, поэтому надо было сохранить мапинг sAMAccountName (UID,GID), уже существующий в Samba3 (обычно /var/lib/samba/winbindd_idmap.tdb). Собственно задача была похожа на описанную здесь.
Все эксперименты и конечный вариант делались на серверах Ubuntu 14.04, запущенных в контейнерах OpenVZ (CentOS 6)
Установка, настройка Samba4 описана много раз. Например, уже упомянуто, здесь. Для нормального отображения Unix ID в схеме с rfc2307 использовался sssd. Кстати, сборку Samba4 от sernet, которую многие рекомендуют, лучше не использовать — ее трудно подружить с пакетом sssd.
Воздействие на существующий Win AD домен минимально (создается еще один контроллер, почти неработающий, поэтому в логах будет много ошибок NTDS Replication), после создания автономой базы AD можно без риска поупражняться в виртуальных средах. Если MS Win домен должен еще какое-то время нормально работать, лучше эту временную Samba4 убить и вычистить информацию об этом DC из работающих DC.
Полученную private directory (обычно /var/lib/samba/private или /usr/local/samba/private) надо скопировать куда-нибудь на будущий Samba4 и туда же скопировать smb.conf из /etc/samba. Теперь все данные о старом домене хранятся в одном месте и к тому же доступны в локальной ФС.
Если есть еще файл-сервер на Samba3, то где-нибудь рядом надо также положить и каталог /var/lib/samba от Samba3 (там нужны 2 файла — winbindd_idmap.tdb и group_mapping.tdb), если мы хотим сохранить сложившийся в Samba3 idmap.
Исходные параметры оформляем в виде файла conf.py:
Соберем основные функции переноса в один файл
Здесь присутствует вызов get_dom_sid.py как внешней программы в функции mk_dom() — инициализация нового домена.
get_dom_sid.py просто печатает SID старого домена:
Так пришлось сделать, поскольку при подключении к базе старого домена в том же потоке, что и создание нового происходило замещение переменных окружения старыми данными.
Итак, после того, как установлены все необходимые пакеты (samba4, sssd и зависимости), скопированы в нужные места каталоги старых баз, можем начать создание нового домена.
Инициализация домена — запуск mk_dom.py:
Если все прошло нормально (лог-файл имеет имя log_%y-%m-%d_%H:%M:%S.txt) смотрим smb.conf, временно добавляем в секции [global]
dns forwarder = (на время перевода рабочих станций в новый домен).
Копируем krb5.conf из /var/lib/samba/private в /etc (или делаем символический линк). Далее запускаем скрипт копирования объектов старого домена cp_dom.py:
Если все терпимо, стартуем Samba:
Детально описано здесь (Method 1: Connecting to AD via Kerberos).
Готовим керберос для sssd:
Кстати, сброс кэш sssd может не помочь при больших изменениях AD. Тогда надо, при остановленном sssd, удалить каталог из /var/lib/sss/ и восстановить их пустую структуру (из установочного пакета).
Проверяем отображение пользователей и групп (база sssd заполняется некоторое время):
Перетащить пользователей проще всего утилитой netdom.exe (netdom.exe move /?), добавив ее в логон-скрипт на старом сервере. Только надо запускать подходящую для ОС версию netdom.exe. Поскольку SID, GID, UID и пароли пользователей сохраняются, то перемещение почти прозрачно для пользователей — локальные папки остаются с ними, сетевые ресурсы тоже. Надо только переименовать домен в конфигурации файлового сервера Samba.
У меня было еще проще — поскольку весь это зоопарк жил под OpenVZ, сетевой ресурс на отдельной ФС легко монтировался к разным файловым серверам одновременно (можно и DC сделать файловым сервером — нормально), а проблемы доступа автоматически решались соответствием GID и UID.
У меня есть служба Windows (XP SP3), написанная на Python, которая должна иметь возможность монтировать сетевой диск для ВСЕХ пользователей. Я пытался использовать net use with subprocess (даже с полным путем к net.exe), но, учитывая, что ваш сервис работает от имени пользователя SYSTEM, net он вас очень недоволен (жалуется на отсутствие пользовательского контекста). Вероятно, есть способ сделать это через WMI, но я не смог его понять.
РЕДАКТИРОВАТЬ : На самом деле, возможно, вы не можете сделать это с WMI. Эта статья указывает, что эта функция доступна в WSH, но не в WMI. Может быть, какой-то способ использовать net или map сделать это все-таки?
Э. к сожалению, короткий ответ - нет. Если программа Python работает как служба Windows, здесь есть несколько сложностей. поэтому позвольте мне объяснить.
Во-первых, даже для того, чтобы позволить самой сервисной программе получить доступ к сети, она должна работать под учетной записью пользователя, которому разрешен доступ к сети. Учетная запись SYSTEM отключена (любой доступ к сети запрещен), но вы можете использовать учетную запись «NETWORK SERVICE» (которая в среде домена действительно является учетной записью домена машины) или другую фактическую учетную запись пользователя.
Но вы не сможете сопоставить диск в учетной записи службы, потому что он не загружает материал профиля пользователя, который включает возможность «сопоставить» с буквой диска. (Ну, технически, если служба запускает пакетный файл CMD, этот сценарий может сопоставить букву диска и использовать ее, но тогда она не будет сохраняться при следующем входе в систему. но неважно.) Вместо этого все, что программа хочет попасть в сеть, должен быть доступен через пути UNC (например, \SERVERNAME\SHARENAME).
Однако вы можете сделать что-то вроде этого: Создайте сценарий входа (или групповую политику и т. д.), который сопоставляет диск с ожидаемой буквой (скажем, «M:», например) с общим ресурсом сервера (\server\share). Если этот сценарий запускается для каждого пользователя при входе в систему, все они будут иметь одинаковое сопоставление. Затем, когда вашей программе, работающей как услуга, потребуется доступ к этому общему ресурсу, ей придется использовать пути UNC (и, конечно, учетную запись пользователя с соответствующими привилегиями).
Как я могу получить список всех дисков и сетевых расположений с Python под Windows 10? Список должен состоять из «Локальные диски», «Сетевые диски» и «Сетевые расположения».
Читайте также: