J'ai des commutateurs HP auxquels je me connecte via ssh. Les commutateurs envoient une commande de terminal pour désactiver le retour à la ligne ("rmam" dans le langage terminfo), mais ne parviennent pas à le réactiver, ce qui fout mon terminal après avoir quitté la session ssh. Je peux réparer le terminal en exécutant tput smam
.
Existe-t-il un moyen pour que ssh exécute automatiquement cette commande après la fin de ma session ssh?
Cela ne me tuerait pas de l'exécuter en tant que commande automatique du shell ou alias ssh
pour toujours exécuter cette commande par la suite, mais je préférerais résoudre le problème via ssh afin que je puisse limiter la commande à être exécutée après que je me suis connecté à connu -hôtes désagréables.
Mon client ssh est OpenSSH_6.2p2, mais je peux changer ou mettre à jour s'il y a une nouvelle fonctionnalité quelque part.
ssh 1.2.3.4 && tput smam
Réponses:
OpenSSH a une option appelée
LocalCommand
qui exécute une commande côté client lorsque vous établissez une connexion ssh. Malheureusement, il exécute la commande avant l'établissement de la session ssh, pas après. Mais cela m'a donné l'idée que je pourrais d'une manière ou d'une autre obtenir le processus précédent d'attendre la fin de la session ssh. Malgré le fait que le processus ssh soit le PID parent de LocalCommand, il s'avère que ce n'est toujours pas si simple.Cependant, j'ai trouvé quelque chose qui fonctionne pour moi sous MacOS X, et qui devrait fonctionner sur (d'autres) BSD, sinon Linux. J'ai écrit un petit programme C qui utilise l'
kqueue()
interface pour attendre son propre ppid, puis exécuter une commande fournie une fois ce processus terminé. (Liste de code source ci-dessous, pour ceux qui sont intéressés.)Il ne me reste plus qu'à référencer ce programme dans mon
~/.ssh/config
fichier:Et cela semble fonctionner très bien. Ceux d'entre vous sous Linux… Je suppose que vous pouvez essayer le même genre de chose en interrogeant
LocalCommand
le ppid de et en espérant que ce pid ne soit pas réutilisé. (Voir /programming/1157700/how-to-wait-for-exit-of-non-children-processes )wait4parent.c:
la source
Vous pouvez créer un wrapper ssh simple pour cela et spécifier des commandes à exécuter après ssh, par exemple
la source
eval
cela. Il jette l'avantage de la double cotation$@
.