Я могу видеть в файле журнала все основанные на GUI задачи в его альтернативном формате командной строки?

Например, я обычно открываю коврик для мыши (xfce эквивалентный из gedit) из меню приложений. Однако я знаю, что можно также сделать это в терминале путем ввода mousepad.

Следование этому примеру, что я хочу, состоит в том каждый раз, когда я открываю коврик для мыши через GUI, новая строка записана в файле журнала, указав что-то как Sep 5 15:35:11 lucho@lucho:~$ mousepad. Больше в целом то, что я хочу, должно зарегистрировать все операции GUI, которые являются потенциально выполнимыми через командную строку (как вводные программы, изменяя полномочия, изменяя параметры настройки системы, и т.д.), но записанный в ее альтернативном формате выполнения командной строки. Я хочу это для улучшения моего знания того, как использовать командную строку (не проходя man страницы). Существует много вещей, которые я делаю через GUI, который я не делаю через командную строку (некоторые потенциально automatable с помощью сценария или через сочетания клавиш), и имеющий этот файл журнала был бы хороший способ изучить их.

Я знаю о существовании файла системного журнала в /var/log но это не то, в чем я нуждаюсь. Приложение менеджера по Журналу операций из репозиториев Ubuntu не показывает формат командной строки, насколько я знаю. Мне нужно что-то как .bash_history файл, которые существуют в моей домашней папке, но записи моих основанных на GUI операций.

9
задан 8 September 2014 в 02:51

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()

Тестовый прогон:

$ ./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

Сценарий показывает метку времени, тип события, окно PID и соответствующую команду.

Как использовать

Стандартные правила любого сценария применяются. Удостоверьтесь, что Вы храните сценарий в ~/bin каталог. Если Вы не имеете ~/bin каталог, затем создайте тот. Сохраните файл сценария там и удостоверьтесь, что это - исполняемый файл с chmod +x ~/bin/log_open_windows.py. После, чем Вы может выполнить его из командной строки в любое время, Вы желаете путем вызова ~/log_open_windows.py в командной строке.

2
ответ дан 16 November 2019 в 16:25

Предложение, чтобы добрый файл журнала как основа для изучения был на самом деле блестящей идеей!

Unfourtunately, много действий программ GUI реализованы в самой программе, не используя внешние команды; И даже если бы это использует внешние команды, это может быть по-другому, чем можно было бы сделать это в оболочке;
Таким образом, это не существует и не легко реализовать.

Но у меня есть решение для части проблемы: название программы в GUI иногда differen от названия программы, которое нужно знать для команды оболочки - не только если название GUI переведено на местный язык.

Например, как запустить программу Files в строке афериста?

Мы должны изучить все *.desktop файлы для имени. Там, мы находим команду в Exec строка:

locate -b '.desktop' | xargs grep -ls '^Name.*=Files$' | xargs grep '^Exec.*'

имена файла на рабочем столе списков и команды для программы GUI File - замена, что с точным именем Вы ищете - даже это, это - несколько слов (для поиска подстроки, не учтите = и $).

С командой я нахожу Files может быть nautilus, dolphin или active-filebrowser:

/etc/xdg/autostart/nautilus-autostart.desktop:Exec=nautilus -n
/usr/share/app-install/desktop/nemo:nemo.desktop:Exec=nemo %U
/usr/share/app-install/desktop/plasma-active:kde4__active-filebrowser.desktop:Exec=active-filebrowser -graphicssystem raster %u
/usr/share/applications/nautilus-folder-handler.desktop:Exec=nautilus %U
/usr/share/applications/nautilus.desktop:Exec=nautilus --new-window %U
/usr/share/applications/nautilus.desktop:Exec=nautilus --new-window
4
ответ дан 23 November 2019 в 05:09

Другие вопросы по тегам:

Похожие вопросы: