Comment voir les commandes exécutées dans un autre shell?

9

Existe-t-il un moyen de voir quelles commandes sont exécutées dans un autre shell, pendant leur exécution? Les deux shells sont bash, et j'ai un accès root, si cela importe. Je ne peux pas installer de logiciel supplémentaire, et je ne veux pas que l'autre shell doive faire quelque chose de spécial comme l'écran d'exécution.

Situation: je suis connecté à distance sur une machine Linux, tout comme un collègue. J'aimerais voir les commandes qu'elle exécute dans sa coquille. Je sais que je pourrais utiliser une combinaison de watchet pspour voir toutes les commandes qui prennent plus d'une seconde à s'exécuter, mais je ne pense pas que cela aiderait avec des commandes très courtes.

Tom Panning
la source
5
les commandes intégrées telles que kill, et cdne génèrent pas de sous-processus et n'apparaîtront jamais dans la sortie ps.
jordanm
@jordanm Merci, c'est un bon point. Même avec juste les commandes qui provoquent un fork / exec, ce serait probablement suffisant.
Tom Panning

Réponses:

7

Puisque vous êtes root, vous pouvez toujours strace -f -e execve -p her_bash_pid. Le -fest nécessaire car son shell va lancer un nouveau processus avant le exec, mais cela signifie également que vous verrez tout ce que les processus enfants exécutent également.

Jim Paris
la source
Merci, la sortie de strace pour exec la rend assez lisible. Je suis sûr que le fait qu'il continue de suivre des enfants d'enfants me troublera un jour, mais pour l'instant je pense que je serai en sécurité. Il est dommage qu'il n'y ait aucun moyen de se détacher automatiquement d'un processus après avoir appelé exec.
Tom Panning
C'est open source; vous pouvez toujours ajouter cette fonctionnalité si vous en avez vraiment besoin. :) Ou ajoutez un script légèrement plus intelligent analysant la sortie strace qui ignore un PID une fois qu'il execest.
Jim Paris
5

Si votre collègue peut modifier certains paramètres d'historique pour leur shell bash, vous pouvez obtenir ces informations à partir de tail -f /home/user/.bash_history. Voici le paramètre dont vous aurez besoin pour que .bash_history soit écrit après chaque commande, plutôt qu'à la sortie du shell:

export PROMPT_COMMAND="history -a"
shopt -s histappend

Je considérerais une session d'écran comme une solution "idéale".

jordanm
la source
5

Après une recherche rapide (et quelques réflexions), je peux vous donner la liste suivante des options possibles:

  • lire son bash_history. Mais il n'est généralement écrit qu'à la déconnexion. askubuntu.com a publié un article sur la modification de ce comportement ( modifier : @jordanm avait apparemment la même idée et était plus rapide à publier ...).
  • Si elle était sur un terminal physique (/ dev / ttyX), vous pourriez utiliser le programme conspy.
  • Faites-lui usage screen. Si vous voulez simplement l'aider et ne pas l'espionner, elle pourrait vouloir exécuter sa session à l'intérieur de l'écran. Vous pouvez ensuite simplement attacher à sa session ensudo -u herUsername screen -x
  • Vous pouvez écrire un script wrapper shell qui enregistre les commandes dans un fichier journal de votre choix. Vous devez définir son shell sur ce script (ce n'est qu'une idée, cela pourrait ou non fonctionner).
  • L'utilisation a cat /dev/pts/X | tee /dev/pts/Xété la première chose qui m'est venue à l'esprit. Mais après l'essai ne fonctionne pas vraiment et c'est une solution très sale. Chaque caractère n'est imprimé que sur l'un des terminaux connectés (ce qui est également la raison de l'appel tee). En l'essayant, je pouvais espionner chaque deuxième personnage. Avec un peu d'imagination, vous pouvez deviner ce qu'elle fait ...
mreithub
la source
mal: conspy ne fonctionne pas avec ttys
Zibri
3

L'écran GNU est à ce jour la meilleure mention de l'OMI. Si l'écran GNU (ou tmux) n'est pas disponible, faites exécuter votre collègue script -f.

Et puis vous pouvez regarder ce qu'elle fait en faisant tail -fn +0 /path/to/typescript.

Stéphane Chazelas
la source
0

Pour partager un terminal d'écran Unix, afin que vous puissiez voir les entrées et sorties de votre collègue en temps réel, utilisez la screencommande Unix .

  1. Vous et le collègue vous connectez en tant que même utilisateur Unix dans ssh
  2. Vous tapez la commande

    screen -d -m -S myscreenname

    screen -x myscreenname

    (Bien sûr, remplacez myscreenname par ce que vous voulez que le nom d'écran soit).

  3. Le collègue tape la commande

    screen -x myscreenname

  4. Pour terminer avec le partage de vos terminaux Unix, chaque personne peut taper la commande

    exit

La grande fonctionnalité de l'écran est que vous pouvez taper des commandes depuis votre terminal Unix et que le collègue peut voir la sortie sur son écran. C'est un excellent moyen de faire l'administration des paires et de guider les administrateurs juniors Unix.

Jirawat Uttayaya
la source
0

Pour compléter la réponse de @ jordanm ... si vous utilisez tous les deux le même compte utilisateur, c'est-à-dire la sortie de

echo $HOSTNAME
echo $USER 

est la même chose pour vous et votre collègue, alors nous pouvons nous amuser.

Nous pouvons permettre la visualisation des commandes invoquées dans un terminal pour être instantanément disponible dans un autre

Si vous invoquez historydans votre terminal, vous voyez vos commandes précédentes. Par défaut, bash écrit son historique à la fin de chaque session dans a ~/.bash_history file, écrasant le fichier existant avec une version mise à jour. Cela signifie que si vous êtes connecté avec plusieurs sessions bash, seule la dernière à quitter aura son historique enregistré.

-------------------------------------------------- -----

Modifiez votre ~/.bashrcet ajoutez-y

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

history -aajoute à ~/.bash_historydéposer immédiatement au lieu de à la fin de la session

history -c efface l'historique de session en cours

history -rlit le ~/.bash_historyfichier auquel nous avons ajouté, dans notre historique de session

Remarque: le PROMPT_COMMANDparamètre contient des commandes qui sont exécutées avant chaque nouvelle invite de commandes. donc command1 ne sera sauvegardé dans l'historique que lorsque command2 sera exécuté

Vous souhaiterez peut-être également frapper un horodatage à côté de chaque commande pour plus de commodité lors de l'affichage de l'historique. Encore une fois, modifiez votre ~/.bashrcet ajoutez

export HISTTIMEFORMAT="%d/%m/%y %T "

Aussi un bon hack si vous aimez utiliser plusieurs terminaux et que votre historique des commandes est disponible :)

Plus d'informations

frère-bilo
la source