我可以在日志文件中以替代命令行格式查看所有基于 GUI 的任务吗?

10 gui command-line

例如,我通常从应用程序菜单打开鼠标垫(xfce 相当于 gedit)。但是,我知道您也可以通过在终端中输入mousepad.

按照这个例子,我想要的是每当我通过 GUI 打开鼠标垫时,在日志文件中写入一个新行,说明类似Sep 5 15:35:11 lucho@lucho:~$ mousepad. 更一般地说,我想要的是记录所有可能通过命令行执行的 GUI 活动(如打开程序、更改权限、修改系统设置等),但以其替代命令行执行格式编写。我希望这样做是为了提高我对如何使用命令行的知识(无需浏览man页面)。我通过 GUI 做了很多事情,而我不通过命令行(有些可能通过脚本或键盘快捷键自动执行),拥有这个日志文件将是学习它们的好方法。

我知道 syslog 文件的存在,/var/log但这不是我需要的。据我所知,来自 Ubuntu 存储库的活动日志管理器应用程序不显示命令行格式。我需要类似 .bash_history 文件的东西,它存在于我的主文件夹中,但记录了我基于 GUI 的活动。

Ser*_*nyy 2

介绍

虽然不可能记录所有GUI 操作,但可以完成诸如记录与打开的窗口相对应的命令之类的操作。下面是完成这项工作的简单 python 脚本。它仍在开发中,但已完成 90% 的所需任务。

源代码

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

def run_cmd(cmdlist):
    """ Reusable function for running external commands """
    new_env = dict(os.environ)
    new_env['LC_ALL'] = 'C'
    try:
        stdout = subprocess.check_output(cmdlist, env=new_env)
    except subprocess.CalledProcessError:
        pass
    else:
        if stdout:
            return stdout
def print_info(stack,event):
    base_xprop = ['xprop','-notype']
    for xid in stack:
        pid = None
        check_pid = run_cmd(base_xprop + [ '_NET_WM_PID', '-id',str(xid)])
        if check_pid:
            pid = check_pid.decode().split('=')[1].strip()
        with open('/proc/'+pid+'/cmdline') as fd:
            command = fd.read()
        print(time.strftime("%D %H:%M:%S" + " "*3) + event + pid + " " + command)

def main():
    sc = Gdk.Screen.get_default()
    old_stack = None

    while True:
        stack = [ win.get_xid() for win in sc.get_window_stack() ]
        if old_stack:
            # Difference between current and old stack will show new programs
            diff = set(stack) - set(old_stack)
            if diff:
                print_info(diff," 'New window open' ")
        else:
            print_info(stack," 'Script Started' ")

        old_stack = stack
        time.sleep(2)

if __name__ == '__main__': main()
Run Code Online (Sandbox Code Playgroud)

测试运行:

$ ./log_open_windows.py                                                                                                
01/25/17 15:33:13    'Script Started' 2915 nautilus-n
01/25/17 15:33:13    'Script Started' 3408 /opt/google/chrome/chrome
01/25/17 15:33:13    'Script Started' 12540 /usr/bin/python/usr/bin/x-terminal-emulator
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:21    'New window open' 15143 /usr/lib/firefox/firefox-new-window
01/25/17 15:33:27    'New window open' 15196 unity-control-center
Run Code Online (Sandbox Code Playgroud)

该脚本显示时间戳、事件类型、窗口 PID 和相应的命令。

如何使用

任何脚本的标准规则都适用。确保将脚本存储在~/bin目录中。如果您没有~/bin目录,请创建一个。将脚本文件保存在那里并确保它可以使用chmod +x ~/bin/log_open_windows.py. 之后,您可以随时通过调用命令行来从命令行运行它~/log_open_windows.py