Thông báo tùy chỉnh (có thể chỉnh sửa) cho mỗi người dùng sau khi đăng nhập


11

Máy tính đang được sử dụng bởi ba người dùng (quản trị viên +1) và họ sử dụng đăng nhập thống nhất. Ba người dùng đến, sử dụng máy tính và đăng xuất. Tôi phải đưa ra một số hướng dẫn, tin tức và chi tiết mỗi khi họ đăng nhập.

Tôi muốn có một tiện ích / công cụ để tôi có thể nhập tin nhắn tùy chỉnh cho mỗi người dùng. Thông báo mới nhất sau đó sẽ được hiển thị trên màn hình nền (cho mỗi người dùng) (có ngày chỉnh sửa cuối cùng của tôi) trong vòng 10 - 15 giây. Một bản sao của văn bản cũng có sẵn (cho người dùng) ở đâu đó với tất cả các tin nhắn và ngày tháng như nhật ký.

nhập mô tả hình ảnh ở đây

* Quản trị viên có quyền truy cập SSH vào hệ thống.

Tôi không chắc chắn nếu điều này là có thể (và có thể tôi đang tìm kiếm quá nhiều!).


Có thể được thực hiện. Phiên bản Ubuntu được nhắm mục tiêu của bạn là gì? Cửa sổ bật lên có ổn không? Hoặc bạn thích văn bản trên màn hình như ví dụ của bạn cho thấy?
Sergiy Kolodyazhnyy

Chạy 14.04 LTS và không có kế hoạch nâng cấp bất cứ lúc nào sớm. Cửa sổ bật lên / thông báo vẫn ổn nếu chúng tồn tại trong vài giây (~ 10-15 giây)
ankit7540

Tôi đã thực hiện một kịch bản nhanh chóng, đăng một câu trả lời. Nó cho phép tạo một tệp và tệp đó sẽ được khớp với từng người dùng. Hãy cho tôi biết những chức năng khác mà bạn muốn tôi thêm vào đó, và trong trường hợp bạn cần bất kỳ sự làm rõ nào khác. Kịch bản không cầu kỳ, nhưng khá ổn định.
Sergiy Kolodyazhnyy

Hi @ ankit7540 đăng câu trả lời của tôi, trong "phiên bản" đầu tiên, quên đề cập đến để làm cho kịch bản thực thi, nhưng điều đó có thể là :) rõ ràng
Jacob Vlijm

Cảm ơn những nỗ lực của bạn @Serg: Tôi thích cách tiếp cận, hãy để tôi kiểm tra và trả lời.
ankit7540

Câu trả lời:


11

