ฉันสามารถดูงานที่อิงกับ GUI ทั้งหมดในไฟล์บันทึกในรูปแบบบรรทัดคำสั่งอื่นได้หรือไม่


9

ตัวอย่างเช่นฉันปกติเปิด mousepad (xfce เทียบเท่ากับ gedit) จากเมนูแอปพลิเคชัน แต่ผมรู้ว่าคุณยังสามารถทำเช่นนี้ใน terminal mousepadโดยการพิมพ์

ตัวอย่างต่อไปนี้คือสิ่งที่ผมต้องการคือทุกครั้งที่ผมเปิด mousepad ผ่าน GUI Sep 5 15:35:11 lucho@lucho:~$ mousepadบรรทัดใหม่จะถูกเขียนในล็อกไฟล์ที่ระบุสิ่งที่ต้องการ โดยทั่วไปสิ่งที่ฉันต้องการคือการบันทึกกิจกรรม GUI ทั้งหมดที่อาจทำได้ผ่าน command-line (เช่นการเปิดโปรแกรมการเปลี่ยนการอนุญาตการดัดแปลงการตั้งค่าระบบ ฯลฯ ) แต่เขียนในรูปแบบการดำเนินการบรรทัดคำสั่งอื่น ฉันต้องการสิ่งนี้เพื่อปรับปรุงความรู้ของฉันเกี่ยวกับวิธีใช้บรรทัดคำสั่ง (โดยไม่ผ่านmanหน้าต่างๆ) มีหลายสิ่งที่ฉันทำผ่าน GUI ซึ่งฉันไม่ได้ทำผ่าน command-line (บางอย่างอาจเป็นไปโดยอัตโนมัติผ่านสคริปต์หรือผ่านทางแป้นพิมพ์ลัด) และการมีล็อกไฟล์นี้จะเป็นวิธีที่ดีในการเรียนรู้

ฉันตระหนักถึงการมีอยู่ของไฟล์ syslog /var/logแต่นั่นไม่ใช่สิ่งที่ฉันต้องการ แอพ Activity Log Manager จากที่เก็บ Ubuntu ไม่แสดงรูปแบบบรรทัดคำสั่งเท่าที่ฉันรู้ ฉันต้องการไฟล์. bash_history ที่มีอยู่ในโฟลเดอร์บ้านของฉัน แต่บันทึกกิจกรรมที่ใช้ GUI


คุณสามารถใช้เครื่องมืออย่าง strace เพื่อแอบดูโปรแกรมที่กำลังทำงานอยู่และดูว่าระบบเรียกมันทำอะไรซึ่งจะสร้างข้อมูลจำนวนมหาศาล
Amias

หากคุณกำลังมองหาโปรแกรมที่บันทึกชื่อไบนารีของโปรแกรมที่เปิดใน GUI ฉันสามารถทำได้ในสคริปต์ หากเป็นสิ่งที่คุณต้องการแจ้งให้เราทราบ จะดีกว่านี้หากคุณชี้แจงว่าข้อกำหนดของคุณคืออะไรจริง ๆ ดังนั้นโปรดแก้ไขคำถามของคุณ การบันทึกกิจกรรมบน GUI เช่นการคลิกที่ปุ่มหรือเปิดแท็บใหม่ในเบราว์เซอร์ไม่ใช่สิ่งที่สามารถบันทึกได้ง่ายเพราะสิ่งเหล่านี้ไม่ได้เชื่อมต่อกับคำสั่งเชลล์จริง
Sergiy Kolodyazhnyy

@Serg บันทึกที่คุณแนะนำน่าจะเป็นสิ่งที่ฉันกำลังมองหา บางอย่างเช่นบันทึก "ตัวจัดการงาน" ที่ใช้ชื่อ CLI แทนที่จะเป็นชื่อ GLI ซึ่งคำแนะนำที่มีอยู่อาจไม่ตรงกัน ตัวอย่างเช่นถ้าฉันเปิด "การสนับสนุนภาษา" ในการตั้งค่าฉันต้องการทราบว่าเทียบเท่า CLI อื่น ๆ ...

@ luchonacho ตกลงฉันจะเริ่มเขียนวันนี้จะโพสต์เมื่อมันพร้อม อย่างไรก็ตาม "การสนับสนุนภาษา" ในการตั้งค่าไม่ได้มี CLI เทียบเท่ากับของมันเอง บางสิ่งเช่นเมนูบลูทู ธ หรือเมนูพื้นหลังทำได้ - คุณสามารถระบุunity-control-center backgroundหรือgnome-control-center background(ขึ้นอยู่กับเดสก์ท็อป, Unity หรือ XFCE หรือ GNOME) แต่โลกภายนอกอาจจะเห็นเท่านั้นgnome-control-center
Sergiy Kolodyazhnyy

