Comment utiliser un fichier .bashrc personnalisé lors de la connexion SSH

21

J'ai découvert qu'avec la nouvelle société avec laquelle je travaille, je dois souvent accéder à des serveurs Linux avec des durées de vie relativement courtes. Sur chacun de ces serveurs, j'ai un compte, mais chaque fois qu'un nouveau est créé, je dois passer par les tracas du transfert sur mon .bashrc. Il est cependant possible que dans environ un mois, ce serveur ne soit plus là. Je dois également accéder à de nombreux autres serveurs pendant de courtes périodes (minutes) où cela ne vaut tout simplement pas la peine de transférer sur mon .bashrc mais comme je travaille sur beaucoup de serveurs, cela représente beaucoup de temps perdu.

Je ne veux rien changer sur les serveurs, mais je me demandais s'il y avait un moyen d'avoir un .bashrc "par connexion", donc chaque fois que je SSH vers un serveur mes paramètres seraient utilisés pour cette session.

Si cela est possible, ce serait bien si je pouvais faire la même chose avec d'autres fichiers de configuration, comme les fichiers gitconfig.

gsingh2011
la source
Ce n'est pas une solution par connexion, mais vous pouvez toujours la trouver utile. Découvrez la base sur GitHub. Plus de détails dans cette réponse sur la communauté Super User.
codeforester le

Réponses:

6

Je pense que ce que vous voulez est (dans votre .ssh / config sur la machine à partir de laquelle vous vous connectez):

PermitLocalCommand yes
LocalCommand scp yourname@someserver:/dir/dotbash /local/home/dir/.bashrc

alors vous pouvez débuter avec:

source .bashrc

et soyez sur votre joyeux chemin. LocalCommand exécute la commande sur le serveur auquel vous vous connectez quand il y arrive, juste avant votre session réelle.

Je voudrais également m'assurer que les sshds sur les serveurs sont configurés avec le PermitLocalCommand yes

Il existe de nombreuses façons de modifier cette commande locale pour la faire fonctionner dans votre environnement spécifique - vous pouvez boucler à partir d'un serveur Web interne ou tirer à partir d'un montage nfs par exemple.

Quinn Murphy
la source
Quelques notes. Tout d'abord, je pense que vous avez changé l'ordre des fichiers dans la commande scp, car je veux transférer mon bash vers le serveur, et je pense que vous l'avez inversé. Deuxièmement, vous pouvez simplement ajouter ; source /path/to/.bashrcaprès la commande scp pour qu'il soit généré automatiquement. Enfin, un inconvénient peu important de cette méthode est que je dois taper mon mot de passe deux fois. Mais à la fin, cela a fonctionné, alors merci.
gsingh2011
Désolé pour ça! Travaillait hors de ma tête, donc désolé pour le mélange. Êtes-vous en mesure de configurer des configurations de clé sans mot de passe dans votre environnement? Nous avons cela dans notre environnement et c'est une belle chose. Heureux que cela ait fonctionné!
Quinn Murphy
@ gsingh2011: Cela source /path/to/.bashrcsera exécuté sur la machine à partir de laquelle vous vous connectez. Les commandes dans LocalCommandn'ont pas accès à la session ssh.
Oliver
@Oliver Vous avez raison. Je me suis contenté d'automatiser l'approvisionnement du .bashrc à partir de l'ordinateur distant. Je dois changer quelques éléments côté serveur lors de la première connexion, mais c'est beaucoup plus pratique que ce que je devais faire auparavant.
gsingh2011
16

Je pense que sshrc est ce que vous recherchez: https://github.com/Russell91/sshrc

sshrc fonctionne exactement comme ssh, mais il source également ~ / .sshrc après s'être connecté à distance.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Vous pouvez l'utiliser pour définir des variables d'environnement, définir des fonctions et exécuter des commandes post-connexion. C'est aussi simple que cela, et cela n'aura pas d'impact sur les autres utilisateurs du serveur - même s'ils utilisent également sshrc. Pour une configuration plus avancée, continuez à lire.

