Im Hintergrund kopieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Mou10
User
Beiträge: 9
Registriert: Dienstag 8. Juni 2021, 23:25

Hallo Leute,
ich bin ein absoluter Anfänger und brauche dringend Hilfe.
Bei meinem Programm soll im Terminal nach einem Befehl etwas kopiert werden. Mit pyperclip.copy kann ich ja Sachen ganz leicht kopieren. Allerdings soll es nur für 30 Sekunden kopiert werden. Das heißt nach 45 Sekunden würde ich dann sagen: pyperclip.copy(' '), also einfach ein Leerzeichen kopieren.
Ich möchte aber in diesen 45 Sekunden im Terminal weiterarbeiten können und weitere Befehle eingeben können.Nach 45 Sekunden soll es dann einfach automatisch ein Leerzeichen kopieren. Ich muss auch keine Benachrichtigung oder so bekommen. Ich soll also gar nicht mitbekommen, dass es ein Leerzeichen kopiert hat. Mit time.sleep zum Beispiel kann ich ja dann nichts mehr im Terminal machen und muss dann diese 45 Sekunden abwarten.
Es wäre echt nett, wenn ihr mir weiterhelfen könntet.

Wie gesagt ich bin ein Anfänger...........
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Von welchem Terminal redest Du denn? Wenn ein Python-Programm im Hintergrund läuft, dann kannst Du ja in Deinem Terminal einfach weiter arbeiten.
Bitte beschreibe den Ablauf genauer. Welche Programme laufen wann? Was triggert das Kopieren? Was soll dann gemacht werden?
Mou10
User
Beiträge: 9
Registriert: Dienstag 8. Juni 2021, 23:25

Also auf dem Mac gibt es ja ein Terminal. Ich programmier dann in Pycharm und ausgeführt wird das Programm dann im Terminal.
Bei meinem Programm geht es darum: Der Benutzer gibt ein Username und ein Passwort ein. Die Eingabe wird dann in einer Textdatei gespeichert. Nach der Eingabe soll das Passwort aber automatisch kopiert(bzw. in der Zwischenablage kopiert werden) werden, aber nur für 45 Sekunden. Ich habe folgende Idee bis jetzt:
pyperclip.copy(Passwort)
time.sleep(45)
pyperclip.copy(' ')
Das Problem dabei ist aber, dass ich in den 45 Sekunden nicht anderes im Terminal machen kann und warten muss. Ich würde zum Beispiel gerne in den 45 Sekunden einen weiteren Eintrag mit username und Passwort schon speichern.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hi Mou10,

da sind immer noch einige Fragen offen:
Warum muss die Zwischenablage nach genau 45 Sekunden gelöscht werden?
Es würde doch reichen den Zwischenspeicher freizugeben, sofort nachdem Username und Passwort in die Textdatei geschrieben wurden, oder?
Warum muss die Zwischenablage überhaupt gelöscht werden? Wenn du weitere Eingaben tätigst, wird der letzte Eintrag ja auch überschrieben.
Vielleicht ist pyperclip auch nicht das beste Package für die Aufgabe? Was ist eigentlich der Zweck der Funktion? Vielleicht gibt es einen besseren Weg?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: Das Passwort soll halt nur 45 Sekunden in der Zwischenablage sein. Damit man das nicht endlos lange irgendwo einfügen kann. Beispielsweise ein anderer Benutzer nach einer Stunde, oder auch nicht aus versehen der ursprüngliche Benutzer in einem Chatfenster oder so.

Das ist ein nicht unübliches Verhalten bei Passwortmanagern. KeePass leert die Zwischenablage AFAIK zum Beispiel schon nach 10 Sekunden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Mou10
User
Beiträge: 9
Registriert: Dienstag 8. Juni 2021, 23:25

Genau, tut mir Leid, das hätte ich vielleicht früher sagen sollen. Es geht um ein einfaches Passwort Manager Programm. Das Passwort soll halt nicht endlos eingefügt werden können.
Ich suche gerade die ganze Zeit. Meint ihr man könnte das irgendwie mit Threading machen?
Mou10
User
Beiträge: 9
Registriert: Dienstag 8. Juni 2021, 23:25

