2010-02-09 9 views
8

Ich brauche ein Verzeichnis „dir“ auf einem Netzwerkgerät „Daten“ mit Python auf einem Linux-RechnerWie mounte ich ein Netzwerkverzeichnis mit Python?

ich zu montieren, dass ich den Befehl über die Befehlszeile senden:

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

aber wie würde Ich sende diese Befehle von einem Python-Skript?

+4

Duplizieren: http://StackOverflow.com/Questions/325463/Launch-Ashell-Command-with-in-A -python-script-wait-for-the-termination-and-retu –

+0

Die Frage ist nicht die gleiche, aber die Antworten sind. –

+0

Alte Frage, aber für zukünftige Abenteuer. Sehen Sie sich [mount.py] (https://github.com/MrVallentin/mount.py) an. – Vallentin

Antwort

1

Hier ist eine Möglichkeit:

import os 

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

Sie auch verwenden können „popen“, wenn Sie die Ausgabe des Befehls in Ihrem Skript lesen möchten.

HIH

... richie

+3

Ein besseres Beispiel würde 'subprocess.Popen' verwenden. –

+4

Das beste Beispiel wäre 'subprocess.check_call'. –

2

Beispiel das subprocess Modul:

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) 

Die zweite Version der Shell verwendet den Befehl auszuführen. Obwohl es in den meisten Situationen besser lesbar und einfacher zu verwenden ist, sollte es vermieden werden, wenn vom Benutzer übermittelte Argumente übergeben werden, da dies zur Shell-Injektion führen könnte (d. H. In diesem Fall andere Befehle als mkdir ausführen).

+1

Ich glaube nicht, dass Ihr erstes Beispiel funktioniert. Unterprozess wird '~' nicht erweitern. Wenn 'shell = True' ist, wird es erweitert, weshalb Ihr zweites Beispiel funktioniert. –

9

Ich würde Ihnen empfehlen, subprocess.checkcall zu 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') ]) 
6

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' .......... 

Sie sollten für Netzwerkfreigaben von „None“, um das Format der Halterung() Funktion erwartet der Lage sein, die Gerätedatei zu ändern. Ich glaube, es ist das gleiche wie der Mount-Befehl "Host:/Pfad/zu/Verzeichnis"

+1

Sie sind fantastisch. – synthesizerpatel

Verwandte Themen