Niestandardowa (edytowalna) wiadomość dla każdego użytkownika po zalogowaniu

11

Z komputera korzysta trzech użytkowników (+1 administrator) i korzystają oni z logowania jedności. Trzej użytkownicy przychodzą, korzystają z komputera i wylogowują się. Muszę podawać instrukcje, wiadomości i szczegóły przy każdym logowaniu.

Chcę mieć narzędzie / narzędzie, w którym mogę wpisać niestandardową wiadomość dla każdego użytkownika. Najnowsza wiadomość byłaby wówczas wyświetlana na pulpicie (dla każdego użytkownika) (z datą mojej ostatniej edycji) na powiedzmy 10-15 sekund. Kopia tekstu może być także dostępna (dla użytkownika) gdzieś ze wszystkimi wiadomościami i datami jak dziennik.

wprowadź opis zdjęcia tutaj

* Administrator ma dostęp SSH do systemu.

Nie jestem pewien, czy jest to możliwe (i być może szukam za dużo!).

ankit7540
źródło
Można to zrobić. Jaka jest Twoja docelowa wersja Ubuntu? Czy wyskakujące ok są w porządku? A może wolisz tekst na ekranie, tak jak pokazuje to Twój przykład?
Sergiy Kolodyazhnyy
Uruchamianie 14.04 LTS i brak planów aktualizacji w najbliższym czasie.
Wyskakujące okienka
Wdrożyłem szybki skrypt, opublikowałem odpowiedź. Pozwala na utworzenie pliku, który zostanie dopasowany do każdego użytkownika. Daj mi znać, jakie inne funkcje chciałbym tam dodać, na wypadek gdybyś potrzebował innych wyjaśnień. Skrypt nie jest wyszukany, ale dość stabilny.
Sergiy Kolodyazhnyy
Cześć @ ankit7540 opublikował moją odpowiedź, w pierwszym „wydaniu”, zapomniałem wspomnieć, aby skrypt był wykonywalny, ale to może być oczywiste :)
Jacob Vlijm
Dzięki za wysiłki @Serg: Podoba mi się to podejście, pozwólcie mi przetestować i odpowiedzieć.
ankit7540

Odpowiedzi:

11

