Comment exécuter automatiquement des commandes sur la connexion SSH?

18

Chaque fois que je me connecte à mon serveur Linux, j'aimerais que plusieurs commandes s'exécutent automatiquement (définir certaines variables, changer d'emplacement, etc.)

Cela doit être fait lors de la connexion de l'utilisateur, pas au démarrage du système.

Comment puis-je le configurer pour ce faire?

Alasdair
la source
Vous devez lire la section INVOCATION dans bash (1) ( man bash).
Andrew Schulman,

Réponses:

31

Mettez les commandes ~/.bashrc. Tout ce qui s'y trouve est exécuté à chaque fois que vous vous connectez.

Si vous avez besoin de commandes à exécuter uniquement lorsque vous vous connectez via ssh (mais pas lorsque vous vous connectez physiquement), vous pouvez probablement tester la présence de la SSH_CONNECTIONvariable d'environnement et exécuter les commandes uniquement si vous constatez qu'elle existe.

David Z
la source
Je ne me connecte pas en tant que root, c'est un serveur AWS, je dois donc me connecter en tant qu'utilisateur "ec2" puis passer en root en utilisant "sudo su -". Dois-je donc mettre les commandes dans "/home/ec2-user/.bashrc"?
5
Cela suppose que ~ / .bashrc provient de votre ~ / .bash_profile. ~ / .bash_profile sera le script qui est invoqué pour un shell de connexion comme ssh. Je crois que ~ / .bashrc sera appelé si vous ouvrez un terminal Gnome, par exemple, APRÈS avoir déjà ouvert une session.
dgrant
Vous m'avez confondu, laissez-moi vous expliquer davantage: il s'agit d'une instance d'Amazon Web Services, qui est pratiquement un serveur, donc personne ne se connectera jamais physiquement (je ne suis même pas sûr qu'il existe physiquement comme une seule machine). Je me connecte en utilisant PUTTY avec le nom d'utilisateur ec2-user. Cela me dépose dans le répertoire / home / ec2-user. Je passe ensuite à l'utilisateur root en tapant "sudo su -", qui me dépose ensuite dans "/ root", puis je dois taper une série de commandes, y compris en me remettant sur "/ home / ec2-user" et en définissant certains variables, alias, etc. Alors ... comment pourrais-je le faire?
De plus, comme je change d'utilisateur, je m'attends à ce que dans le profil bash ec2-user je ne mette que "sudo su -", puis le reste des commandes dans le fichier bash racine?
REMARQUE: en fait, c'est .profile qui est appelé s'il existe, sauf si .bash_profile existe, alors il est appelé à la place.
Dgrant
14

Mettez-le simplement dans ~ / .bashrc ou /etc/bash.bashrc si vous le souhaitez pour tous les utilisateurs:

if [[ -n $SSH_CONNECTION ]] ; then
    echo "I'm logged in remotely"
fi
Llamageddon
la source
et comment puis-je perdre la session après avoir fermé l'exécution?
e-info128
1
@WHK Qu'entendez-vous par perdre la session?
Llamageddon
@Llamageddon: Je pense qu'il se demande la même chose que moi. Si je voulais mettre toute ma session SSH dans screen, je pourrais utiliser votre réponse et screeny mettre à la place de l'écho. Le problème est que la fin de la session écran reviendra à l'invite SSH au lieu de se déconnecter. Le simple fait d'écrire ce commentaire m'a donné la réponse, cependant: ajoutez la logoutcommande après la screencommande.
zondo
Cependant, cela ne fonctionne pas pour les sessions ssh qui n'utilisent pas bash, par exemple lorsque j'ouvre une session sftp.
Fabio
@zondo @ e-info128 exec commandremplacera le shell actuel par tout ce que vous exécutez.
Llamageddon
6

Vous pouvez également spécifier une commande à exécuter lors de l'appel de ssh:

$ ssh -t server 'cmd; exec bash -l'

La dernière commande de la liste devrait démarrer une session interactive dans votre shell préféré. Si vous avez beaucoup de commandes à exécuter, envisagez de créer un fichier de script sur votre serveur SSH.

Dmitry Grigoryev
la source
1
C’est très utile. Je ne sais pas si c'est exactement la réponse de l'interrogateur, mais les gens devraient le savoir, car cela peut ne pas être évident. Par exemple, "ssh user @ host" export x = 5; bash "Puis dans le terminal qui apparaît, écho $ x affiche 5.
clearlight
3

En fait, ~/.ssh/rcc'est un bon endroit pour vous d'ajouter une commande à exécuter lorsque vous vous connectez, plutôt que n'importe quel utilisateur du système.

 ~/.ssh/rc
         Commands in this file are executed by ssh when the user logs in,
         just before the user's shell (or command) is started.  See the
         sshd(8) manual page for more information.
ruisseau hong
la source
Pas nécessairement. C'est un endroit où les commandes peuvent être placées.
Daniel B
Cela pourrait vraiment causer des ennuis à quelqu'un s'il ne savait pas ce qu'il faisait. C'est potentiellement utile dans les cas d'angle, mais cela pourrait vraiment gâcher quelqu'un s'il oublie d'y mettre des commandes ou le nom et le chemin de ce fichier. Généralement, il serait hautement préférable de placer les commandes de connexion de démarrage à l'emplacement attendu, .bashrc sur le côté distant et de tester $ SSH_CONNECTION, comme d'autres réponses ici l'ont suggéré.
clearlight