subprocess.run

Code-Stücke können hier veröffentlicht werden.
Antworten
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

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:
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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´?
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

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.
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Doch das Blockieren ist ein Problem, denn dann denkt die Fensterverwaltung, dass sich das Programm aufgehängt hat und möchte es abbrechen.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Artikel ist irrelevant. Keiner deiner Aufrufe nutzt den Shell Modus. Und sie unterscheiden sich auch nicht Sicherheitsrelevant.
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

__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.
Antworten