Объединение Tkinter и SSHFS для использования tkFileDialog на удаленном сервере

Я хотел бы предоставить простой графический интерфейс для выбора файлов на удаленном сервере для моего приложения. Виджеты Tkinter не поддерживают это по своей сути, поэтому я ищу обходные пути. Моя локальная машина — Mac, а удаленная машина — CentOS 6.9.

Тип процесса, который мне нужен, таков: пользователь выбирает удаленный файл. Сценарий Python используется для извлечения информации из этого файла и записи ее в новый файл в том же каталоге.

Возможно, гораздо проще было бы, если бы пользователь предоставил имя файла через filename = input("Path to file: "), но это требует, чтобы пользователь сначала получил путь с удаленного сервера. В идеале я хотел бы, чтобы приложение было самосогласованным.

Можно ли использовать SSHFS в сочетании с модулем tkFileDialog? Пользователь просматривал смонтированную файловую систему, выбирал файл, выполнялись действия, и новый файл сохранялся в смонтированной файловой системе и автоматически переносился в удаленную систему. Возможный?

Или бредовая идея: я бы воссоздал удаленную файловую структуру $HOME локально, но просто создал временный каталог и кучу правильно названных пустых файлов. Пользователь может пройтись по этой «фальшивой» файловой системе, выбрать интересующий файл, а затем приложение может использовать этот путь для извлечения файла, выполнения действий и отправки обратно нового файла... Ладно, возможно, не самый элегантный решение....


person Yoda    schedule 17.09.2019    source источник
comment
какую систему вы используете - Windows, Linux, Mac? В Linux Mint я могу использовать стандартный файловый менеджер — Caja/Nemo/Nautilus — и, используя адрес sftp://[email protected], я могу видеть удаленные папки и файлы (на сервере, который использует ssh), как и локальные файлы. Вероятно, он смонтирован в какой-то папке, и я мог бы использовать любой инструмент для работы с удаленными файлами, но я не пробовал tkFileDialog.   -  person furas    schedule 17.09.2019
comment
Моя локальная машина — Mac, удаленная — CentOS.   -  person Yoda    schedule 17.09.2019
comment
Я протестировал, и он определил мой компьютер Raspberry Pi (с Debian) как папку /run/user/1000/gvfs/sftp:host=raspberry,user=pi/, и я могу выбрать файл с askopenfilename, и он может прочитать его со стандартными open() и read(). Но я не знаю, использует ли он sshfs или, скорее, gvfs   -  person furas    schedule 17.09.2019
comment
Не могли бы вы привести простой пример кода? В документации по SSHFS немного не хватает полезных примеров.   -  person Yoda    schedule 17.09.2019
comment
Я не могу, я использовал файловый менеджер с путем sftp://pi@raspberry, и он автоматически его смонтировал. Мне не нужно монтировать его вручную.   -  person furas    schedule 17.09.2019
comment
Используя Google, я нашел несколько руководств для sshfs: т.е. Смонтировать удаленный Папка SSH в Ubuntu (cmd и GUI)   -  person furas    schedule 17.09.2019


Ответы (1)


Я протестировал sshfs на ноутбуке (Linux Mint) для доступа к удаленной папке на Raspberry Pi (Raspbian на основе Debian), и он может монтировать удаленную папку как локальную, а затем я могу использовать Python и другие программы для работы с удаленными файлами.

Чтобы установить его:

mkdir local_pi
sshfs [email protected]:/home/pi/ local_pi

# here ask for password of user `pi` 

Он монтирует удаленную папку /home/pi/ как локальную папку local_pi и блокирует доступ к /home/, поэтому он может ограничить доступ только к некоторой папке и ее подпапкам.


Я тестировал на Python, и это сработало:

  • tkFileDialog.askopenfilename() для выбора файла
  • стандартные open(), read(), write() для чтения и записи файла
  • os.makedirs(dirname) для создания папки
  • os.listdir(dirname) чтобы получить имена файлов в папке
person furas    schedule 17.09.2019
comment
весь ли удаленный контент загружается на локальный компьютер? - person Yoda; 17.09.2019
comment
нет, он все время держит открытое ssh-соединение, и когда вы read() файл, он должен получить его с сервера, а когда вы write(), он отправляет его на сервер. - person furas; 17.09.2019
comment
Я могу подтвердить, что это работает и в моей системе. Это очень круто! - person Yoda; 17.09.2019