Ce que je veux réaliser, c'est pouvoir enregistrer mes sessions de terminal pour les déposer automatiquement chaque fois que j'utilise Yakuake / Konsole.
C'est facile à réaliser si au début de ma session je fais:
script -f /home/$USER/bin/shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log
Mais je veux exécuter ce qui précède automatiquement chaque fois que je démarre Yakuake ou ouvre un nouvel onglet.
L'utilisation de .bashrc ne fonctionne pas car il crée une boucle sans fin car le «script» ouvre une nouvelle session, qui à son tour lit .bashrc et démarre un autre «script» et ainsi de suite.
Donc, je suppose que j'ai besoin de script Yakuake / Konsole pour exécuter le script une fois qu'un nouvel onglet est ouvert. La question est de savoir comment?
exec
au début de la ligne. il doit démarrer lescript -f
dans le même shell PID.Réponses:
Si quelqu'un souhaite enregistrer automatiquement ses sessions de terminal - y compris les sessions SSH (!) - à l'aide de l'
script
utilitaire, voici comment procéder.Ajoutez la ligne suivante à la fin de
.bashrc
dans votre répertoire personnel, ou sinon/etc/bash.bashrc
si vous souhaitez uniquement enregistrer toutes les sessions des utilisateurs. Nous testons le processus parent du shellscript
et nous l'exécutonsscript
.Pour Linux:
Pour BSD et macOS, passez
script -f
àscript -F
:C'est tout!
Maintenant, lorsque vous ouvrez un nouveau terminal, vous verrez:
script
va écrire vos sessions dans un fichier de votre répertoire personnel en les nommant comme30-Nov-11_00-11-12_shell.log
résultat.Plus de personnalisation:
script -a /path/to/single_log_file
script -f
(Linux) ouscript -F
(BSD et macOS)Cette réponse suppose que vous avez
script
installé, bien sûr. Sur les distributions basées sur Debian,script
fait partie dubsdutils
paquet.la source
edit
bouton qui apparaît juste en dessous.${RANDOM}
et / ou$$
au nom de fichier, car le démarrage de deux shells dans la seconde entraînera une collision de nom de fichier. Personnellement, j'utilise souventscript.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.log
pour m'assurer que les fichiers sont automatiquement triés par date / heure et qu'ils sont cohérents sur TZ, je connais l'hôte qui l'a initié, je connais le processus de propriété et il n'y a pas de collisions de noms. J'utilise rarement${USER}
parce que c'est généralement quelque chose pour moi seulement.Bien que cette question ait été posée par une personne souhaitant enregistrer ses propres sessions, un autre cas d'utilisation pourrait être un administrateur système qui souhaite garder une trace de ce que font les différents utilisateurs.
Une approche alternative
Ce guide de 2008 ( archivé ) utilise une méthode différente pour forcer
script
son exécution lorsqu'un utilisateur se connecte avec ssh, ce qui oblige les utilisateurs à se connecter avec une clé publique / privée.Cela se fait en ajoutant un script au
.ssh/authorized_keys
fichier de l'utilisateur , devant la clé:Le script
log-session
( archivé ) décide ensuite s'il doit s'exécuter ou non/usr/bin/script
pour enregistrer la session de cet utilisateur.Pour empêcher l'utilisateur de supprimer la commande ajoutée, l'administrateur devra assumer la propriété du
authorized_keys
fichier de l'utilisateur .Malheureusement, cela signifie que l'utilisateur ne pourra pas ajouter lui-même de clés supplémentaires ou, plus important encore, révoquer la clé existante si elle est compromise, ce qui est loin d'être idéal.
Avertissements
Il est courant que la configuration par défaut de sshd permette aux utilisateurs d'exécuter SFTP via leur connexion ssh. Cela permet aux utilisateurs de modifier des fichiers sans que les modifications soient enregistrées. Si l'administrateur ne souhaite pas que les utilisateurs soient en mesure de le faire, il doit activer la journalisation pour SFTP ou désactiver le service. Bien que même dans ce cas, les utilisateurs puissent toujours apporter des modifications invisibles aux fichiers en exécutant quelque chose comme ceci dans leur terminal:
Il peut être possible de surveiller des modifications comme celle-ci en utilisant un système de fichiers de copie sur écriture qui enregistre tout l'historique des fichiers.
Mais une astuce similaire permettrait à un utilisateur d'exécuter des commandes sans qu'il soit connecté:
Je ne connais aucune solution simple à cela. Les possibilités peuvent être:
Ce genre de chose pourrait être possible avec auditd .
Mais peu importe...
la source
Au lieu de:
J'utiliserais:
Les guillemets doubles ne sont pas nécessaires dans ce cas, mais j'ai tendance à les utiliser de toute façon comme pratique standard. Je recommande vraiment d'utiliser le commutateur "x" à la fois pour le grep et le pgrep, pour éviter une correspondance rare mais problématique avec les sous-chaînes.
la source