Giriş yaptıktan sonra her kullanıcı için özel (düzenlenebilir) mesaj


11

Bilgisayar üç kullanıcı (+1 yönetici) tarafından kullanılıyor ve birlik oturumu kullanıyor. Üç kullanıcı gelir, bilgisayarı ve oturumu kapat. Her giriş yaptıklarında bazı talimatlar, haberler ve detaylar vermem gerekiyor.

Her kullanıcıya özel bir mesaj yazabileceğim bir yardımcı program / araç istiyorum. Son mesaj 10-15 saniye boyunca masaüstünde (her kullanıcı için) (son düzenleme tarihimle birlikte) görüntülenir. Metnin bir kopyası da (kullanıcı için) tüm mesajların ve tarihlerin günlük gibi olduğu bir yerde bulunabilir.

resim açıklamasını buraya girin

* Yönetici, sisteme SSH erişimine sahiptir.

Bunun mümkün olup olmadığından emin değilim (ve belki de çok fazla arıyorum!).


Yapılabilir. Hedeflenen Ubuntu sürümünüz nedir? Açılır pencereler iyi mi? Veya örneğin gösterdiği gibi ekran metnini mi tercih edersiniz?
Sergiy Kolodyazhnyy

14.04 LTS çalışıyor ve yakında herhangi bir zamanda yükseltme planları yok. Popuplar / bildirim birkaç saniye kalırsa iyidir (~ 10-15 sn)
ankit7540

Hızlı bir komut dosyası uyguladım, bir cevap gönderdim. Bir dosya oluşturmaya izin verir ve bu dosya her kullanıcıyla eşleştirilir. Oraya başka hangi işlevleri eklememi istediğinizi ve başka bir açıklamaya ihtiyacınız olduğunda bana bildirin. Senaryo süslü değil, oldukça kararlı.
Sergiy Kolodyazhnyy

Merhaba @ ankit7540 cevabımı ilk "baskıda" yayınladı, betiği çalıştırılabilir yapmaktan bahsetmeyi unuttum, ama bu çok açık olabilir :)
Jacob Vlijm

Çabalarınız için teşekkürler @Serg: Yaklaşımı beğendim, test edip yanıtlayayım.
ankit7540

Yanıtlar:


11

