Como montar um diretório de rede usando python?
Pergunta
Eu preciso montar um diretório "dir" em uma máquina da rede "dados" usando python em uma máquina linux
Eu sei que eu posso enviar o comando via linha de comando:
mkdir ~/mnt/data_dir
mount -t data:/dir/ ~/mnt/data_dir
mas como eu ia enviar esses comandos de um script python?
Solução
Aqui está uma maneira:
import os
os.cmd ("mkdir ~/mnt/data_dir mount -t data:/dir/ /mnt/data_dir")
Você também pode usar "popen" se você quiser ler a saída do comando em seu script.
HIH
... Richie
Outras dicas
Eu recomendo que você 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' ) ] )
Eu tentei isso em um chroot sem 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' ..........
Você deve ser capaz de alterar o arquivo de dispositivo de "Nenhum" para o formato do Monte () espera função para compartilhamentos de rede. Eu acredito que é o mesmo que o comando mount "host: path / / to / dir"
Exemplo usando o módulo subprocess
:
import subprocess
subprocess.Popen(["mkdir", "~/mnt/data_dir", "mount", "-t", "data:/dir/", "/mnt/data_dir"])
ou
import subprocess
subprocess.Popen("mkdir ~/mnt/data_dir mount -t data:/dir/ /mnt/data_dir", shell=True)
A segunda versão usa o shell para executar o comando. Enquanto mais legível e mais fácil de usar na maioria das situações, ele deve ser evitado ao passar de usuários argumentos apresentados como aqueles pode levar a desembolsar injecção (execução ou seja, de outros comandos que mkdir neste caso).