Спеціальне (редаговане) повідомлення для кожного користувача після входу


11

Комп'ютер використовується трьома користувачами (+1 адміністратор), і вони використовують логін єдності. Три користувачі приходять, користуються комп’ютером та виходять із системи. Я маю дати деякі вказівки, новини та деталі кожного разу, коли вони входять у систему.

Я хочу мати утиліту / інструмент, де я можу набрати користувацьке повідомлення кожному користувачеві. Останнє повідомлення буде відображатися на робочому столі (для кожного користувача) (з датою мого останнього редагування), наприклад, 10-15 секунд. Копія тексту також доступна (користувачеві) десь із усіма повідомленнями та датами, як журнал.

введіть тут опис зображення

* Адміністратор має доступ SSH до системи.

Я не впевнений, чи можливо це (і, можливо, я шукаю занадто багато!).


Можна зробити. Яка ваша цільова версія Ubuntu? Чи спливаючі вікна нормально? Або ви віддаєте перевагу екранному тексту, як показує ваш приклад?
Сергій Колодяжний

Запуск 14.04 LTS і не планує оновлення найближчим часом. Спливаючі вікна / сповіщення добре, якщо вони залишаються на кілька секунд (~ 10-15 сек)
ankit7540

Я реалізував швидкий сценарій, розмістив відповідь. Це дозволяє створити файл, і цей файл буде відповідати кожному користувачеві. Дайте мені знати, яку іншу функціональність ви хочете, щоб я там додав, і у випадку, якщо вам знадобиться якесь інше уточнення. Сценарій не вигадливий, але досить стабільний.
Сергій Колодяжний

Привіт @ ankit7540 опублікував мою відповідь у першому "виданні", забув згадати, щоб зробити сценарій виконуваним, але це може бути очевидно :)
Яків Влійм

Дякую за ваші зусилля @Serg: Мені подобається підхід, дозвольте перевірити та відповісти.
ankit7540

Відповіді:


11

