Как смонтировать и размонтировать папку с помощью sshfs и Python Subprocess?

Я хочу иметь возможность монтировать и затем размонтировать каталог, вызывающий sshfs из модуля подпроцесса Python. Вот код, который я использую для этого.

import subprocess 
mkdir_command = 'mkdir {}'.format(local_data_directory)
unmount_command = 'umount {}'.format(local_data_directory)
mount_command = 'sshfs -o allow_other -o IdentityFile={} {}@{}:{} {}'.format(
    key_file, host_username, host_ip, host_data_directory, local_data_directory)
subprocess.call(mkdir_command, shell=True)
subprocess.call(mount_command, shell=True)
subprocess.call(unmount_command, shell=True)

Команды mkdir и mount успешно выполнены, но когда я пытаюсь размонтировать каталог, я получаю сообщение об ошибке umount fail: операция не разрешена. Я предполагаю, что это потому, что пользователь подпроцесса не имеет разрешения на запись в родительскую папку local_data_directory. Когда я проверяю права доступа local_data_directory, он говорит, что владелец - пользователь #1004. Это пользователь по умолчанию для подпроцесса Python? Думаю, я мог бы просто дать этому пользователю доступ на запись ко всем родительским каталогам, но я не хочу давать возможность записи подпроцесса для всей моей домашней папки. Есть ли способ решить это без этого?

2 ответа

Решение

Оказывается, решение состоит в том, чтобы использовать fusermount вместо mount

import subprocess 
mkdir_command = 'mkdir {}'.format(local_data_directory)
unmount_command = 'fuserumount {}'.format(local_data_directory)
mount_command = 'sshfs -o allow_other -o IdentityFile={} {}@{}:{} {}'.format(
    key_file, host_username, host_ip, host_data_directory, local_data_directory)
subprocess.call(mkdir_command, shell=True)
subprocess.call(mount_command, shell=True)
subprocess.call(unmount_command, shell=True)

Рекомендуется не использовать пользователя sudo для sshfs, вы можете убедиться, что вы сделалиssh-copy-id host_username@host_ipа потом просто,

      import subprocess
mount_command = f'sshfs {host_username}@{host_ip}:{host_data_directory} {local_data_directory}'
subprocess.call(mount_command, shell=True)
# Do your stuff with mounted folder
unmount_command = f'fusermount -u  {local_data_directory}'
subprocess.call(unmount_command, shell=True)
Другие вопросы по тегам