Чи можу я побачити у файлі журналу всі завдання на основі GUI в його альтернативному форматі командного рядка?


9

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

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

Мені відомо про існування файлу syslog, /var/logале це не те, що мені потрібно. Додаток Менеджер журналів активності з репозиторіїв Ubuntu не показує формат командного рядка, наскільки я знаю. Мені потрібно щось на зразок .bash_history файлу, який існує в моїй домашній папці, але записує мої дії на основі GUI.


ви можете використовувати такий інструмент як strace, щоб зазирнути у запущену програму і подивитися, яку систему вона викликає, це дозволить генерувати величезну кількість даних
Amias

Якщо ви шукаєте програму, яка просто записує бінарне ім’я програм, які відкриваються в графічному інтерфейсі, я можу це зробити в сценарії. Якщо це те, що ви хочете, дайте мені знати. Було б краще, якщо ви уточнили, які саме ваші вимоги є, тому будь ласка, відредагуйте своє запитання. Запис діяльності на основі GUI, таких як натискання кнопок або відкриття нової вкладки у браузері - це не те, що легко записати, оскільки вони не підключені до фактичних команд оболонки
Сергій Колодяжний,

@Serg Журнал, який ви пропонуєте, безумовно, те, що я шукаю. Щось на зразок журналу "Диспетчер завдань" на основі імен CLI замість імен GLI, які, як підказує існуюча відповідь, можуть не збігатися. Наприклад, якщо я відкрию "Мова підтримки" у "Налаштуваннях", я хочу знати його еквівалент CLI. І т.д. ...

@luchonacho Добре, я почну сьогодні писати, публікую, коли буде готово. До речі, "Мовна підтримка" в "Налаштуваннях" не має власного еквівалента кліпу. Деякі речі, такі як меню Bluetooth або фонове меню, можна зробити - ви можете вказати unity-control-center backgroundабо gnome-control-center background(залежно від робочого столу, Unity або XFCE або GNOME). Але зовнішній світ, мабуть, лише побачитьgnome-control-center
Сергій Колодяжний

Існує багато, багато способів дізнатися, яке завдання виконують програми GUI, і дізнатися, що таке їх еквівалент кліпу. Мені здається досить неефективним намагатися сліпо записувати все, що відбувається грубою силою, будучи впевненим, що ти все не застанеш. Краще дізнайтеся у конкретних випадках, використовуючи конкретні інструменти.
Яків Влійм

Відповіді:


2

Вступ

Хоча неможливо реєструвати всі дії графічного інтерфейсу, такі речі, як команди реєстрації даних, які відповідають відкритим вікнам, можна виконати. Нижче представлений простий скрипт 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в командному рядку.


Дякую. Виглядає перспективно! Два питання. Як це запустити? Чого не вистачає 10%?

Вишуканий! +1 від мене!
Фабі

@luchonacho Я додав абзац про використання. Я б рекомендував вам використовувати його вручну з командного рядка, як я описав. Ви можете змусити його автоматично запускатись, але я не рекомендую цього робити. Відсутні 10% - це інші кілька функцій, які я хотів додати, але я не думаю, що я збираюся їх додавати. Наразі це працює досить добре. Але, можливо, я знову передумаю
Сергій Колодяжний

Це, мабуть, найближче, що ви можете дістатись до того, що я шукав, свідомо, що ідеального рішення не існує. Дякую!

4

Запропонувати такий добрий файл журналу як базу для навчання - це насправді геніальна ідея!

Насправді багато дій програм GUI реалізуються в самій програмі, не використовуючи зовнішніх команд; І навіть якщо він використовує зовнішні команди, це може бути інакше, ніж це можна зробити в оболонці;
Тож цього не існує і непросто втілити в життя.

Але у мене є вирішення частини проблеми: Ім'я програми в графічному інтерфейсі іноді відрізняється від назви програми, яке потрібно знати для команди оболонки - не тільки, якщо ім'я 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

Ммм, моє запитання лежить в основі погляду на Linux масштабованої складності, де більш допрацьовані програми будуються на більш простому коді, тому я подумав, що будь-яка програма GUI спирається на команди терміналу, але це може бути не так, оскільки термінал заснований на bash-коді, тоді як програмне забезпечення може бути написано в python або c ++ або тощо. Я помиляюся?

Шари складності існують, але по-різному: грубо є системні виклики, бібліотечні функції, а зверху або графічний інтерфейс користувача, або інтерфейс командного рядка - вони є альтернативою.
Volker Siegel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.