Mit python Netzwerklaufwerk einbinden

  • Hallo,

    ich würde gerne mit einem python Skript ein Netzwerklaufwerk einbinden.

    Ich habe das wie folgt versucht:

    import os

    os.system ('sudo mount -a')

    leider klappt das so nicht. Wenn ich im Terminal den Befehl so eingebe, dann funktioniert es.

    Was mache ich falsch? Kann man mit os.system den Befehl mount nicht ausführen?:helpnew:

    Danke für die Hilfe

  • Hallo,

    Verwende statt os.system bitte das Modul subprocess

    wenn Du das Skript als Root startest, dann kannst du das sudo im Befehl weglassen.

    Weiterer Hintergrund wär auch schön gewesen, so hätte man z.B gleich sagen können dass das automatische mounten fstab erledigt, sollte es zu Problemen kommen dass die Netzwerkverbindung noch nicht bereit steht, so würde ich die Aufgabe systemd zu kommen lassen

  • Hallo,

    anbec: `mount -a` bindet nicht _ein_ Netzwerklaufwerk ein, sondern _alle_ Laufwerke, die in der fstab eingetragen sind. Von daher ist `mount -a` per se schon mal für dein Anliegen falsch. Wenn du das von Hofei beschriebene Problem der nicht-Verfügbarkeit des Netzwerks zum Zeitpunkt des Abarbeitens von fstab hast, dann wäre der genannten Weg über eine systemd mount Unit mit der entsprechenden `Requires`-Direktive für die Netzwerk-Unit der richtige Weg.

    Wenn das Laufwerk in der fstab die Option `noauto` hat, dann bringt auch `mount -a` nix. Dann musst du das Laufwerk gezielt einhängen.

    `sudo` in `subprocess` (und auch in dem von dir verwendetem veraltetem und nicht empfehlenswertem `os.system` ist in der Regel keine gute Idee, weil du bei einem im Hintergrund laufenden Skript ggf. den Passwort-Prompt nie zu sehen bekommst.

    Gruß, noisefloor

  • Hallo,

    Verwende statt os.system bitte das Modul subprocess

    wenn Du das Skript als Root startest, dann kannst du das sudo im Befehl weglassen.

    Weiterer Hintergrund wär auch schön gewesen, so hätte man z.B gleich sagen können dass das automatische mounten fstab erledigt, sollte es zu Problemen kommen dass die Netzwerkverbindung noch nicht bereit steht, so würde ich die Aufgabe systemd zu kommen lassen

    Wie kann ich die Aufgabe systemd zukommen lassen?

    In der fstab steht "auto" drinnen. Manchmal meldet er beim Start das Laufwerk an und manchmal halt nicht. Ich würde gerne durch das Programm sicherstellen, dass das Laufwerk immer gemounted wird.

  • Hallo anbec

    Schau Lese dir mal das Thema durch. Da beschreibt der User @ThomasL sehr gut wie man sich auf ein NAS via systemd verbindet.


    Gruß

    Oliver

    Danke für die Hilfe

    Ich habe das jetzt so wie Thomas gemacht aber leider startet der Server nicht automatisch wenn ich den PI reboote. Wenn ich es händisch mache, dann klappt alles. Ich hab alles 1:1 gemacht wie Thomas das beschreibt, nur meine Namen usw. eingegeben.

    2 Mal editiert, zuletzt von anbec (31. Juli 2018 um 13:11)

  • Hast du die mount.unit auch enabled? Was ist die Ausgabe von

    Code
    systemctl status media-mynas.mount

    Ja hab ich und nach einen Neustart ist der Status wieder inactive. Auf dem Raspberry hab ich den Benutzer PI gelöscht und einen neuen Nutzer angelegt. Hat die Systemdatei immer Rootrechte beim Systemstart? Wenn ich die systemdatei händisch ausführe, muss ich immer mein Passwort eingeben. Kann das damit zusammenhängen?

  • Hallo,

    Zitat


    Hat die Systemdatei immer Rootrechte beim Systemstart?

    Ja, Units werden per Voreinstellung mit Root-Rechten ausgeführt. Kann man ändern, dann muss du aber selber die entsprechenden Direktiven in die Unit einbauen.

    Poste doch mal bitte die volle mount-Unit, die du angelegt hast.

    Gruß, noisefloor

  • [Unit]

    Description=Mount Network-Drives

    Requires=serverctl.service

    Conflicts=shutdown.target

    ConditionPathExists=/media/cloud

    [Mount]

    What=//IP Adresse + Ordner

    Where=/media/cloud

    Options=credentials=........,rw,nosuid,nodev,noexec,async

    Type=cifs

    [Install]

    WantedBy=multi-user.target

    und

    [Unit]

    Description=serverctl.service: Waiting for Network or Server to be up

    After=network.target

    [Service]

    Type=oneshot

    TimeoutStartSec=95

    ExecStart=/usr/local/bin/serverctl IP Adresse

    [Install]

    WantedBy=multi-user.target

  • Außerdem hab ich es damit versucht

    [Unit]

    Description=Mount if NAS is reachable

    Wants=network.target

    After=network.target

    [Service]

    Type=oneshot

    ExecStart=/bin/bash -c 'for ((n=0;n<40;n++)); do /bin/ping -c1 -W1 -q IPAdresse &>/dev/null; [ $? -eq 0 ] && exit 0 || sleep 1; done; exit 1'

    ExecStart=/bin/echo "active/running: processing remote-mounts"

    ExecStart=/bin/mount -a

    [Install]

    WantedBy=multi-user.target

  • Ich habe es genauso im Einsatz wie es @ThomasL beschrieben hat. Die mount und service unit funktionieren genau so. Deshalb würde ich immernoch gerne die Ausgaben von

    Code
    systemctl status media-mynas.mount
    systemctl status serverctl.service

    sehen. Normalerweise sagt dir systemd wenn was nicht passt.

    Hast du auch das Skript erstellt und die Rechte angepasst?

    Gruß

    Oliver

  • Ich habe es genauso im Einsatz wie es @ThomasL beschrieben hat. Die mount und service unit funktionieren genau so. Deshalb würde ich immernoch gerne die Ausgaben von

    Code
    systemctl status media-mynas.mount
    systemctl status serverctl.service

    sehen. Normalerweise sagt dir systemd wenn was nicht passt.

    Hast du auch das Skript erstellt und die Rechte angepasst?

    Gruß

    Oliver

    Loaded: Loaded (/etc/systemd/System/media-cloud.mount; disabled; vendor present: enabled)

    Active: inactive (dead)

    Where: /media/cloud

    what: IP Adresse + Ordner

    serverctl.service - serverstl.service: Waiting for Network or Server to be up

    Loaded: loaded (/etc/systemd/System/serverctl.service; disabled; vendor present: enabled

    Active: inactive (dead)

    Das sind die Einträge. Wenn ich das mit fstab mache, dann fnktioniert es meistens. Aber ohne fstab geht gar nichts.

    Während der Statusabfrage war ich übrigens am Netzwerklaufwerk angemeldet. Über fstab.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!