Seite 1 von 1

subprocess.run

Verfasst: Donnerstag 27. Januar 2022, 19:40
von FrankM
Ich benutze für mein GUI folgenden Aufruf.

Code: Alles auswählen

result = subprocess.run(['restic',
                 '-r',
                 backup_data[row].repository,
                 'backup',
                 backup_data[row].source],
                 input=backup_data[row].password,
                 check=False,
                 capture_output=True,
                 text=True)
                  
result.check_returncode()
Jetzt bin ich über das Thema https://security.openstack.org/guidelin ... -true.html drauf gestoßen, das man es besser so lösen soll.

Code: Alles auswählen

args = ['restic',
           'r',
           backup_data[row].repository,
           'backup',
           backup_data[row].source]

result = subprocess.run(args,
                 input=backup_data[row].password,
                 check=False,
                 capture_output=True,
                 text=True)

result.check_returncode()
Ich bin Einsteiger und möchte es möglichst von Anfang richtig machen, deswegen frage ich mal hier ob das so korrekt umgesetzt ist. Der Code funktioniert einwandfrei.
Für die Formatierung muss ich mich entschuldigen, in meinem VSCodium sieht es einwandfrei aus :wink:

Re: subprocess.run

Verfasst: Donnerstag 27. Januar 2022, 20:14
von Sirius3
Beide Varianten sind äquivalent, nur dass im zweiten Fall `args` als Variable herausgezogen worden ist.
Warum benutzt Du `check=False` und rufst danach gleich `check_returncode` auf?

Code: Alles auswählen

backup = backup_data[row]
args = ['restic',
           '-r',
           backup.repository,
           'backup',
           backup.source]
subprocess.run(args, backup.password, check=True)
Wenn Du von GUI sprichst, ist das aber wahrscheinlich falsch, weil `run` blockiert. Woher kommt denn `backup_data` und `row´?

Re: subprocess.run

Verfasst: Donnerstag 27. Januar 2022, 21:01
von FrankM
Das Blockieren ist nicht das Problem, die Prozesse dauern länger, ich habe da ein waitingspinnerwheel für. Wie gesagt, der Code funktioniert so weit einwandfrei. Mir ging es eher um den Sicherheitsaspekt, siehe den von mir oben angegebenen Link.

Das mit 'check=False' weiß ich aktuell nicht. Muss ich testen und nachlesen. Danke für Deine Hinweise.

Re: subprocess.run

Verfasst: Donnerstag 27. Januar 2022, 21:11
von FrankM
Mit 'check=True' passiert das, was laut Dokumentation auch so weit richtig ist.

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/frank/restic_ui/src/restic_ui.py", line 317, in run
    result = subprocess.run(args,
  File "/usr/lib/python3.8/subprocess.py", line 516, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['restic', '-r', '/home/frank/b5', 'backup', '/home/frank/Bilder']' returned non-zero exit status 1.
Mit 'check=False' (auch die Standardeinstellung, wenn ich die Doku richtig verstehe), passiert das nicht und der Fehler wird sauber im returncode abgelegt, den ich dann auch weiterverarbeite und ausgebe.

Re: subprocess.run

Verfasst: Donnerstag 27. Januar 2022, 21:25
von Sirius3
Doch das Blockieren ist ein Problem, denn dann denkt die Fensterverwaltung, dass sich das Programm aufgehängt hat und möchte es abbrechen.

Re: subprocess.run

Verfasst: Donnerstag 27. Januar 2022, 22:24
von __deets__
Der Artikel ist irrelevant. Keiner deiner Aufrufe nutzt den Shell Modus. Und sie unterscheiden sich auch nicht Sicherheitsrelevant.

Re: subprocess.run

Verfasst: Freitag 28. Januar 2022, 15:21
von FrankM
__deets__ hat geschrieben: Donnerstag 27. Januar 2022, 22:24 Der Artikel ist irrelevant. Keiner deiner Aufrufe nutzt den Shell Modus. Und sie unterscheiden sich auch nicht Sicherheitsrelevant.
Danke, das beantwortet meine Frage.