Comment puis-je conserver un enregistrement local horodaté de toutes les commandes distantes que j'utilise dans ssh
(client openssh en ligne de commande démarré bash
)?
Exigences:
Essentiel:
- 100% côté client sans dépendre de la journalisation du serveur
- Configuré ou installé par utilisateur avec des journaux stockés dans le répertoire personnel de l'utilisateur.
- Prise en charge de la distinction entre plusieurs sessions simultanées avec différents utilisateurs et hôtes.
- Non intrusif (pas besoin de l'activer à chaque fois et n'interfère pas de manière significative avec l'utilisation de ssh)
Haute priorité:
- La sortie n'est pas enregistrée ou filtrée autant que possible
- Soit les entrées de mot de passe ne sont pas enregistrées, soit le fichier est crypté
- Indique les commandes réelles utilisées (après la fin de l'onglet / historique, les espaces arrière, CTRL+ C, etc ... ont été traités)
Bon d'avoir:
- Enregistre également les commandes dans les sessions chaînées (commandes entrées lors de sessions
ssh
ou à distancesu <user>
) - Le début et la fin de la session doivent être enregistrés
- Une
bash
solution simple et non root serait la meilleure (peut-être un scriptalias
ou unbash
wrapper pour lassh
commande?)
- Enregistre également les commandes dans les sessions chaînées (commandes entrées lors de sessions
Mon niveau de compétence:
- Je ne suis pas nouveau dans la programmation, mais j'apprends toujours
bash
et la "façon Linux", donc des exemples de code avec de brèves explications seraient les plus appréciés.
Stratégies possibles
- Enregistreur de frappe - Problème: enregistre les mots de passe, n'enregistre pas la fin de l'onglet / historique (voir la réponse de Glenn )
screen
avec défilement défilant une fois par seconde etdiff
entre elles pour trouver de nouvelles lignes de défilement - Problème: comment cela peut-il être implémenté de manière automatisée et utile?ssh "$@" | tee >(some_cleaner_function >> $logfile)
- Problème: ne peut pas gérer les commandes multilignes ou l'historique dans les sessions chaînées, un nettoyage soigneux est nécessaire (voir ma réponse)- Une combinaison de certains des éléments ci-dessus
Un exemple
La session SSH suivante:
user@local:~$ ssh user@remote
Last login: Tue Jun 17 16:34:23 2014 from local
user@remote:~$ cd test
user@remote:~/test$ ls
a b
user@remote:~/test$ exit
Peut entraîner un journal ~/logs/ssh.log
tel que:
2014-06-17 16:34:50 [user@remote - start]
2014-06-17 16:34:51 [user@remote] cd test
2014-06-17 16:34:52 [user@remote] ls
2014-06-17 16:34:53 [user@remote] exit
2014-06-17 16:34:53 [user@remote - end]
Ou, peut-être un journal distinct sera créé pour chaque session avec la ligne de commande utilisée pour démarrer la session en haut du fichier.
Réponses:
J'ai été intrigué par votre question. Au départ, je n'allais pas donner de réponse, mais je suis devenu accro.
Cela utilise
expect
et c'est vraiment un enregistreur de frappe.Remarques:
uptime
commande), vous obtiendrez "upt \ t" dans le fichier journal, pas "uptime"^?
(caractères de retour arrière) dans le fichier journal.la source
J'utilise actuellement le script bash ci-dessous. Il a de nombreux problèmes, mais c'est la seule solution que j'ai trouvée qui réponde à toutes les exigences, priorités et "nice to haves" (au moins la plupart du temps).
Cette réponse explique pourquoi la journalisation locale des sessions ssh est si difficile.
Problèmes avec le script que j'ai trouvé jusqu'à présent:
Les commandes multilignes provoquent des problèmes:
Les sessions chaînées (en utilisant
ssh
ou lessu
commandes sur l'extrémité distante) provoquent un défilement de l'historique pour enregistrer les commandes passées par défilement au lieu des commandes réelles utiliséesLes expressions régulières peuvent être améliorées et peuvent devoir être modifiées pour certains environnements:
cat -v
avant le nettoyage. Par conséquent, le contenu valide peut être supprimé si vous utilisez des chaînes comme^[[
dans vos commandes.Pas de complétion de la commande ssh, comme pour le nom d'hôte.Vous pouvez obtenir l'achèvement de bash si vous alias ce scriptssh
avecalias ssh="sshlog"
Source de script et installation:
Pour installer, collez ce qui suit dans ~ / bin / sshlog et rendez exécutable. Appelez avec
sshlog <ssh command options>
. Éventuellement alias vers 'ssh' dans le fichier .bashrc de l'utilisateur.Exemple de contenu du journal:
la source
J'ai une réponse moins compliquée et sûrement pas un enregistreur de frappe. Je ne comprends pas pourquoi vous êtes indépendant du journal du serveur (cela signifie que toutes les actions doivent être effectuées sur le serveur et que tous les journaux sont des journaux côté serveur), et j'ai donc pensé qu'une bonne idée était de passer à bashrc à l'échelle du système une commande rapide comme:
Dans debian, vous devez éditer le fichier: /etc/bash.bashrc et en centos le fichier: / etc / bashrc
Si vous souhaitez démarrer la journalisation de la session dans laquelle vous vous trouvez, vous devez rechercher le fichier que vous avez modifié, par exemple exécuter:
dans un système Debian ou
dans un système centos.Désormais, chaque commande, de chaque session ssh sera enregistrée dans / var / log / syslog sur un système Debian, et dans / var / log / messages sur un système centos.
Dans le cas où vous souhaitez les enregistrer dans un fichier séparé et ne pas gâcher d'autres fichiers journaux, vous pouvez utiliser:
au lieu de l'exemple précédent PROMPT_COMMAND, puis configurez rsyslogd selon vos besoins.Par exemple, sur un système Debian, éditez le fichier /etc/rsyslog.conf : changez la ligne:
à et ajoutez la ligne suivante à la fin du fichier:puis exécutez:
la source
Et alors
strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)
? Cela enregistre toutes les sessions ssh. Vous pouvez avoir besoin d'un outil pour analyser le journal ultérieurement, ou simplement utilisergrep
,awk
etc.-f
: retracer des enfants fourchus-ff
: connectez chaque enfant séparément àssh_log.PID
-s8192
: augmenter la limite de journalisation des chaînes (si nécessaire)-T -ttt
: estampillage microseconde en quelques secondes depuis l'époque-p N
: attacher au pidN
la source