2010-02-09 3 views
8

Ho bisogno di montare un "dir" directory su un computer di rete "dati" Usare Python su una macchina LinuxCome montare una directory di rete usando python?

So che posso inviare il comando tramite linea di comando:

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

ma come sarebbe Invio questi comandi da uno script Python?

+4

Duplicato: http://stackoverflow.com/questions/325463/launch-a-shell-command-with-in-a -python-script-wait-for-the-termination-and-retu –

+0

La domanda non è la stessa, ma le risposte sono. –

+0

Vecchia domanda, ma per avventure future. Dai un'occhiata a [mount.py] (https://github.com/MrVallentin/mount.py). – Vallentin

risposta

1

Ecco un modo:

import os 

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

È inoltre possibile utilizzare "popen" se si vuole leggere l'output del comando nello script.

HIH

... richie

+3

Un esempio migliore userebbe 'subprocess.Popen'. –

+4

L'esempio migliore userebbe 'subprocesso.check_call'. –

2

Esempio utilizzando il modulo subprocess:

import subprocess 

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

O

import subprocess 

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

La seconda versione utilizza la shell per eseguire il comando. Sebbene sia più leggibile e più facile da usare nella maggior parte delle situazioni, dovrebbe essere evitato quando si passano gli argomenti inviati dall'utente, poiché questi potrebbero portare all'iniezione della shell (ad esempio l'esecuzione di altri comandi oltre a mkdir in questo caso).

+1

Non credo che il tuo primo esempio funzionerà. il sottoprocesso non espanderà '~'. Quando 'shell = True' si espande, ecco perché il tuo secondo esempio funziona. –

9

Si consiglia di utilizzare 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') ]) 
6

ho provato questo in un chroot senza proc montato

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

Si dovrebbe essere in grado di modificare il file di dispositivo da "Nessuno" per il formato la funzione di montaggio() si aspetta per le condivisioni di rete. Credo che sia lo stesso del comando di mount "host:/path/to/dir"

+1

Sei fantastico. – synthesizerpatel