Par exemple, j'ouvre normalement le mousepad (équivalent xfce de gedit) à partir du menu des applications. Cependant, je sais que vous pouvez également le faire dans un terminal en tapant mousepad
.
Suivant cet exemple, ce que je veux, c’est que chaque fois que j’ouvre le tapis de souris via une interface graphique, une nouvelle ligne est écrite dans un fichier journal et indique quelque chose comme Sep 5 15:35:11 lucho@lucho:~$ mousepad
. Plus généralement, ce que je veux, c'est enregistrer toutes les activités de l'interface graphique potentiellement réalisables via la ligne de commande (telles que l'ouverture de programmes, la modification d'autorisations, la modification d'un paramètre système, etc.) mais écrites dans sa ligne de commande alternative format d'exécution. Je le souhaite pour améliorer mes connaissances sur l’utilisation de la ligne de commande (sans passer par les pages man
). Il y a beaucoup de choses que je fais via l'interface graphique que je ne fais pas via une ligne de commande (certaines pouvant être automatisées via un script ou via des raccourcis clavier) et avoir ce fichier journal serait un bon moyen de les apprendre.
Je suis au courant de l'existence du fichier syslog dans /var/log
mais ce n'est pas ce dont j'ai besoin. Pour autant que je sache, l'application Activity Log Manager des référentiels Ubuntu n'affiche pas le format de ligne de commande. J'ai besoin de quelque chose comme le fichier .bash_history qui existe dans mon dossier personnel mais qui enregistre mes activités basées sur une interface graphique.
Bien qu'il ne soit pas possible de consigner des actions toutes de l'interface graphique, des opérations telles que la journalisation des commandes correspondant aux fenêtres ouvertes peuvent être effectuées. Vous trouverez ci-dessous le simple script python qui effectue le travail. Il est encore en développement, mais effectue 90% de la tâche requise.
#!/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 __== '__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
Le script affiche l'horodatage, le type d'événement, le PID de la fenêtre et la commande correspondante.
Les règles standard de tout script s'appliquent. Assurez-vous de stocker le script dans le répertoire ~/bin
. Si vous n'avez pas le répertoire ~/bin
, créez-en un. Enregistrez le fichier de script ici et assurez-vous qu’il est exécutable avec chmod +x ~/bin/log_open_windows.py
. Après cela, vous pouvez l'exécuter à partir de la ligne de commande à tout moment en appelant ~/log_open_windows.py
en ligne de commande.
Proposer ce type de fichier journal comme base d’apprentissage est une idée brillante!
Malheureusement, de nombreuses actions de programmes d'interface graphique sont implémentées dans le programme même, sans utiliser de commandes externes; Et même s'il utilise des commandes externes, il peut être différent de celui utilisé dans un shell;
Donc, cela n’existe pas et n’est pas facile à mettre en œuvre.
Mais j'ai une solution à une partie du problème: le nom du programme dans l'interface graphique est parfois différent du nom de programme que l'on doit connaître pour une commande Shell - et pas seulement si le nom de l'interface graphique est traduit dans une langue locale.
Par exemple, comment démarrer le programme Files
dans la ligne de communication?
Nous devons examiner tous les fichiers *.desktop
pour en connaître le nom. Ici, nous trouvons la commande dans la ligne Exec
:
locate -b '.desktop' | xargs grep -ls '^Name.*=Files$' | xargs grep '^Exec.*'
répertorie les noms de fichier de bureau et les commandes du programme GUI File
- le remplace par le nom exact recherché - même s'il comporte plusieurs mots (pour la recherche dans la sous-chaîne, laissez de côté le =
et $
).
Avec la commande, je trouve que Files
peut être nautilus
, dolphin
ou 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