@__blackjack__: ich habe das nicht ganz verstanden. Womit kann ich nach 10 Sekunden die Zwischenablage entleert? Mit AFAIK?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@Mou10: "AFAIK" ist eine gängige Abkürzung im Internet für "As far as I know" - "soweit ich weiß"
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

__blackjack__ hat geschrieben: Mittwoch 9. Juni 2021, 11:37 @rogerb: Das Passwort soll halt nur 45 Sekunden in der Zwischenablage sein.
Ja, aber warum überhaupt 45 Sekunden, wenn es darum geht, Username und Passwort einfach nur in eine Datei zu speichern? Wie sinnvoll ist es die Daten überhaupt im Zwischenspeicher zu haben?

__blackjack__ meinte wohl die open source software KeePass. Ich gehe mal davon aus, dass du dass du das eher als Hobby-Projekt machst. Denn solche Password Manager gibt es ja schon haufenweise.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: Es geht halt nicht nur darum das in eine Datei zu speichern, sondern offenbar auch darum, dass man es eine gewisse Zeit lang noch irgendwo anders einfügen kann.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Mou10
User
Beiträge: 9
Registriert: Dienstag 8. Juni 2021, 23:25

Oh man ist das peinlich hahah.
Also ja ich bin gerade dabei die Programmiersprache zu lernen. Ich mache das halt als Hobby, aber komme gerade halt nicht weiter.
Und genau es geht nicht ums Speichern, sondern darum, dass man das Passwort kopiert und danach für 45 Sekunden irgendwo einfügen kann.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mou10: Man könnte einen Thread starten, der nach 45 Sekunden die Zwischenablage leert. Beziehungsweise könnte man auch das Einfügen eines Passworts über einen dauerhaft laufenden Thread lösen, der die Passwörter mittels einer `queue.Queue` bekommt. Wenn er eines bekommen und gesetzt hat, kann er blockierend 45 Sekunden warten. Sollte vorher ein neues Passwort kommen, kann er das setzen und wieder blockierend warten. Und falls die Zeitüberschreitung kommt, kann er die Zwischenablage leeren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Über einen Thread währe das wohl möglich. Ich persönlich würde asyncio und aioconsole verwenden.
Asyncio ist ja Standard und aioconsole ist hier:
https://pypi.org/project/aioconsole/

Aber ein paar Fragen sind immer noch offen: Wenn man z.B. Username und Passwort eingegeben hat, was soll dann im Zwischenspeicher stehen?
Ich denke man kann immer nur eine Zeichenkette im Zwischenspeicher haben.

@Mou10 du hattest geschrieben, dass nur das Passwort zwischengespeichert werden soll? Ist das richtig?

Hier währe mal ein ganz rudimentäres Beispiel bei dem man nur das Passwort im Zwischenspeicher behält und in eine Datei werden die Passwörter auch noch nicht gespeichert:
(Zu Testzwecken wird der Zwischenspeicher auch schon nach 10 sec gelöscht, kann man aber beliebig ändern)

Und wie gesagt, das basiert auf dem was ich bisher von dir verstanden habe...

Als ich den Code hier gerade reinkopieren wollte, hat es mir prompt den Zwischenspeicher gelöscht :roll:

Code: Alles auswählen

import asyncio
import aioconsole
import pyclip


class PasswordClipboard():
    def __init__(self):
        self.passwords = []
        loop = asyncio.get_event_loop()
        try:
            loop.run_until_complete(self.main())
        except KeyboardInterrupt:
            print('\nBye!')

    async def main(self):
        """ gather async functions """
        await asyncio.gather(self.clear_clipboard(), self.get_user_input())

    async def clear_clipboard(self):
        """ clear the clipboard after 45 seconds """
        while True:
            await asyncio.sleep(10)
            pyclip.copy("")

    async def get_user_input(self):
        """ store user input to internal list and clip board """
        while True:
            password = await aioconsole.ainput("Password: ")
            self.passwords.append(password)
            pyclip.copy(password)