RussellStewart
la source
Veuillez arrêter le spam avec les publications contenant uniquement des liens. Vous êtes parfaitement en mesure d'ajouter des commentaires (quels que soient vos messages liés à sshrc, de toute façon).
Deer Hunter
3
Je travaille à les réparer tous!
RussellStewart
Terminé. La première fois, j'avais été tenté de rédiger un court article contenant uniquement des liens. Maintenant je sais mieux.
RussellStewart
1
J'ai écrit il y a longtemps (avant sshrc) un sshrc similaire: github.com/fsquillace/pearl-ssh Il est juste plus efficace, petit et sans dépendances xxd.
user967489
1

Si vous n'avez jamais touché le serveur auparavant, il n'y aura aucune entrée dans ~ / .ssh / known_hosts pour cela.

Vous pouvez rechercher un hôte connu donné avec "ssh-keygen -F", mais vous devrez tester cette sortie (grep) car ssh-keygen ne renvoie pas false pour un échec. Notez que si vous faites référence à un hôte par différents identifiants (adresse IP, nom d'hôte, nom de domaine complet), ces derniers sont traités comme des instances distinctes.

Vous pouvez écrire un wrapper pour ssh qui transfère votre environnement utilisateur vers cet hôte lors de la première connexion:

ssh-newenv () {si! ssh-keygen -F $ 1 | grep -q "^ # hôte $ 1 trouvé:"; puis rsync ~ / .bashrc ~ / .bash_profile ~ / .bash_logout $ 1:.; Fi; ssh $ 1; }

Si vous souhaitez rendre cela plus robuste, vous pouvez vérifier l'existence d'un fichier d'environnement, d'un hachage ou d'un autre marqueur connu sur l'hôte distant.

Dr Edward Morbius
la source
0

Je ne sais pas s'il y a un .bashrc par session.

Une autre solution serait d'écrire un petit script qui transfère toutes vos configurations préférées vers votre nouveau dossier personnel.

Peut-être juste créer un dossier avec toutes vos configurations avec des chemins et simplement les transférer avec scp

comme

/home/foobar/configs/.bashrc
/home/foobar/configs/.foo/bar.conf
...

puis un

scp -r /home/foobar/configs/* foo@example.com:/home/foo/

Cela fait gagner du temps.

Christopher Perrin
la source
0

Je ne pense pas que ce soit possible, étant donné que ssh n'a rien à voir avec le vôtre .bashrc. C'est le shell qui charge ce fichier, pas ssh.

Quelques idées:

  1. Configurez votre répertoire personnel distant lors de votre première connexion.
  2. Utilisez NFS pour monter votre répertoire personnel contenant votre .bashrc sur chaque serveur. De cette façon, vous avez les mêmes paramètres partout.
  3. Si vous êtes d'accord avec seulement quelques variables d'environnement transmises aux serveurs distants, vous devriez vérifier l' SendEnvoption (voir la ssh_configpage de manuel pour plus d'informations). Si le serveur est correctement configuré (c.- AcceptEnvà-d. Qu'il a la valeur adéquate dans sshd_config), vous pouvez utiliser SendEnvpour copier vos variables d'environnement sur l'hôte distant.
  4. Je ne sais pas si cela fonctionne, mais vous pouvez peut-être mal utiliser le ProxyCommandparamètre (voir la ssh_configpage de manuel) pour envoyer vos .bashrcfichiers ou d'autres avant de vous connecter à l'hôte distant. Cela nécessiterait cependant des tests. Soyez également prêt à ce que cela puisse interférer avec scp.
Oliver
la source
0

Je pense que https://github.com/fsquillace/pearl-ssh fait ce dont vous avez besoin.

Je l'ai écrit il y a longtemps avant la naissance de sshrc et il a plus d'avantages que sshrc:

  • Il ne nécessite pas de dépendances sur xxd pour les deux hôtes (qui peuvent ne pas être disponibles sur l'hôte distant)
  • Pearl-ssh utilise un algorithme d'encodage plus efficace
  • C'est juste ~ 20 lignes de code (vraiment facile à comprendre!)

Par exemple:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit
user967489
la source