Настраиваемое (редактируемое) сообщение для каждого пользователя после входа в систему
Компьютером пользуются три пользователя (+1 администратор), и они используют единый вход. Приходят три пользователя, используют компьютер и выходят из системы. Я должен давать некоторые инструкции, новости и подробности каждый раз, когда они входят в систему.
Я хочу, чтобы у меня была утилита / инструмент, где я мог бы вводить пользовательское сообщение каждому пользователю. Последнее сообщение будет затем отображаться на рабочем столе (для каждого пользователя) (с датой моего последнего редактирования), скажем, 10-15 секунд. Копия текста также будет доступна (для пользователя) где-нибудь со всеми сообщениями и датами, как журнал.
* Администратор имеет SSH доступ к системе.
Я не уверен, возможно ли это (и, может быть, я ищу слишком много!).
2 ответа
Вы можете сделать это в следующей настройке, которая создаст полупрозрачное окно, оставаясь на произвольное время:
Создайте в (любом) каталоге, в котором каждый из пользователей по крайней мере имеет разрешения на чтение, для каждого пользователя файл сообщения, точно названный в честь имени пользователя каждого пользователя (имя входа), без расширения, например
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!
Тогда сообщение будет выглядеть так:
Скопируйте приведенный ниже скрипт в пустой файл, отредактируйте в разделе заголовка вашего скрипта путь к папке, в которой вы храните сообщения пользователей. Сохранить скрипт как
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()
Создать лаунчер в
/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
, который приходит в нижней части вашего сообщения.
Оба раздела могут быть установлены на нет, просто установив ""
как ценность.
Сценарий
#!/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 может изменить сценарий для чтения предварительных и опубликованных сообщений из файла, что делает его еще более удобным в обслуживании. Сделал так, по причинам простоты в ответе.
Скрипт ниже позволяет администратору хранить персонализированные сообщения в форме 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
папка