Benutzerdefinierte (bearbeitbare) Nachricht für jeden Benutzer nach der Anmeldung

11

Der Computer wird von drei Benutzern (+1 Administrator) verwendet und sie verwenden die Unity-Anmeldung. Die drei Benutzer kommen, benutzen den Computer und melden sich ab. Ich muss bei jeder Anmeldung einige Anweisungen, Neuigkeiten und Details geben.

Ich möchte ein Dienstprogramm / Tool haben, mit dem ich jedem Benutzer eine benutzerdefinierte Nachricht eingeben kann. Die neueste Nachricht wird dann auf dem Desktop (für jeden Benutzer) (mit dem Datum meiner letzten Bearbeitung) für beispielsweise 10-15 Sekunden angezeigt. Eine Kopie des Textes kann auch (für den Benutzer) irgendwo mit allen Nachrichten und Daten wie einem Protokoll verfügbar sein.

Geben Sie hier die Bildbeschreibung ein

* Der Administrator hat SSH-Zugriff auf das System.

Ich bin mir nicht sicher, ob dies möglich ist (und vielleicht suche ich zu viel!).

ankit7540
quelle
Kann gemacht werden. Was ist Ihre Zielversion von Ubuntu? Sind Popups in Ordnung? Oder möchten Sie Bildschirmtext bevorzugen, wie Ihr Beispiel zeigt?
Sergiy Kolodyazhnyy
Laufen 14.04 LTS und keine Pläne für ein baldiges Upgrade. Popups / Benachrichtigungen sind in Ordnung, wenn sie einige Sekunden (~ 10-15 Sek.)
Bleiben
Ich habe ein schnelles Skript implementiert und eine Antwort gepostet. Es ermöglicht das Erstellen einer Datei und diese Datei wird jedem Benutzer zugeordnet. Lassen Sie mich wissen, welche anderen Funktionen ich dort hinzufügen soll, und falls Sie weitere Erläuterungen benötigen. Das Skript ist nicht schick, aber ziemlich stabil.
Sergiy Kolodyazhnyy
Hi @ ankit7540 hat meine Antwort in der ersten "Edition" gepostet und vergessen zu erwähnen, dass das Skript ausführbar ist, aber das könnte offensichtlich sein :)
Jacob Vlijm
Vielen Dank für Ihre Bemühungen @Serg: Ich mag den Ansatz, lassen Sie mich testen und antworten.
ankit7540

Antworten:

11

Sie können dies in der folgenden Konfiguration tun, die ein halbtransparentes Fenster erzeugt, das für eine beliebige Zeit bleibt:

  1. Erstellen Sie in einem (beliebigen) Verzeichnis, in dem jeder der Benutzer zumindest hat lesen Berechtigungen für jeden Benutzer eine Nachrichtendatei, genau benannt nach jedem Benutzer Benutzernamen (Login - Namen), ohne Erweiterung, zB

    jacob
    

    Fügen Sie der Datei Text als Nachricht hinzu. Wenn Sie zunächst eine neue Nachricht hinzufügen ###, zeigt das Skript automatisch die letzte Nachricht an. Der Text kann alles enthalten, was Sie möchten. Er sieht genauso aus, wie Sie ihn in die Datei eingefügt haben.

    • Die neueste Nachricht wird als latest_message.txtReferenz in das Home-Verzeichnis des Benutzers kopiert .

    • So wie es ist, bleibt das Fenster 15 Sekunden lang, aber Sie können es auf einen beliebigen Wert einstellen, selbst wenn es automatisch von der Länge des Textes abhängt.


    Eine Beispieldatei könnte folgendermaßen aussehen:

    Vraag:
    Een aap op een fiets, hoe vind je zoiets?
    
    Opdracht:
    Geef antwoord op de vraag!
    
    ###
    Vraag:
    Hoe is de koffie vandaag?
    
    Opdracht:
    Zet het zelf even als het niet te drinken is!
    

    Die Nachricht würde dann so aussehen:

    Geben Sie hier die Bildbeschreibung ein

  2. Kopieren Sie das folgende Skript in eine leere Datei und bearbeiten Sie im Kopfbereich Ihres Skripts den Pfad zu dem Ordner, in dem Sie die Nachrichten des Benutzers speichern. Speichern Sie das Skript wie show_personalmessagein (zB) /usr/local/bin(das in sein sollte $PATH und machen Sie es ausführbar (!) (Keine Erweiterung)

    #!/usr/bin/env python3
    import subprocess
    import os
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import GObject, Gtk, Gdk, Pango
    from threading import Thread
    import time
    import getpass
    
    # --- set the path to the message files below, filename = username
    filedir = "/home/jacob/Bureaublad"
    # --- set the time to show the window below
    showtime = 15
    # ---
    
    # don't change anything below
    user = getpass.getuser()
    currmessage = os.environ["HOME"]+"/latest_message.txt"
    f = filedir+"/"+user
    text = "Welcome "+user+"\n\n"+open(f).read().split("###")[-1]
    open(currmessage, "wt").write(text)
    
    class Splash(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self, title="splashtitle")
            maingrid = Gtk.Grid()
            self.add(maingrid)
            maingrid.set_border_width(80)
            # set text for the spash window
            label = Gtk.Label(text)
            label.modify_font(Pango.FontDescription('Ubuntu 12'))
            maingrid.attach(label, 0, 0, 1, 1)
            self.stop = Thread(target=self.close_window)
            self.stop.start()
    
        def close_window(self):
            time.sleep(showtime)
            Gtk.main_quit()
    
    def splashwindow():
        window = Splash()
        window.set_decorated(False)
        window.set_resizable(False)
        window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
        window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("grey"))
        window.set_opacity(0.8)
        window.set_position(Gtk.WindowPosition.CENTER)
        window.show_all()
        GObject.threads_init()
        Gtk.main()
    
    splashwindow()
  3. Erstellen Sie einen Launcher in /etc/xdg/autostart

    [Desktop Entry]
    Type=Application
    Name=Splash 
    Exec=/bin/bash -c "sleep 10 && show_personalmessage"
    

    Der Schlaf 10 soll sicherstellen, dass der Desktop "bereit" ist, das Fenster zu öffnen.

