Как смонтировать и размонтировать папку с помощью 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)