chargement dynamique d'alias de shell dans la session ssh

24

Lorsque je me connecte à une machine en utilisant ssh, je souhaite que mes alias et fonctions soient là. En d'autres termes, connectez-vous à une machine que je souhaite pouvoir utiliser mes raccourcis de commande.

J'ai besoin que ce soit dynamique, chaque fois que je me connecte, je souhaite avoir des alias mis à jour.

Remarques: Très souvent, c'est la première fois que vous vous connectez, sans connaître la machine et les fichiers. Parfois, il s'agit d'une seule connexion. Une seule fois pour cette machine. Il doit être nettoyé par la suite, la configuration précédente doit également être restaurée.

Tomek Wyderka
la source

Réponses:

18

Vous pouvez temporairement copier votre .bashrcsur votre ordinateur distant sous un autre nom. Par exemple, en utilisant .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

Ensuite, vous pouvez vous connecter à la machine distante:

user@local$ ssh user@remote

et sourcele fichier .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Vous pouvez maintenant utiliser votre .bashrcet vos fonctions. Lorsque vous avez terminé votre travail, vous pouvez supprimer le fichier ~ / .bashrc_temp sur la machine distante et vous déconnecter.

La copie du fichier et la connexion à la machine distante peuvent être réalisées avec une fonction bash:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Mise à jour :

Vous pouvez également envisager de copier le .bashrcà /tmpvotre machine distante et la source /tmp/.bashrc_temp.

Mise à jour 2 :

Vous pouvez vous connecter à la machine distante à l'aide de ssh -t . Cela utilisera automatiquement votre temp .bashrc. Fonction mise à jour s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}
jens-na
la source
C'est définitivement ce que je recherche. Merci! Mais est-il possible de le faire plus fonctionnel? En une seule étape? Parce que maintenant, nous avons besoin de 3 étapes: se connecter, source, supprimer avant de se déconnecter.
OK, je vois maintenant après votre mise à jour. Génial. Encore une correction: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"
J'ai ajouté votre correctif à ma mise à jour 2. Merci.
5
Presque toutes les réponses (y compris celle-ci) utilisent un nom de fichier prévisible dans /tmp/. Cela peut être exploité par n'importe quel autre utilisateur pour exécuter n'importe quel code en tant qu'utilisateur qui se connecte. Cela devrait être utilisé mktemppour s'assurer que le fichier temporaire a un nom unique.
Tometzky
9

jens-na a fourni une excellente réponse. J'ai passé un peu de temps et l'ai retravaillé un peu pour mieux travailler un tout petit peu. De cette façon, vous pouvez transmettre n'importe quel paramètre à SSH, comme les numéros de port. La différence est qu'il utilise la sshcommande pour télécharger le .bashrcfichier, au lieu de scp, qui utilise des noms de paramètres de commande différents.

Vous remarquerez également qu'il télécharge un fichier différent .bashrc_remote, de sorte que vous pouvez sélectionner exactement ce que vous souhaitez source sur des serveurs distants, au lieu de tout

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Exécutez-le comme suit:

sshs user@server

Le nom « sshs» est pour «SSH Source». À utiliser sshlorsque vous ne voulez pas source, et à utiliser sshslorsque vous le souhaitez.

https://gist.github.com/jonahbron/5549848

Jonas
la source
C'est utile. Le même ensemble de paramètres, pas besoin d'ajouter d'entrée à ~ / .ssh / config juste pour spécifier un port différent non!
Tomek Wyderka
Comme il s'agit du même nom de commande, il est peut-être possible de le faire en une seule fois et de taper le mot de passe une seule fois ... Malheureusement, joindre vos commandes en un seul rapport:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka
@TomekWyderka Oui, j'ai essayé pendant environ 20 minutes de le ramener à une seule commande, mais je n'ai pas trouvé de moyen. Peut-être une personne plus avertie de BASH que je ne pourrais le comprendre, mais cela ne semble pas être possible.
Jonah
2
J'ai pris cette réponse et l'ai répétée sur quelques semaines. Le résultat est un outil complet qui écrase le problème: github.com/Russell91/sshrc
RussellStewart
1
@Jonah pouvez-vous m'expliquer pourquoi vous avez utilisé $ {*: 1} au lieu de $ @.
RussellStewart
8

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
Agréable. J'aime le hack xxd!
Tomek Wyderka
@Tomek - oui le hack xxd est complètement génial. J'ai vraiment essayé de faire le travail avec scp. Puis avec des tuyaux dans ssh. Cela ne peut tout simplement pas être fait sans 2 appels au serveur - 2 entrées de mot de passe - 2 aller-retour. C'était inacceptable. J'ai donc fait l'impensable.
RussellStewart
J'ai un bug. sshrc se bloque sans réponse. Pouvez-vous mettre du code de débogage (peut être dans les commentaires) dans sshrc afin que je puisse le retrouver.
Tomek Wyderka
Intéressant. C'est juste un script bash, donc généralement toutes les erreurs ou avertissements lancés seront automatiquement imprimés à l'écran. Combien d'octets se trouvent dans votre .sshrc.d? Tapez également vim $(which sshrc)et vous pourrez voir le fichier bash. Vous pouvez ajouter des commandes d'écho après chaque ligne pour voir où elle se bloque.
RussellStewart
5

Je ne suis pas sûr des limites, mais j'ai pu faire fonctionner cela avec quelque chose comme:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"
Brad
la source
C'est la meilleure réponse pour moi car c'est une seule commande ssh, pas de trucs scp. La seule amélioration restante pour moi serait de trouver un moyen d'éviter la RC_DATAvariable.
Sridhar Sarnobat
2

C'est ce que j'ai trouvé. Il vous permet de maintenir un fichier rc normal, mais aussi de tout faire en une seule connexion ssh (c'est-à-dire que vous n'avez besoin de vous connecter qu'une fois plutôt que de faire un scp en premier).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Je ne suis pas sûr de la taille de ce fichier rc, car il pourrait atteindre son maximum à un moment donné.

mlathe
la source
J'ai dû encapsuler une partie de la commande entre guillemets simples pour que cela fonctionne correctement. echo '' base64 .... sh` '- après cela, cela a fonctionné à merveille. Merci!!
K Robinson
Si la taille devient un problème, vous pouvez diriger le contenu du fichier via un utilitaire de compression comme gzip avant l'encodage base64.
K Robinson
2

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
1

Une option pour le faire fonctionner avec une seule session SSH consiste à utiliser une variable pour stocker votre fichier bash au lieu de le copier.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Semble fonctionner pour moi.

gibsop1
la source
1

Je cherchais à résoudre un problème comme le vôtre et j'ai réalisé que ce que je cherchais vraiment était sshfs. Peut-être que vous pouvez aussi l'utiliser?

Mon problème était que lors de ssh'ing, je souhaitais conserver mes couleurs, alias, fonctions et scripts tout en travaillant à distance.

http://fuse.sourceforge.net/sshfs.html

Déifié
la source
Lol, cela ne m'est jamais venu à l'esprit non plus. C'est une solution assez créative.
Sridhar Sarnobat