Erläuterung

  • Starter in /etc/xdg/autostartAusführungsbefehlen für jeden Benutzer bei der Anmeldung.
  • Der Launcher führt dann das Fenster (vom Befehl aufgerufen show_personalmessage) aus, das in dem von Ihnen definierten Verzeichnis nach der personalisierten Nachricht sucht. Zusätzlich. Die letzte Nachricht wird in das Home-Verzeichnis des Benutzers kopiert.
  • Bei Bedarf kann der Pfad zur Nachricht geändert oder mithilfe des getpassModuls sogar benutzerspezifisch festgelegt werden , sodass das Skript (Fenster) in einem Verzeichnis nach einer benutzerspezifischen benannten Datei sucht. Bitte erwähnen Sie, ob dies erforderlich wäre.

zusätzlich

Das (Gtk) Fenster

  • kann dazu gebracht werden, unter allem zu bleiben, als ob es Teil des Hintergrunds wäre
  • kann Aufenthalt gemacht werden , auf der alles
  • kann verschließbar gemacht werden

etc, etc ...


BEARBEITEN

Um Zeit zu sparen, schreiben Sie Nachrichten, wie im Chat beschrieben , unter einer Version des Skripts, in der Sie einige "permanente" Abschnitte einfügen können:

  • premsg, die sich direkt unter "Willkommen Benutzer x" und dem Text Ihrer Nachricht befinden sollte, und
  • postmsg, das als unterer Abschnitt Ihrer Nachricht kommt.

Beide Abschnitte können einfach durch Festlegen ""eines Werts auf "Keine" gesetzt werden.

Geben Sie hier die Bildbeschreibung ein

Das Skript

#!/usr/bin/env python3
import subprocess
import os
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import GObject, Gtk, Gdk, Pango
from threading import Thread
import time
import getpass

# --- set the path to the message files below, filename = username
filedir = "/path/to/message_directory"
# --- set the time to show the window below
showtime = 15
# --- set pre-message below. set premessage = "" for no pre-message
premsg = """We assume you read all 3782 instruction pages on how to use
Ubuntu before you push any button on this computer.
""" 
# --- set post-message below. set postmessage = "" for no post-message
postmsg = """Before you go to sleep tonight, make sure to brush your
teeth for at least half an hour
"""

# --- don't change anything below
user = getpass.getuser()
currmessage = os.environ["HOME"]+"/latest_message.txt"
f = filedir+"/"+user

text = "Welcome "+user+"\n\n"+premsg+"\n"+open(f).read().split("###")[-1]+"\n"+postmsg

open(currmessage, "wt").write(text)

class Splash(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="splashtitle")
        maingrid = Gtk.Grid()
        self.add(maingrid)
        maingrid.set_border_width(80)
        # set text for the spash window
        label = Gtk.Label(text)
        label.modify_font(Pango.FontDescription('Ubuntu 12'))
        maingrid.attach(label, 0, 0, 1, 1)
        self.stop = Thread(target=self.close_window)
        self.stop.start()

    def close_window(self):
        time.sleep(showtime)
        Gtk.main_quit()

def splashwindow():
    window = Splash()
    window.set_decorated(False)
    window.set_resizable(False)
    window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
    window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("white"))
    window.set_opacity(0.8)
    window.set_position(Gtk.WindowPosition.CENTER)
    window.show_all()
    GObject.threads_init()
    Gtk.main()

splashwindow()