Це можна зробити в наступному налаштуванні, яке створить напівпрозоре вікно, зберігаючи довільний час:

  1. Створіть у (будь-якому) каталозі, в якому кожен з користувачів, принаймні, має права на читання , для кожного користувача файл повідомлень, точно вказаний за ім'ям користувача кожного користувача (ім’я входу в систему), без розширення, наприклад

    jacob
    

    Додати текст у файл як своє повідомлення. Якщо ви додасте нове повідомлення, почніть з ###, сценарій автоматично відобразить останнє повідомлення. Текст може містити все, що вам подобається, він буде виглядати саме так, як ви його помістили у файл.

    • Останнє повідомлення, буде скопійовано latest_message.txtна користувача домашнього каталогу для довідки.

    • Як і зараз, вікно залишиться протягом 15 секунд, але ви можете встановити його на будь-яке значення, навіть зробити його автоматично залежним від довжини тексту.


    Приклад файлу може виглядати так:

    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!
    

    Тоді повідомлення буде виглядати так:

    введіть тут опис зображення

  2. Скопіюйте скрипт нижче в порожній файл, відредагуйте в головному розділі свого сценарію шлях до папки, в якій ви зберігаєте повідомлення користувачів. Збережіть сценарій як show_personalmessageу (напр.) /usr/local/bin(Який повинен бути в $PATH і зробити його виконуваним (!) (Без розширення)

    #!/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. Створіть панель запуску в /etc/xdg/autostart

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

    Сон 10 - переконатися, що робочий стіл готовий до відкриття вікна.

Пояснення

  • Запуски /etc/xdg/autostartкоманд запуску для кожного користувача при вході.
  • Потім програма запуску запускає вікно (викликане командою show_personalmessage), яке шукає персоналізоване повідомлення у визначеному вами каталозі. Додатково. Останнє повідомлення копіюється в домашній каталог користувача.
  • Якщо потрібно, шлях до повідомлення може бути змінений, навіть зробити його конкретним для користувача, використовуючи getpass-модуль, так що скрипт (вікно) буде шукати специфічний для користувача файл з іменем у каталозі. Будь ласка, зазначте, якщо це буде потрібно.

Додатково

Вікно (Gtk)

  • можна зробити так, щоб залишатися нижче всього, ніби це було частиною фону
  • можна змусити залишатись над усім
  • можна зробити закритим

тощо, тощо ...


EDIT

Щоб заощадити час на написання повідомлень, як обговорювалося в чаті , нижче версії сценарію, в яку ви можете включити кілька "постійних" розділів:

  • premsg, яка повинна бути трохи нижче "Привітання користувача x", а також частину вашого повідомлення та
  • postmsg, яка розміщена як нижній розділ вашого повідомлення.

Обидва розділи можна встановити на жодні, просто встановивши ""як значення.

введіть тут опис зображення

Сценарій

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

Примітка

Звичайно, так само, як і тіло повідомлення , yoy може змінити сценарій для читання попередніх та після повідомлення з файлу, що робить його ще зручнішим в обслуговуванні. Чи сподобалось це з міркувань простоти у відповіді.


Спробував. Це дуже добре працює. Дивлячись на код, я розумію, як змінити час його перебування. Одне запитання: Що робити, якщо я не маю доступу SSH до дому користувача (а лише додому)?
ankit7540

Ви (або я) можете встановити будь-який шлях, але нам потрібно використовувати getpassйого для того, щоб кожен користувач атомно запитав названий файл. Який шлях ви мали б на увазі? Це повинен бути шлях, до якого кожен користувач має доступ до читання. Зачекайте, відредагуйте через хвилину ...
Яків Влійм

@ ankit7540 відредагував це в сценарій (і в пояснення).
Яків Влійм

@ ankit7540 А, я бачу, ви перший рядок: "Ласкаво просимо користувач ..." Це для вас важливо? це лише рядок у коді, якщо він є.
Яків Влійм

Щодо цього рядка "Ласкаво просимо $ користувач", ви можете просто сказати мені тут, і я можу додати його до сценарію. Крім того, вважає користувач має папку /home/message. Було б добре скопіювати останній текст повідомлення (катенат тощо) у фіксований файл (для довідки)
ankit7540

6

Нижче сценарій дозволяє адміністратору зберігати персоналізовані повідомлення у формі username_mm_dd_yyyy.txtу визначеному адміністратором каталозі. Імена користувачів визначаються автоматично та співпадають з назвою файлу та датою файлу, який відображатиметься.

Сценарій також може мати .desktopзапис, який слід розмістити в /etc/xdg/autostartкаталозі. Це дозволить відобразити сценарій для кожного користувача. Ви також можете розмістити .desktopфайл у ~/.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

Нижче ви можете побачити невелику демонстрацію сценарію в дії. Я створив файл у визначеному форматі у своїй /tmpпапці

введіть тут опис зображення


Вибачте, що чекаєте. Це працює дуже приємно. Мені подобаються кнопки «Скасувати» та «ОК». Я використав це з записом .desktop, і він ідеально працює!
ankit7540

@ ankit7540 Радий, що вам це подобається. Якісь додаткові функції, які ви хочете додати?
Сергій Колодяжний

Розглянемо користувач має папку /home/message. Було б добре скопіювати останній файл повідомлення та зберегти його для довідок.
ankit7540

@ ankit7540 можна зробити. Це просто питання додавання рядка з cpкомандою, перший аргумент - це копія адміністратора, а другий аргумент /home/$( _get_username )/messages/$FILE.txtмені потрібно спати, але я можу додати це вранці. Це лише один рядок.
Сергій Колодяжний

А якщо ви хочете просто катетувати файлcat $FILE >> /home/$( _get_username )/messages/Log_of_all_messages. txt
Сергій Колодяжний,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.