[PYTHON] Bei mir cp und Subprocess

Ich war ein wenig süchtig nach dem Teilprozess, also machte ich mir eine Notiz.

Beim Erstellen eines Hilfsskripts für die Bereitstellung war eine Verarbeitung erforderlich, die cp -pr entspricht. Die in Python geschriebene (unvollständige) cp-Implementierung lautet wie folgt.

python_cp


def _copy(src, dst):
    if os.path.isfile(src):
        shutil.copy2(src, dst)
        return
    if os.path.isdir(src) and os.path.isdir(dst):
        target = os.path.join(dst, os.path.basename(src))
        # TODO Fix behavior like cp -pr (Wenn das Zielverzeichnis vorhanden ist, die Dateien darunter/Das Verzeichnis sollte beibehalten werden)
        if os.path.exists(target):
            shutil.rmtree(target)
        shutil.copytree(src, target)
        return
    if os.path.isdir(src) and os.path.isfile(dst):
        raise IOError(
            "(Src:directory/Dest:file) This combination isn't allowed")

Obwohl es Einschränkungen gibt (siehe Kommentare), konnte dieser Fall in dieser Anwendung nicht auftreten, daher ist er in Ordnung.

Ich hörte jedoch die Illusion, dass "Wow, der Ingenieur (lacht), der es nicht tut, obwohl ich cp mit Subprocess verschieben kann ..." wie üblich von der Seite, also beschloss ich, eine Implementierung zu schreiben, die Subprozess verwendet. ..

subprocess_cp_error


def _copy(src, dst):
    subprocess.Popen(['cp', '-pr', src, dst]).communicate()

Bei dieser Implementierung können in src jedoch keine Platzhalter verwendet werden. Um den Platzhalter zu interpretieren, müssen Sie shell = True an Popen übergeben und den Befehl über die Shell ausführen. http://docs.python.jp/2.7/library/subprocess.html#subprocess.Popen

subprocess_cp_error2


def _copy(src, dst):
    subprocess.Popen(['cp', '-pr', src, dst], shell=True).communicate()

Also dachte ich: "Ist das fertig?", Aber das ist nicht der Fall. Mit der obigen Implementierung funktioniert der Befehl cp überhaupt nicht. Wenn shell = True ist, wird der Befehl wie oben beschrieben über die Shell ausgeführt, entspricht jedoch dem folgenden Befehl.

via_shell_error


/bin/sh -c 'cp' '-pr' (src) (dst)

Auf den ersten Blick sieht es gut aus, aber in diesem Fall wird -pr nicht als Option für cp betrachtet, und src und dst werden nicht als Argumente für cp betrachtet. Mit anderen Worten, cp wurde ohne Argumente ausgeführt, was zu einem Fehler führte. Um korrekt zu sein, müssen Sie es wie folgt mit einer Zeichenfolge angeben

via_shell


/bin/sh -c 'cp -pr (src) (dst)'

Um den entsprechenden Unterprozess auszuführen, geben Sie den Befehl an Popen als Zeichenfolge anstelle eines Arrays an.

subprocess_cp


def _copy(src, dst):
    subprocess.Popen('cp -pr {0} {1}'.format(src, dst), shell=True).communicate()

Fazit

Sollte nicht shell = True sein, wenn nicht benötigt w Tatsächlich verursacht es auch eine Shell-Injektion, daher heißt es in der Bibliotheksreferenz auch: "Wenn Sie externe Eingaben verwenden, setzen Sie diese niemals auf True!" ...

Recommended Posts

Bei mir cp und Subprocess
Mit mir, NER und Flair
Mit und ohne WSGI
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Arbeiten Sie mit tkinter und Maus
Python und Hardware-Verwenden von RS232C mit Python-
Super Auflösung mit SRGAN und ESRGAN
Group_by mit sqlalchemy und sum
Python mit Pyenv und Venv
py, shebang, venv und ich
Funktioniert mit Python und R.
Erstellen Sie eine CP932-CSV-Datei für Excel mit Chalice und geben Sie sie zurück
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Interaktive Visualisierung mit ipywidgets und Bokeh
Leuchtendes Leben mit Python und OpenCV
Python-Maus- und Tastaturbedienung mit Pyautogui
Sortieren mit einer Mischung aus Zahlen und Buchstaben
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Scraping mit Node, Ruby und Python
Einfacher Slackbot mit Docker und Errbot
Bildsegmentierung mit Scikit-Image und Scikit-Learn
Authentifizierungsprozess mit gRPC- und Firebase-Authentifizierung
Scraping mit Python, Selen und Chromedriver
Spielen Sie mit Poancare-Serien und SymPy
HTTPS mit Django und Let's Encrypt
Fotosegmentierung und Clustering mit DBSCAN
Kratzen mit Python und schöner Suppe
NAS-Backup mit PHP und Rsync
Für mich: Infrastruktur- und Netzwerknotizen
JSON-Codierung und -Decodierung mit Python
Pfadverarbeitung mit takewhile und dropwhile
Basisauthentifizierung, Digest-Authentifizierung mit Flask
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
Vergleichen Sie DCGAN und pix2pix mit Keras
Verwenden von Sitzungen und Reflexionen mit SQL Alchemy
Lesen und Schreiben von NetCDF mit Python
Führe errBot ein und arbeite mit Slack
Speichern und Abrufen von Dateien mit Pepper
Async / warte mit Kivy und tkinter
Ich habe mit PyQt5 und Python3 gespielt
Melden Sie sich mit PycURL an und erhalten Sie eine Antwort
Experimentiert mit Unicode, Decodierung und Codierung
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
Einfache parallele Ausführung mit Python-Unterprozess
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Zeichnen Sie Figuren mit OpenCV und PIL
Sugoroku-Spiel und Zusatzspiel mit Python
Laden Sie Bilder mit Falcon hoch und laden Sie sie herunter
FM-Modulation und Demodulation mit Python
Erstellen einer Umgebung mit pyenv und pyenv-virtualenv