Wer hat das Scipt gestartet

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo zusammen,

    ich habe mir einen Babymonitor gebastelt. Ein Python Script läuft per Autostart dauerhaft mit und lauscht auf "Lärm", schaltet unter bestimmten Voraussetzungen LEDs ein, startet die Kamera und versendet eine Pushnachricht an mehrere Geräte.

    Nun möchte ich aber auch wenn ich von unterschiedlichen Geräten, per SSH angemeldet bin, das Script "manuell" starten. Derzeit übergebe ich dazu ein Argument in der Art

    Code
    script.py handy1

    Somit wird die Kamera gestartet, aber die Benachrichtung bekommt nur derjenige der ausgelöst hat. Allerdings muss ich so natürlich für jedes Gerät ein anderes Argument eintippen, bzw mit aliasen arbeiten.

    Jetzt ist mir aufgefallen, dass man nach dem SSH Login angezeit bekommt, wer zuletzt eingeloggt war, also nicht den Nutzer, der ist ja immer pi, sonder von welchen Guest.

    Daher dachte ich, es wäre super genial, wenn ich beim Starten des Scripts automatisch ermitteln könnte, ob der lokale Nutzer pi das Script gestartet hat (autostart) oder ein von einem Guest angemeldeter Nutzer pi. Weiß jemand ob und wie sowas geht?:danke_ATDE:

    • Offizieller Beitrag

    Der wird ja immer pi sein. Er möchte unterscheiden ob das Script durch den autostart gestartet wurde oder manuell. Du könntest bei deinem Autostart ne zusätzliche Datei mit anlegen auf dessen Existenz du dann prüfst. Musst dann aber sichsterstellen das die beim runterfahren auch gelöscht wird.

    So richtig erschliesst sich mir aber dein Konzept noch nicht. Wenn es im autostart liegt, warum willst du es dann manuell noch mal starten?

  • Der angemeldete Benutzer ist aber immer pi! mit w bzw. who sieht man dann auch von wo aus alles Benutzer angemeldet sind.

    Code
    pi@raspbee:~ $ who
    pi       :0           2018-04-21 07:52 (:0)
    pi       tty1         2018-04-21 07:52
    pi       pts/0        2018-04-30 08:11 (name-des-gastes.fritz.box)

    Hier sieht man das auch eine Anmeldung des Nutzers pi von einem Gast aus erfolgt. Kann man nun, wenn ich per ssh einen Befehl ausführe, raus finden welche "Instanz" des Nutzers pi den Befehl abgesetzt hat?

  • So richtig erschliesst sich mir aber dein Konzept noch nicht. Wenn es im autostart liegt, warum willst du es dann manuell noch mal starten?

    Weil im Autostart Modus "lauscht" das Script und der Live-Stream startet nur wenn ausgelöst wurde. Unter Umständen möchte ich aber auch mal so drauf schauen. Da wäre es natürlich nicht sinnvoll in das Kinderzimmer zu gehen und neben dem Babyphone zu klatschen.

    Der Bequemlichkeit halber, wird beim Starten des Streams auch eine Pushover Nachricht mit Link zum Stream gesendet - nötig weil die IP sich änder kann, wenn das Babyphone bspw. mit dem Android Hotspot am Handy verbunden ist.

    Damit beim manuellen Start des Scripts, jetzt nicht jeder auch die Push Nachricht bekommt, sonder nur der Starter, würde ich das gerne so lösen.

    Derzeit übergebe ich halt unterschiedliche Argumente an das Script.

    Code
    mein_script.py pappa #startet den Stream, sendet Nachricht nur an mich
    
    mein_script.py mamma #sollte klar sein

    Das ganze wird per alias abgekürzt. Ich finde das aber unschön und dachte es gibt bestimmt eine "korrektere" Lösung.

    • Offizieller Beitrag

    Du könntest dir mittels subprocess und who|grep pts/0 die Zeile in Python holen und dann den String splitten und auswerten

    Code
    a = "pi       pts/0        2018-04-30 08:11 (name-des-gastes.fritz.box)"
    a.split()
    ['pi', 'pts/0', '2018-04-30', '08:11', '(name-des-gastes.fritz.box)']
    a.split()[4]
    '(name-des-gastes.fritz.box)'

    Natürlich kannst du den Befehl auch schon in Linux aufbereiten und sparst dir dann das gesplitte in Python. Für mich ist der python weg aber einfacher

  • Wenn das Script sauber seine IP in dem Verzeichnis /var/log/run ablegt, könntest du den dort stehenden Wert überprüfung, und verhindern, dass jemand anderes das Script nochmals startet.

    Denn einmal sollte es doch genug sein.

    Wenn es, warum auch immer, nicht läuft, und es jemand startet, könnte man das anhand der Startzeit ermitteln.

    Wenn es per Autostart gestartet wurde, sollte es eine Startzeit haben, die zur Uptime (aktuelle Uhrzeit - Uptime ~~ Startzeit) passt.

    Computer ..... grrrrrr

  • Du könntest dir mittels subprocess und who|grep pts/0 die Zeile in Python holen und dann den String splitten und auswerten

    ...

    Natürlich kannst du den Befehl auch schon in Linux aufbereiten und sparst dir dann das gesplitte in Python. Für mich ist der python weg aber einfacher

    Aber dann sehe ich auch nur, wer gerade angemeldet ist, nicht wer das Script gestartet hat.

    Wobei es wohl eher selten vorkommt, das meine Frau und ich gleichzeitig per SSH den Stream starten. Ich denk ich werde es mal versuchen, auf pts ohne Zusatz zu greppen und dann überprüfen ob die Kennung für das eine Handy oder das andere oder beide vorhanden ist und dementsprechend die Nachrichten verteilen.

  • Ist ein Service ähnlich wie Pushbullet. Damit sende ich Nachrichten vom Raspi an die Handys...

    Telegram Bot habe ich wieder verworfen, weil ich es nicht hin bekommen habe einen klickbaren Link zu versenden...

    Egal, das who | grep pts hat mir schon sehr geholfen, das Piping vergesse ich immer... :D

  • Ja Telegram ist definitiv für dich das passende was du suchst. Ist wie Whatsapp, nur besser und mit Bots welche man sich selbst programmieren kann.

    Zu deinem aktuellen Vorhaben, falls du es so umsetzten solltest, hierbei müsstest du dann ja wieder Unterscheidungen einbauen für das Skript:

    Wird jetzt gewollt dass ich in Schleife laufe, die unterscheidung jetzt geht ja bequem damit ob ein Parameter übergeben worden ist oder nicht.

    Desweiteren, wenn du dies nach IP unterscheidest, benötigst du zum einen immer Statische IP Adressen in deinem Netzwerk und musst darüber ja auch wieder Fallunterscheidungen machen welche IP zu welchen User gehört...da ist das mit den Parametern schon fast besser (so finde ich)

    Wobei die idealste Lösung Telegram ist (wieder mein subjektive Meinung)

  • Kann man nun, wenn ich per ssh einen Befehl ausführe, raus finden welche "Instanz" des Nutzers pi den Befehl abgesetzt hat?

    Evtl. mit pstree. Z. B.:

    Code
    root@raspberrypi:~# pstree -spu $(pidof top)
    systemd(1)───sshd(896)───sshd(18404)───sshd(18419,pi)───bash(18420)───top(18442)

    oder z. B.:

    Code
    pi@raspberrypi:~ $ pstree -spu $(pidof top)
    systemd(1)---inetd(611)---in.telnetd(18532,telnetd-ssl)---login(18533,root)---bash(18540,pi)---top(18680)

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Wie gesagt mit dem Bot habe ich schon gearbeitet, aber ich brauche einen klickbaren Link im Text, um diesen dann mit VLC zu öffnen.

    die IP-Adressen brauche ich hierbei nicht. In "who" wird ja der Name angezeigt. Ich kann das Script per Autostart ja ohne Parameter starten, dann springt es in die Dauerschleife. Starte ich dann mit einem Parameter, meinetwegen "now", schaue ich wer gerade angemeldet ist.

    Ich kenne auch Telegram, Threema und Signal, leider nutzt das jeweils immer nur einer oder bei Threema 6 meiner Kontakte (würde auch lieber gänzlich auf WhatsApp verzichten)...

  • Bist Du denn per ssh eingeloggt, wenn Du das Pythonskript aufrufst? Sonst ist die Variable natürlich nicht gesetzt:

    Code
    client = os.getenv('SSH_CLIENT')
    if client:
      print("Verbindung von {}.".format(client.split()[0]))
    else:
      print("Lokal gestartet.")

    Einmal editiert, zuletzt von Manul (30. April 2018 um 14:30) aus folgendem Grund: fehlende Klammer ergänzt

  • Interessant. Ich kann das nicht nachvollziehen:

    Kannst Du ein ähnliches Minimalbeispiel mal bei Dir ausprobieren?

Jetzt mitmachen!

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