password_clipboard = PasswordClipboard()
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@Mou10: Ich würde vor dem Löschen noch schnell schauen, ob das Passwort noch in der Zwischenablage liegt. Damit verhinderst du, dass du den Inhalt der Zwischenablage ungewollt weg grätscht, der da eigentlich gewollt ist.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Mou10 hat geschrieben: Dienstag 8. Juni 2021, 23:33 Ich möchte aber in diesen 45 Sekunden im Terminal weiterarbeiten können und weitere Befehle eingeben können.
Viele Unix Shells – darunter tcsh, bash und zsh; eine davon sollte je nach MacOS Version bei dir der Default sein – haben eingebaute Möglichkeiten zur Steuerung von Prozessen (job control) mit denen man Prozesse pausieren, in den Hintergrund schieben, in den Vordergrund holen kann etc. Siehe zum Einstieg etwa: https://www.thegeekstuff.com/2010/05/un ... round-job/. Vielleicht kannst du den Prozess also einfach durch anhängen von '&' im Hintergrund starten – möglicherweise habe ich aber auch die Anforderung nicht korrekt verstanden.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@nezzcarth: es geht doch um einen geteilte Datenbank die modifiziert und dabei ein Passwort in das clipboard geschoben wird. Ein Prozess im Hintergrund verkompliziert das bestenfalls. Wirklich bringen tut er nix.
Mou10
User
Beiträge: 9
Registriert: Dienstag 8. Juni 2021, 23:25

@rogerb:Danke erstmal für den Code...
Aber ich kann irgendwie trotzdem währenddessen nicht im Terminal weiterarbeiten.....
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Mou10 hat geschrieben: Mittwoch 9. Juni 2021, 22:32 @rogerb:Danke erstmal für den Code...
Aber ich kann irgendwie trotzdem währenddessen nicht im Terminal weiterarbeiten.....
Richtig, es ist nichts weiter als ein kleines Script welches, Tastatureingaben im Hintergrund in den Zwischenspeicher kopiert um sie dann an anderer Stelle einzufügen.
Es ist leider noch immer unklar was du erreichen möchtest. Du willst in der Konsole "arbeiten" ? und dann wenn du irgendwann ein Passwort eintippst soll das in den Zwischenspeicher kopiert werden, von wo es dann innerhalb von 45 Sekunden noch verfügbar ist.
Wie soll das Programm zwischen normalem Arbeiten in der Konsole und Passworteintippen unterscheiden? Wo werden die Passwörter denn eingetippt? In ein Browserformular?

Vielleicht brauchst du einen intelligenten Keylogger?
Sicher ein interessantes Hobbyprojekt, und ich würd mich da auch gerne mal tiefer reindenken, aber leider sind für mich jedenfalls immer noch zu viele Fragen offen.
Mou10
User
Beiträge: 9
Registriert: Dienstag 8. Juni 2021, 23:25

Ich versuche es mal dann genauer zu erklären.
Ich habe mit Argpaprse Befehle erstellt, die ich im Terminal dann benutzen kann. Die Befehle sind zum Beispiel add, display, delete.
Die Argumente sind dann Username und Passwort. Im Terminal schreibe ich dann zum Beispiel:
python3 Passwortmanager.py add --username usernamebeispiel1 --passwort Passwortbeispiel1. Demnach sollen dann das Username und das Passwort zunächst in einer Textdatei gespeichert werden. Das habe ich schon hinbekommen. Aber dazu soll eben nur das Passwort in der Zwischenablage für 45 Sekunden gespeichert werden.
Der Benutzer soll aber nicht die 45 Sekunden im Terminal abwarten. Es könnte ja auch sein, dass er in den 45 Sekunden einen anderen Befehl wie display benutzen möchte. Das kopieren des Passworts soll im Hintergrund passieren. Der Benutzer soll nichts davon mitbekommen. Auch wenn die Zwischenablage wieder geleert wird, soll er nichts mitbekommen. Es soll einfach im Hintergrund passieren.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Hättest Du das gleich gesagt, dann hätte man Dir auch gleich die passende Lösung bieten können:

Code: Alles auswählen

import os
import time
import pyperclip


def main():
    password = "geheim"

    pyperclip.copy(password)
    if os.fork() == 0:
        time.sleep(45)
        if pyperclip.paste() == password:
            pyperclip.copy(' ')

if __name__ == "__main__":
    main()
Antworten