Настраиваемое (редактируемое) сообщение для каждого пользователя после входа в систему

11

Компьютер используется тремя пользователями (+1 администратор), и они используют единый вход. Приходят три пользователя, используют компьютер и выходят из системы. Я должен давать некоторые инструкции, новости и подробности каждый раз, когда они входят в систему.

Я хочу, чтобы у меня была утилита / инструмент, где я мог бы напечатать пользовательское сообщение для каждого пользователя. Последнее сообщение затем будет отображаться на рабочем столе (для каждого пользователя) (с датой моего последнего редактирования), скажем, 10-15 секунд. Копия текста также будет доступна (для пользователя) где-нибудь со всеми сообщениями и датами, как журнал.

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

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

Я не уверен, возможно ли это (и, возможно, я ищу слишком много!).

ankit7540
источник
Может быть сделано. Какая у вас целевая версия 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. Скопируйте приведенный ниже скрипт в пустой файл, отредактируйте в разделе head вашего скрипта путь к папке, в которой вы храните сообщения пользователей. Сохраните скрипт как 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-module, чтобы скрипт (окно) искал именованный файл для конкретного пользователя в каталоге. Пожалуйста, укажите, требуется ли это.

Дополнительно

Окно (Gtk)

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

и т. д.


РЕДАКТИРОВАТЬ

Для экономии времени написания сообщений, как обсуждалось в чате , ниже приведена версия скрипта, в которую можно включить несколько «постоянных» разделов:

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

Обе секции могут быть установлены в none, просто путем установки ""значения.

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

Сценарий

#!/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 Ах, я вижу тебя в первой строке: "Добро пожаловать, пользователь ..." Это важно для вас? это просто строка в коде, если это так.
Джейкоб Влейм
Об этой строке «Welcome $ user» вы можете просто рассказать мне здесь, и я могу добавить ее в скрипт. Кроме того, учтите, что у пользователя есть папка /home/message. Было бы хорошо скопировать текст недавнего сообщения (cateate и т. Д.) В фиксированный файл (для справки)
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
Сергей Колодяжный