Możesz to zrobić w następującej konfiguracji, która utworzy półprzezroczyste okno, pozostając przez dowolny czas:

  1. Utwórz w (dowolnym) katalogu, w którym każdy z użytkowników ma przynajmniej uprawnienia do odczytu , dla każdego użytkownika plik wiadomości, dokładnie nazwany po nazwie użytkownika (nazwa logowania), bez rozszerzenia, np.

    jacob
    

    Dodaj tekst do pliku jako wiadomość. Jeśli dodasz nową wiadomość, zacznij od ###, skrypt automatycznie wyświetli ostatnią wiadomość. Tekst może zawierać wszystko, co chcesz, będzie wyglądał dokładnie tak, jak umieściłeś go w pliku.

    • Najnowsza wiadomość, zostaną skopiowane latest_message.txtdo katalogu domowego użytkownika odsyłającego.

    • W tej chwili okno pozostanie przez 15 sekund, ale możesz ustawić dowolną wartość, nawet automatycznie uzależnić ją od długości tekstu.


    Przykładowy plik może wyglądać następująco:

    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!
    

    Wiadomość wyglądałaby następująco:

    wprowadź opis zdjęcia tutaj

  2. Skopiuj poniższy skrypt do pustego pliku, edytuj w nagłówku skryptu ścieżkę do folderu, w którym przechowujesz wiadomości użytkowników. Zapisz skrypt jak show_personalmessagew (np.) /usr/local/bin(Który powinien być $PATH i uczynić go wykonywalnym (!) (Bez rozszerzenia)

    #!/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. Utwórz program uruchamiający w /etc/xdg/autostart

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

    Tryb uśpienia 10 ma zapewnić, że pulpit jest „gotowy” do otwarcia okna.

Wyjaśnienie

  • Uruchamianie /etc/xdg/autostartpoleceń uruchamiania dla każdego zalogowanego użytkownika .
  • Następnie program uruchamiający uruchamia okno (wywoływane przez polecenie show_personalmessage), które wyszukuje spersonalizowaną wiadomość w zdefiniowanym katalogu. Do tego. Najnowsza wiadomość jest kopiowana do katalogu domowego użytkownika.
  • W razie potrzeby ścieżka do wiadomości może zostać zmieniona, a nawet określona przez użytkownika za pomocą getpass-moduła, dzięki czemu skrypt (okno) będzie szukał określonego katalogu o nazwie użytkownika w katalogu. Proszę podać, czy byłoby to wymagane.

do tego

Okno (Gtk)

  • można ustawić tak, aby pozostawał poniżej wszystkiego, tak jakby był częścią tła
  • mogą być wykonane pobyt na szczycie wszystkiego
  • można zamknąć

itd itd...


EDYTOWAĆ

Aby zaoszczędzić czas na pisanie wiadomości, jak omówiono na czacie , poniżej wersji skryptu, w której można dołączyć kilka „stałych” sekcji:

  • premsg, który powinien znajdować się tuż poniżej „Witamy użytkownika x” oraz w treści wiadomości, oraz
  • postmsg, która znajduje się w dolnej części wiadomości.

Obie sekcje można ustawić na brak, po prostu ustawiając ""jako wartość.

wprowadź opis zdjęcia tutaj

Scenariusz

#!/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()

Uwaga

Oczywiście, podobnie jak wiadomości ciała , może dynamika zmienia scenariusz do przeczytania przed i po wiadomości z pliku, co czyni go jeszcze bardziej wygodne do utrzymania. Czy tak było, ze względu na prostotę w odpowiedzi.

Jacob Vlijm
źródło
Wypróbowany. Działa bardzo ładnie. Patrząc na kod rozumiem, jak zmienić czas jego pozostawania. Jedno pytanie: Co zrobić, jeśli nie mam dostępu SSH do domu użytkownika (ale tylko do mojego domu)?
ankit7540
Ty (lub ja) możesz ustawić dowolną ścieżkę, ale musimy ją wykorzystać, getpassaby każdy użytkownik automatycznie zażądał nazwanego pliku. Jaką ścieżkę miałbyś na myśli? Musi to być ścieżka, do której każdy użytkownik ma dostęp do odczytu. Poczekaj, edytuje za chwilę ...
Jacob Vlijm
@ ankit7540 dokonał edycji w skrypcie (i w wyjaśnieniu).
Jacob Vlijm
@ ankit7540 Ach, do zobaczenia w pierwszym wierszu: „Witaj użytkowniku ...” Czy to dla ciebie ważne? jest tylko linią w kodzie, jeśli tak jest.
Jacob Vlijm
O tym wierszu „Witaj $ użytkowniku” możesz mi powiedzieć tutaj, a ja mogę dodać go w skrypcie. Dodatkowo, należy rozważyć użytkownik ma folder /home/message. Dobrze byłoby skopiować ostatni tekst wiadomości (catenate itp.) W ustalonym pliku (w celach informacyjnych)
ankit7540
6

Poniższy skrypt umożliwia administratorowi przechowywanie spersonalizowanych wiadomości w formie username_mm_dd_yyyy.txtw katalogu zdefiniowanym przez administratora. Nazwy użytkowników są określane automatycznie i dopasowywane do nazwy pliku i daty wyświetlanego pliku.

Skrypt może również zawierać .desktopwpis, który należy umieścić w /etc/xdg/autostartkatalogu. Spowoduje to, że skrypt będzie wyświetlany dla każdego użytkownika. Alternatywnie możesz umieścić .desktopplik w katalogu każdego użytkownika ~/.config/autostart.

#!/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

Poniżej możesz zobaczyć małe demo skryptu w akcji. Utworzyłem plik w określonym formacie w moim /tmpfolderze

wprowadź opis zdjęcia tutaj

Sergiy Kolodyazhnyy
źródło
Przepraszam, że musiała pani czekać. Działa bardzo dobrze. Lubię przyciski „Anuluj” i „OK”. Użyłem go z wpisem .desktop i działa idealnie!
ankit7540
@ ankit7540 Cieszę się, że ci się podoba. Jakieś dodatkowe funkcje, które chciałbyś, żebym dodał?
Sergiy Kolodyazhnyy
Rozważmy użytkownik ma folder /home/message. Dobrze byłoby skopiować najnowszy plik wiadomości i zachować go w celach informacyjnych.
ankit7540
@ ankit7540 można zrobić. To tylko kwestia dodania wiersza z cppoleceniem, pierwszy argument to kopia administratora, a drugi argument /home/$( _get_username )/messages/$FILE.txtmuszę spać, ale mogę to dodać rano. To tylko jedna linia.
Sergiy Kolodyazhnyy
A jeśli chcesz catenate pliku, to po prostucat $FILE >> /home/$( _get_username )/messages/Log_of_all_messages. txt
Sergiy Kolodyazhnyy