Как смонтировать сетевой каталог с помощью python? - PullRequest
9 голосов
/ 09 февраля 2010

Мне нужно смонтировать каталог "dir" на сетевой машине "data", используя python на машине linux

Я знаю, что могу отправить команду через командную строку:

mkdir ~/mnt/data_dir
mount -t data:/dir/ ~/mnt/data_dir

но как бы я отправил эти команды из скрипта Python?

Ответы [ 4 ]

9 голосов
/ 03 марта 2011

Я бы порекомендовал вам использовать subprocess.checkcall.

from subprocess import *

#most simply
check_call( 'mkdir ~/mnt/data_dir', shell=True )
check_call( 'mount -t whatever data:/dir/ ~/mnt/data_dir', shell=True )


#more securely
from os.path import expanduser
check_call( [ 'mkdir', expanduser( '~/mnt/data_dir' ) ] )
check_call( [ 'mount', '-t', 'whatever', 'data:/dir/', expanduser( '~/mnt/data_dir' ) ] )
7 голосов
/ 22 апреля 2011

Я пробовал это в chroot без установленного proc

/ # python
Python 2.7.1 (r271:86832, Feb 26 2011, 00:09:03) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> from ctypes import *
>>> libc = cdll.LoadLibrary("libc.so.0")
>>> os.listdir("/proc")
[]
>>> libc.mount(None, "/proc", "proc", 0, None)
0
>>> os.listdir("/proc")
['vmnet', 'asound', 'sysrq-trigger', 'partitions', 'diskstats', 'crypto', 'key-users', 'version_signature', 'kpageflags', 'kpagecount', 'kmsg', 'kcore', 'softirqs', 'version', 'uptime', 'stat', 'meminfo', 'loadavg', 'interrupts', 'devices', 'cpuinfo', 'cmdline', 'locks', 'filesystems', 'slabinfo', 'swaps', 'vmallocinfo', 'zoneinfo', 'vmstat', 'pagetypeinfo', 'buddyinfo', 'latency_stats', 'kallsyms', 'modules', 'dma', 'timer_stats', 'timer_list', 'iomem', 'ioports', 'execdomains', 'schedstat', 'sched_debug', 'mdstat', 'scsi', 'misc', 'acpi', 'fb', 'mtrr', 'irq', 'cgroups', 'sys', 'bus', 'tty', 'driver', 'fs', 'sysvipc', 'net', 'mounts', 'self', '1', '2', '3', '4', '5', '6', '7', '8' ..........

Вы должны иметь возможность изменить файл устройства с «Нет» на формат, который функция mount () ожидает для сетевых ресурсов. Я считаю, что это то же самое, что и команда монтирования "host: / path / to / dir"

2 голосов
/ 10 февраля 2010

Пример использования модуля subprocess:

import subprocess

subprocess.Popen(["mkdir", "~/mnt/data_dir", "mount", "-t", "data:/dir/", "/mnt/data_dir"])

OR

import subprocess

subprocess.Popen("mkdir ~/mnt/data_dir mount -t data:/dir/ /mnt/data_dir", shell=True)

Вторая версия использует оболочку для выполнения команды. Несмотря на то, что в большинстве ситуаций его удобочитаемее и проще в использовании, его следует избегать при передаче пользовательских аргументов, поскольку они могут привести к внедрению оболочки (т. Е. В этом случае выполняется команда, отличная от mkdir).

2 голосов
/ 09 февраля 2010

Вот один из способов:

import os

os.cmd ("mkdir ~/mnt/data_dir mount -t data:/dir/ /mnt/data_dir")

Вы также можете использовать «popen», если хотите прочитать вывод команды в вашем скрипте.

Е.И.В.

... * Richie 1008 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...