使用 GUI 登录显示控制台消息

jk *_*ica 5 gui console login

当我登录到 Ubuntu 系统时,我收到一条信息性消息,如下所示:

Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-34-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Thu Nov 10 11:17:53 CET 2016

  System load:  0.0                 Processes:           128
  Usage of /:   75.1% of 680.78GB   Users logged in:     1
  Memory usage: 37%                 IP address for eth0: xxx.xxx.xxx.xxx
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

37 packages can be updated.
24 updates are security updates.

New release '16.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Your Hardware Enablement Stack (HWE) is supported until April 2019.
Run Code Online (Sandbox Code Playgroud)

当我通过 GUI 登录系统并打开 Putty 终端时,我没有收到这些消息。有没有办法在登录后自动显示它们(比如,在 GUI 上弹出的特殊窗口中)?

编辑:代码应该能够处理德语。测试 Serg 的代码,我收到以下错误消息:

E: Unbekannter Fehler: \xbb<class 'UnicodeEncodeError'>\xab ('ascii' 
codec can't encode character '\xf6' in position 20: ordinal not in 
range(128))Traceback (most recent call last):
  File "./greeter_window.py", line 92, in <module>
    win = GreeterWindow()
  File "./greeter_window.py", line 29, in __init__
    lines.append('\n\n' + self.get_updates())
  File "./greeter_window.py", line 41, in get_updates
    return self.run_cmd(cmd).decode().strip()
AttributeError: 'NoneType' object has no attribute 'decode'
Run Code Online (Sandbox Code Playgroud)

显然是由德语单词“können”中的字母“ö”引起的。

Ser*_*nyy 3

介绍

您在登录 TTY 时看到的信息通常由 提供/etc/update-motd.d/。最简单的方法是运行这些脚本并将输出提供给 GUI 窗口,但是,正如我发现的,其中一些脚本需要 root 权限。然而,下面的答案不需要 root 权限,并提供非常简单的欢迎窗口。

在此输入图像描述

代码的边缘很粗糙,可能需要更多改进,但它达到了预期的效果。我最终可能会改进此代码以添加更多功能和更好的外观,但现在我们将其称为版本 0.1 :)

用法

该程序的用法非常简单:python3 greeter_window.py

该命令旨在添加到启动应用程序中以在用户登录时显示。请参阅有关如何添加命令作为启动应用程序的相关问题:https://askubuntu.com/a/48327/295286

源代码

也可以在GitHub上找到

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk,Gdk
import subprocess
import psutil
import os

class  GreeterWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self,title="Welcome")
        name = self.get_os_name()
        grid = Gtk.Grid()
        grid.set_border_width(25)
        self.add(grid)

        greeting = Gtk.Label("Welcome to "+name+"!\n\n")
        grid.add(greeting)

        sysinfo = [ str(i) for i in self.get_system_info()]
        fields =  ['Load Avg:','Memory %:','Swap %:',
                            '/ usage %:','Process count:','User count:'
        ]
        lines = [ fields[i] + " " + sysinfo[i] for i in range(len(sysinfo))]

        lines.append( '\nIP addresses:\n' + self.get_ip_addresses()  )
        lines.append('\n\n' + self.get_updates())

        label1 = Gtk.Label("\n".join(lines))

        grid.attach_next_to(label1,greeting,Gtk.PositionType.BOTTOM,1,2)
        #grid.add(label1)
        button = Gtk.Button(label="Got it !")
        button.connect("clicked", self.on_button_clicked)
        grid.attach_next_to(button,label1,Gtk.PositionType.BOTTOM,1,2)

    def get_updates(self,*args):
        cmd = "/usr/lib/update-notifier/apt-check --human-readable".split()
        return self.run_cmd(cmd).decode().strip()

    def on_button_clicked(self,*args):
        Gtk.main_quit()

    def get_ip_addresses(self,*args):
        cmd = ['ip','-o','addr','show']
        result = self.run_cmd(cmd)
        ipaddr = ipaddr_str = None

        if result:
            ipaddr = [ (i.split()[1],i.split()[3])
                       for i in result.decode().strip().split('\n')

            ]
            ipaddr_str = "\n".join([str(i[0]) + " " + str(i[1])
                                    for i in ipaddr
            ])
        return ipaddr_str

    def get_os_name(self,*args):
        with open('/etc/os-release') as f:
             for line in f:
                 if line.startswith('PRETTY_NAME'):
                     return line.split('=')[1].replace('"','').strip()

    def run_cmd(self, cmdlist):
        """ utility: reusable function for running external commands """
        try:
            stdout = subprocess.check_output(cmdlist)
        except subprocess.CalledProcessError:
            pass
        else:
            if stdout:
                return stdout


    def get_system_info(self,*args):
        load = os.getloadavg()
        virtmem = psutil.virtual_memory().percent
        swapmem = psutil.swap_memory().percent
        disk_usage = psutil.disk_usage('/').percent
        num_procs = len(psutil.pids())
        user_count = len(set([ i.name for i in  psutil.users()]))
        return [load,virtmem,swapmem,
                disk_usage,num_procs,user_count
        ]


win = GreeterWindow()
win.connect("delete-event", Gtk.main_quit)
win.set_position(Gtk.WindowPosition.CENTER_ON_PARENT)
#win.override_background_color(Gtk.StateType.NORMAL, Gdk    .RGBA(225,225,0,1))
win.resize(350,350)
win.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)