มีหลายวิธีในการค้นหาว่างานใดบ้างที่กระทำโดยแอปพลิเคชัน GUI และค้นหาว่าเทียบเท่า cli ของพวกเขาคืออะไร ดูเหมือนว่าฉันจะไม่มีประสิทธิภาพพอที่จะพยายามบันทึกทุกอย่างที่เกิดขึ้นโดยการใช้กำลังดุร้ายโดยไม่รู้ตัวว่าคุณจะไม่ถูกจับ หาคำตอบได้ดีขึ้นในบางกรณีโดยใช้เครื่องมือเฉพาะ
Jacob Vlijm

คำตอบ:


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ในบรรทัดคำสั่ง


ขอบคุณ ดูมีแนวโน้ม! คำถามสองข้อ วิธีการใช้งาน อะไรหายไป 10%

Nifty! +1 จากฉัน!
Fabby

@luchonacho ฉันเพิ่มย่อหน้าการใช้งาน ฉันอยากจะแนะนำให้คุณใช้มันด้วยตนเองจากบรรทัดคำสั่งตามที่อธิบายไว้ คุณสามารถทำให้มันเริ่มโดยอัตโนมัติเมื่อเริ่มต้น แต่ฉันไม่แนะนำให้ทำ ที่หายไป 10% เป็นคุณสมบัติไม่กี่อื่น ๆ ที่ฉันต้องการเพิ่ม แต่ฉันไม่คิดว่าฉันจะเพิ่มพวกเขา มันทำงานได้ดีพอสำหรับตอนนี้ แต่บางทีฉันจะเปลี่ยนใจอีกครั้ง
Sergiy Kolodyazhnyy

นี่อาจเป็นสิ่งที่ใกล้เคียงที่สุดที่คุณจะได้รับในสิ่งที่ฉันกำลังมองหาโดยรู้ว่าโซลูชั่นที่สมบูรณ์นั้นไม่มีอยู่จริง ขอบคุณ!

4

การเสนอไฟล์บันทึกชนิดนั้นเป็นพื้นฐานสำหรับการเรียนรู้เป็นความคิดที่ยอดเยี่ยมจริงๆ!

โดยไม่ได้ตั้งใจมีการใช้งานโปรแกรม GUI หลายอย่างในตัวโปรแกรมเองโดยไม่ใช้คำสั่งภายนอก และแม้ว่ามันจะใช้คำสั่งจากภายนอกมันอาจจะมีวิธีที่แตกต่างกว่าที่จะทำในเชลล์
ดังนั้นจึงไม่มีอยู่และไม่ง่ายต่อการใช้งาน

แต่ฉันมีทางออกสำหรับส่วนหนึ่งของปัญหา: บางครั้งชื่อโปรแกรมใน GUI แตกต่างจากชื่อโปรแกรมที่จำเป็นต้องรู้สำหรับคำสั่งเชลล์ - ไม่เพียง แต่ถ้าชื่อ GUI ถูกแปลเป็นภาษาท้องถิ่น

ตัวอย่างเช่นวิธีการเริ่มต้นโปรแกรมFilesในบรรทัด comman?

เราจำเป็นต้องค้นหา*.desktopชื่อไฟล์ทั้งหมด ที่นั่นเราพบคำสั่งในExecบรรทัด:

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

รายการชื่อไฟล์สก์ท็อปและคำสั่งสำหรับโปรแกรมกุยFile- แทนที่ที่มีชื่อตรงกับที่คุณมองหา - แม้มันของหลายคำ (สำหรับ substring ค้นหาปล่อยออกมา=และ$)

ด้วยคำสั่งฉันพบ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 ใด ๆ ที่ใช้คำสั่งเทอร์มินัล สามารถเขียนเป็นไพ ธ อนหรือ c ++ หรืออื่น ๆ ฉันผิดหรือเปล่า?

ชั้นของความซับซ้อนมีอยู่ แต่ในวิธีที่แตกต่าง: rougnly มีการเรียกระบบฟังก์ชั่นห้องสมุดและด้านบนส่วนติดต่อผู้ใช้แบบกราฟิกหรืออินเตอร์เฟซบรรทัดคำสั่ง - พวกเขาเป็นทางเลือก
Volker Siegel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.