2010-02-09 15 views
8

tengo que montar un "dir" directorio en una máquina de la red "datos" usando pitón en una máquina Linux¿Cómo montar un directorio de red usando Python?

Sé que puedo enviar el comando a través de la línea de comandos:

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

pero ¿cómo lo haría ¿Envío esos comandos desde un script python?

+4

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

+0

La pregunta no es la misma, pero las respuestas sí. –

+0

Pregunta anterior, pero para futuras aventuras. Eche un vistazo a [mount.py] (https://github.com/MrVallentin/mount.py). – Vallentin

Respuesta

1

Aquí es una manera:

import os 

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

También puede utilizar "popen" si quieres leer la salida del comando en el script.

HIH

... Richie

+3

Un mejor ejemplo usaría 'subprocess.Popen'. –

+4

El mejor ejemplo usaría 'subprocess.check_call'. –

2

Ejemplo usando el módulo de 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 segunda versión utiliza el Shell para ejecutar el comando. Aunque es más legible y más fácil de usar en la mayoría de las situaciones, se debe evitar al pasar los argumentos enviados por el usuario, ya que pueden conducir a la inyección del intérprete de comandos (es decir, la ejecución de otros comandos distintos a mkdir en este caso).

+1

No creo que su primer ejemplo funcione. el subproceso no expandirá '~'. Cuando 'shell = True' se expandirá y por eso funciona tu segundo ejemplo. –

9

Yo recomendaría que use 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

He intentado esto en un chroot sin proc montado

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

Usted debe ser capaz de cambiar el archivo de dispositivo de "Ninguno" para el formato de la función de montaje() espera a recursos compartidos de red. Creo que es lo mismo que el comando mount "host:/ruta/a/dir"

+1

Eres increíble. – synthesizerpatel

Cuestiones relacionadas