Hinweis

Natürlich, genau wie der Nachrichtenkörper kann gegenüber dem Vorjahr des Skript ändern , um die Pre- und Post - Nachrichten aus einer Datei zu lesen, die es noch bequemer zu halten macht. Hat es aus Gründen der Einfachheit in der Antwort so gefallen?

Jacob Vlijm
quelle
Versucht. Es funktioniert sehr gut. Wenn ich mir den Code ansehe, verstehe ich, wie man die Zeit ändert, in der er bleibt. Eine Frage: Was ist, wenn ich keinen SSH-Zugriff auf das Haus des Benutzers habe (sondern nur auf mein Haus)?
ankit7540
Sie (oder ich) können einen beliebigen Pfad festlegen, aber wir müssen ihn getpassdann verwenden, damit jeder Benutzer die genannte Datei atomatisch anfordert. Welchen Weg würden Sie sich vorstellen? Es muss ein Pfad sein, auf den jeder Benutzer Lesezugriff hat. Warten Sie, wird in einer Minute bearbeiten ...
Jacob Vlijm
@ ankit7540 hat es im Skript (und in der Erklärung) bearbeitet.
Jacob Vlijm
@ ankit7540 Ah, ich sehe dich in der ersten Zeile: "Willkommen Benutzer ..." Ist das wichtig für dich? ist nur eine Zeile im Code, wenn es ist.
Jacob Vlijm
Über diese Zeile "Welcome $ user" können Sie mir hier einfach Bescheid geben und ich kann sie dem Skript hinzufügen. Beachten Sie außerdem, dass der Benutzer einen Ordner hat /home/message. Es wäre gut, den letzten Nachrichtentext (Verketten usw.) in eine feste Datei (als Referenz) zu
kopieren
6

Mit dem folgenden Skript kann der Administrator personalisierte Nachrichten in Form eines vom username_mm_dd_yyyy.txtAdministrator definierten Verzeichnisses speichern . Benutzernamen werden automatisch ermittelt und mit dem Dateinamen und dem Datum der anzuzeigenden Datei abgeglichen.

Das Skript kann auch einen .desktopEintrag haben , der in das /etc/xdg/autostartVerzeichnis gestellt werden soll. Dadurch wird das Skript für jeden Benutzer angezeigt. Alternativ können Sie die .desktopDatei in das ~/.config/autostartVerzeichnis jedes einzelnen Benutzers einfügen.

#!/bin/bash
_get_username()
{
  qdbus  com.canonical.Unity  \
        /com/canonical/Unity/Session \
        com.canonical.Unity.Session.UserName
}

_get_date()
{
  date +%m_%d_%Y
}

_show_error()
{
  MESSAGE="Can't read the file or file doesn't exist. Contact the admin for assistance"

  zenity --error --title="Ooops, something went wrong!" --text="$MESSAGE"
}

main()
{
  # replace this with the actual directory 
  # that you want to use for storing messages
  MESSAGES_DIRECTORY="/tmp"

  # file name is made up of username_mm_dd_yyyy
  FILE="$MESSAGES_DIRECTORY"/"$( _get_username )"_"$( _get_date )".txt
  echo "$FILE"
  if [ -r "$FILE"   ] ; then
     zenity --text-info  --title="Welcome, $( _get_username )" --filename="$FILE"
  else
     _show_error
  fi
}

main

Unten sehen Sie eine kleine Demo des Skripts in Aktion. Ich habe die Datei im angegebenen Format in meinem /tmpOrdner erstellt

Geben Sie hier die Bildbeschreibung ein

Sergiy Kolodyazhnyy
quelle
Tut mir Leid, dich warten zu lassen. Es funktioniert super schön. Ich mag die Schaltflächen 'Abbrechen' und 'OK'. Ich habe es mit .desktop entry verwendet und es funktioniert perfekt!
ankit7540
@ ankit7540 Schön, dass es dir gefällt. Gibt es zusätzliche Funktionen, die ich hinzufügen soll?
Sergiy Kolodyazhnyy
Angenommen, der Benutzer hat einen Ordner /home/message. Es wäre gut, die aktuelle Nachrichtendatei zu kopieren und dort als Referenz aufzubewahren.
ankit7540
@ ankit7540 kann durchgeführt werden. Es geht lediglich darum, eine Zeile mit cpBefehl hinzuzufügen. Das erste Argument ist die Kopie des Administrators und das zweite Argument, das /home/$( _get_username )/messages/$FILE.txtich zum Schlafen brauche, aber das kann ich am Morgen hinzufügen. Es ist nur eine Zeile.
Sergiy Kolodyazhnyy
Und wenn Sie die Datei verketten möchten, ist das nurcat $FILE >> /home/$( _get_username )/messages/Log_of_all_messages. txt
Sergiy Kolodyazhnyy