Bunu, yarı saydam bir pencere oluşturacak ve keyfi bir süre kalacak olan aşağıdaki kurulumda yapabilirsiniz:

  1. Bir (herhangi bir) dizininde oluşturun hangi kullanıcıların her azından gelmiştir okunan her kullanıcı bir mesaj dosyası için, izinleri tam olarak örneğin her kullanıcının adınızdan sonra (isim günlüğü) adında, hiçbir uzantısı

    jacob
    

    Mesajınıza dosyaya metin ekleyin. Yeni bir mesaj eklerseniz , ile başlayın ###, komut dosyası otomatik olarak son mesajı görüntüler. Metin istediğiniz herhangi bir şeyi içerebilir, tam olarak dosyaya koyduğunuz gibi görünecektir.

    • En son mesaj, latest_message.txtreferans olarak kullanıcının ana dizinine kopyalanacaktır .

    • Olduğu gibi, pencere 15 saniye kalacaktır, ancak metni otomatik olarak metnin uzunluğuna bağlı bile olsa herhangi bir değere ayarlayabilirsiniz.


    Örnek bir dosya şöyle görünebilir:

    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!
    

    Mesaj daha sonra şöyle görünecektir:

    resim açıklamasını buraya girin

  2. Aşağıdaki komut dosyasını boş bir dosyaya kopyalayın, komut dosyanızın kafa bölümünde kullanıcı iletilerini depoladığınız klasörün yolunu düzenleyin. Komut dosyasını show_personalmessage(örn.) Olarak kaydedin /usr/local/bin(içinde olması $PATH ve çalıştırılabilir olması gerekir (!) (Uzantı yok)

    #!/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. İçinde bir başlatıcı oluşturun /etc/xdg/autostart

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

    Uyku 10, masaüstünün pencereyi açmaya "hazır" olduğundan emin olmaktır.

açıklama

  • Başlatıcılar , oturum açan her kullanıcı için/etc/xdg/autostart komutları çalıştırır .
  • Başlatıcı daha sonra show_personalmessagetanımladığınız dizinde kişiselleştirilmiş mesajı arayan pencereyi (komut tarafından çağrılır) çalıştırır . Bunlara ek olarak. En son mesaj kullanıcının ana dizinine kopyalanır.
  • Gerekirse, iletinin yolu değiştirilebilir, hatta getpass-module kullanılarak kullanıcıya özgü hale getirilebilir , böylece komut dosyası (pencere) bir dizinde kullanıcıya özgü adlandırılmış bir dosya arar. Bunun gerekip gerekmediğini lütfen belirtin.

bunlara ek olarak

(Gtk) penceresi

  • sanki arka planın bir parçası gibi her şeyin altında kalmak için yapılabilir
  • her şeyin üstünde kalmak yapılabilir
  • kapatılabilir yapılabilir

vesaire vesaire...


DÜZENLE

Sohbette tartışıldığı gibi birkaç "kalıcı" bölüm içerebileceğiniz bir sürümün altında mesaj yazarken zaman kazanmak için :

  • premsg, "Hoşgeldin kullanıcı x" ifadesinin ve iletinizin gövdesinin hemen altında olmalıdır ve
  • postmsg, iletinizin alt bölümü olarak gelir.

Her iki bölüm de yalnızca ""değer olarak ayarlanarak yok olarak ayarlanabilir .

resim açıklamasını buraya girin

Senaryo

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

Not

Tabii ki, mesaj gövdesi gibi , yoy da bir dosyadaki mesajları ön ve posta okumak için komut dosyasını değiştirebilir, bu da bakımını daha da kolaylaştırır. Yanıttaki basitlik nedenlerinden ötürü böyle yaptım.


Denenmiş. Çok güzel çalışıyor. Kod bakarak ben onun kalır zaman değiştirmek için nasıl anlıyorum. Bir soru: Ya kullanıcının evine SSH erişimim yoksa (sadece evime)?
ankit7540

Siz (veya I) herhangi bir yol ayarlayabilirsiniz, ancak getpassher kullanıcının otomatik olarak adlandırılan dosyayı istemesini sağlamak için bunu kullanmamız gerekir . Aklınızda hangi yolu seçerdiniz? Her kullanıcının okuma erişimine sahip olduğu bir yol olmalıdır. Bekle, bir dakika içinde düzenleyecek ...
Jacob Vlijm

@ ankit7540 bunu senaryoda (ve açıklamada) düzenledi.
Jacob Vlijm

@ ankit7540 Ah, ilk satırı görüyorum: "Hoşgeldin kullanıcı ..." Bu senin için önemli mi? yalnızca koddaki bir satırsa.
Jacob Vlijm

Bu satır hakkında "Hoşgeldin $ kullanıcı", bana sadece burada söyleyebilir ve ben senaryoya ekleyebilirsiniz. Ayrıca, kullanıcının bir klasörü olduğunu düşünün /home/message. Son mesaj metnini (katenat vb.) Sabit bir dosyaya (referans için) kopyalamak iyi olur
ankit7540

6

Aşağıdaki komut dosyası, yöneticinin kişiselleştirilmiş iletileri username_mm_dd_yyyy.txtyönetici tanımlı dizinde formda depolamasına olanak tanır . Kullanıcı adları otomatik olarak belirlenir ve görüntülenecek dosyanın dosya adı ve tarihiyle eşleşir.

Komut dosyasının ayrıca dizine .desktopyerleştirilecek bir girişi olabilir /etc/xdg/autostart. Bu, komut dosyasının her kullanıcı için görüntülenmesini sağlar. Alternatif olarak, .desktopdosyayı her bir kullanıcının ~/.config/autostartdizinine yerleştirebilirsiniz.

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

Aşağıda senaryoyu küçük bir demo olarak görebilirsiniz. Dosyayı /tmpklasörümde belirtilen biçimde oluşturdum

resim açıklamasını buraya girin


Sizi beklettiğim için üzgünüm. Süper güzel çalışıyor. 'İptal' ve 'Tamam' düğmelerini seviyorum. .Desktop girişi ile kullandım ve mükemmel çalışıyor!
ankit7540

@ ankit7540 Beğendiğine sevindim. Eklememi istediğiniz başka özellikler var mı?
Sergiy Kolodyazhnyy

Kullanıcının bir klasörü olduğunu düşünün /home/message. Son mesaj dosyasını kopyalamak ve referans için orada tutmak iyi olur.
ankit7540

@ ankit7540 yapılabilir. Bu sadece cpkomut ile bir çizgi ekleme meselesidir , ilk argüman yöneticinin kopyası ve /home/$( _get_username )/messages/$FILE.txtuyumam gereken ikinci argüman ama sabahları bunu ekleyebilirim. Sadece bir satır.
Sergiy Kolodyazhnyy

Ve eğer dosyayı sadece katletmek istiyorsanızcat $FILE >> /home/$( _get_username )/messages/Log_of_all_messages. txt
Sergiy Kolodyazhnyy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.