For example, I normally open mousepad (xfce equivalent of gedit) from the applications menu. However, I know that you can also do this in a terminal by typing mousepad
.
Following this example, what I want is whenever I open mousepad via GUI, a new line is written in a log file stating something like Sep 5 15:35:11 lucho@lucho:~$ mousepad
. More in general, what I want is to log all GUI activities that are potentially do-able via command-line (like opening programs, changing permissions, modifying a system settings, etc) but written in its alternative command-line execution format. I want this in order to improve my knowledge of how to use the command-line (without going through the man
pages). There are many things I do through the GUI which I don't do via command-line (some potentially automatable via a script or via keyboard shortcuts) and having this log file would be a good way to learn them.
I'm aware of the existence of the syslog file in /var/log
but that is not what I need. The Activity Log Manager app from Ubuntu repositories does not show command-line format, so far as I know. I need something like the .bash_history file that exist in my home folder but recording my GUI-based activities.
While it's not possible to log all GUI actions, such things as logging commands that correspond to open windows can be done. Below is the simple python script that does the job. It's still in development, but does 90% of the required task.
#!/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
The script shows timestamp, event type, the window PID, and the corresponding command.
The standard rules of any script apply. Make sure you store the script in ~/bin
directory. If you don't have ~/bin
directory , then create one. Save script file there and ensure it is executable with chmod +x ~/bin/log_open_windows.py
. After than you can run it from command line at any time you wish by calling ~/log_open_windows.py
in command-line.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다