Wie ein Netzwerk-Verzeichnis mit Python montieren?
Frage
Ich brauche ein Verzeichnis „dir“ auf einem Netzwerkgerät „Daten“ montieren mit Python auf einer Linux-Maschine
Ich weiß, dass ich den Befehl über die Befehlszeile senden kann:
mkdir ~/mnt/data_dir
mount -t data:/dir/ ~/mnt/data_dir
aber wie würde ich diese Befehle von einem Python-Skript senden?
Lösung
Hier ist eine Möglichkeit:
import os
os.cmd ("mkdir ~/mnt/data_dir mount -t data:/dir/ /mnt/data_dir")
Sie können auch „popen“ verwenden, wenn Sie die Ausgabe des Befehls in Ihrem Skript lesen möchten.
HIH
... richie
Andere Tipps
Ich würde empfehlen Sie subprocess.checkcall
verwenden.
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' ) ] )
Ich habe versucht, dies in einer chroot ohne proc montiert
/ # 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' ..........
Es soll möglich sein, das Gerät Datei zu ändern von „None“, um das Format der Halterung () Funktion erwartet für Netzwerkfreigaben. Ich glaube, es ist die gleiche wie die Mount-Befehl "host: / path / to / dir"
Beispiel des subprocess
Modul mit:
import subprocess
subprocess.Popen(["mkdir", "~/mnt/data_dir", "mount", "-t", "data:/dir/", "/mnt/data_dir"])
oder
import subprocess
subprocess.Popen("mkdir ~/mnt/data_dir mount -t data:/dir/ /mnt/data_dir", shell=True)
Die zweite Version verwendet die Shell den Befehl auszuführen. Während besser lesbar und leichter in den meisten Situationen zu verwenden, sollte es vermieden werden, wenn der Benutzer vorgelegte Argumente zu übergeben wie die Injektion zu schälen führen könnte (das heißt die Ausführung anderer Befehle als mkdir in diesem Fall).