Bạn có thể làm điều đó trong thiết lập sau, sẽ tạo ra một cửa sổ bán trong suốt, duy trì trong một thời gian tùy ý:

  1. Tạo trong một thư mục (bất kỳ), trong đó mỗi người dùng ít nhất có quyền đọc , cho mỗi người dùng một tệp tin, được đặt tên chính xác theo tên người dùng của mỗi người dùng (tên đăng nhập), không có phần mở rộng, ví dụ:

    jacob
    

    Thêm văn bản vào tập tin như tin nhắn của bạn. Nếu bạn thêm một tin nhắn mới , hãy bắt đầu với ###, tập lệnh sẽ tự động hiển thị tin nhắn cuối cùng. Văn bản có thể chứa bất cứ thứ gì bạn thích, nó sẽ trông giống hệt như bạn đặt nó trong tệp.

    • Tin nhắn mới nhất , sẽ được sao chép latest_message.txtvào thư mục chính của người dùng để tham khảo.

    • Như vậy, cửa sổ sẽ tồn tại trong 15 giây, nhưng bạn có thể đặt nó thành bất kỳ giá trị nào, thậm chí làm cho nó tự động phụ thuộc vào độ dài của văn bản.


    Một tệp ví dụ có thể trông như:

    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!
    

    Thông báo sau đó sẽ giống như:

    nhập mô tả hình ảnh ở đây

  2. Sao chép tập lệnh bên dưới vào một tập tin trống, chỉnh sửa trong phần đầu của tập lệnh của bạn đường dẫn đến thư mục mà bạn lưu trữ tin nhắn của người dùng. Lưu tập lệnh như show_personalmessagetrong (ví dụ) /usr/local/bin(cần có trong đó $PATH và làm cho tập lệnh thực thi (!) (Không có phần mở rộng)

    #!/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. Tạo một launcher trong /etc/xdg/autostart

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

    Ngủ 10 là để đảm bảo máy tính để bàn "sẵn sàng" để mở cửa sổ.

Giải trình

  • Các trình khởi chạy trong /etc/xdg/autostartcác lệnh chạy cho mỗi người dùng khi đăng nhập.
  • Trình khởi chạy sau đó chạy cửa sổ (được gọi bằng lệnh show_personalmessage), tìm kiếm thông báo được cá nhân hóa trong thư mục bạn đã xác định. Ngoài ra. Tin nhắn gần đây nhất được sao chép vào thư mục nhà của người dùng.
  • Nếu được yêu cầu, đường dẫn đến tin nhắn có thể được thay đổi, thậm chí được người dùng xác định cụ thể bằng cách sử dụng getpass-module, để tập lệnh (cửa sổ) sẽ tìm tệp có tên người dùng cụ thể trong thư mục. Hãy đề cập nếu điều đó sẽ được yêu cầu.

Ngoài ra

Cửa sổ (Gtk)

  • có thể được thực hiện để ở dưới mọi thứ, như thể nó sẽ là một phần của nền
  • có thể được thực hiện trên đầu trang của tất cả mọi thứ
  • có thể được đóng lại

Vân vân...


BIÊN TẬP

Để tiết kiệm thời gian viết tin nhắn, như được thảo luận trong trò chuyện , bên dưới một phiên bản của tập lệnh mà bạn có thể bao gồm một vài phần "cố định":

  • premsg, nằm ngay bên dưới "Chào mừng người dùng x" và nội dung thư của bạn và
  • postmsg, đó là phần dưới cùng của tin nhắn của bạn.

Cả hai phần có thể được đặt thành không, chỉ bằng cách đặt ""làm giá trị.

nhập mô tả hình ảnh ở đây

Kịch bản

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

Ghi chú

Tất nhiên, giống như thông điệp cơ thể , so với cùng kỳ có thể thay đổi kịch bản để đọc các thông điệp trước và sau từ một tập tin, mà làm cho nó thậm chí còn thuận tiện hơn để duy trì. Đã làm như thế này, vì lý do đơn giản trong câu trả lời.


Đã thử. Nó hoạt động rất độc đáo. Nhìn vào mã tôi hiểu làm thế nào để thay đổi thời gian lưu lại. Một câu hỏi: Điều gì xảy ra nếu tôi không có quyền truy cập SSH vào nhà của người dùng (nhưng chỉ đến nhà của tôi)?
ankit7540

Bạn (hoặc tôi) có thể đặt bất kỳ đường dẫn nào, nhưng chúng tôi cần làm cho nó sử dụng getpasssau đó để làm cho mỗi người dùng yêu cầu một cách tự nhiên tệp được đặt tên. Bạn sẽ có con đường nào trong tâm trí? Nó phải là một đường dẫn mà mỗi người dùng có quyền truy cập đọc. Đợi, sẽ chỉnh sửa trong một phút ...
Jacob Vlijm

@ ankit7540 chỉnh sửa nó thành kịch bản (và vào phần giải thích).
Jacob Vlijm

@ ankit7540 À, tôi thấy bạn dòng đầu tiên: "Chào mừng người dùng ..." Điều đó có quan trọng với bạn không? chỉ là một dòng trong mã nếu có.
Jacob Vlijm

Về dòng "Chào mừng người dùng $", bạn chỉ cần cho tôi biết ở đây và tôi có thể thêm nó vào tập lệnh. Ngoài ra, xem xét người dùng có một thư mục , /home/message. Sẽ tốt hơn nếu sao chép văn bản tin nhắn gần đây (catenate, v.v.) trong một tệp cố định (để tham khảo)
ankit7540

6

Tập lệnh dưới đây cho phép quản trị viên lưu trữ các tin nhắn được cá nhân hóa dưới dạng username_mm_dd_yyyy.txttrong thư mục do quản trị viên xác định. Tên người dùng được xác định tự động và khớp với tên tệp và ngày của tệp sẽ được hiển thị.

Kịch bản cũng có thể có một .desktopmục được đặt vào /etc/xdg/autostartthư mục. Điều đó sẽ làm cho tập lệnh được hiển thị cho mỗi người dùng. Ngoài ra, bạn có thể đặt .desktoptệp vào từng ~/.config/autostartthư mục của người dùng .

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

Dưới đây bạn có thể thấy một bản demo nhỏ của kịch bản đang hoạt động. Tôi đã tạo tệp theo định dạng trong /tmpthư mục của mình

nhập mô tả hình ảnh ở đây


Xin lỗi vì đã để bạn đợi. Nó hoạt động siêu đẹp. Tôi thích các nút 'Hủy' và 'OK'. Tôi đã sử dụng nó với mục .desktop và nó hoạt động hoàn hảo!
ankit7540

@ ankit7540 Vui mừng bạn thích nó. Bất kỳ tính năng bổ sung nào bạn muốn tôi thêm?
Sergiy Kolodyazhnyy

Xem xét người dùng có một thư mục /home/message,. Nó sẽ là tốt để sao chép các tập tin tin nhắn gần đây và giữ ở đó để tham khảo.
ankit7540

@ ankit7540 có thể được thực hiện. Đây chỉ là vấn đề thêm một dòng bằng cplệnh, đối số đầu tiên là bản sao của quản trị viên và đối số thứ hai /home/$( _get_username )/messages/$FILE.txttôi cần ngủ nhưng tôi có thể thêm nó vào buổi sáng. Nó chỉ là một dòng.
Sergiy Kolodyazhnyy

Và nếu bạn muốn catenate tập tin chỉcat $FILE >> /home/$( _get_username )/messages/Log_of_all_messages. txt
Sergiy Kolodyazhnyy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.