Pousser mon invite PS1 sur ssh


19

J'utilise une invite "PS1" spécifique que j'aime. Je partage quelques identifiants avec d'autres personnes sur quelques serveurs différents. Je me demandais s'il y avait un moyen de spécifier dans mon profil bash local une invite distante, ou tout autre moyen que de copier et coller à chaque fois que je me connecte à distance.

Réponses:


17

Téléchargez un fichier sur chaque machine distante, disons ~/.my_custom_bashrc, avec votre bashconfiguration personnalisée (dans ce cas PS1=...), puis lancez sshavec:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

Vous pouvez facilement utiliser une bashfonction comme wrapper pour la lisibilité.


10

Si vous souhaitez simplement envoyer la PS1variable et qu'elle ne contient pas de '(guillemet simple), essayez:

ssh targethost -t "PS1='$PS1'; exec bash"

Le local .bashrcpourrait bien écraser PS1cependant (merci à Dennis Williamson de l' avoir signalé).

Il existe des moyens de transmettre des variables d'environnement via ssh , mais elles sont généralement désactivées dans la configuration du serveur. Si la PermitUserEnvironmentdirective est activée dans la configuration du serveur et que chaque utilisateur a sa propre paire de clés (oui, vous pourriez ne pas être aussi chanceux), vous pouvez ajouter environment="PS1=…"à la ligne en ~/.ssh/authorized_keyscorrespondant à votre clé.

Si vous souhaitez conserver votre propre configuration sur un compte d'utilisateur partagé, vous pouvez créer votre propre répertoire de fichiers de configuration et définir la HOMEvariable d'environnement pour pointer vers ce répertoire.

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

Créez des liens symboliques dans le mrstatic.home répertoire pointant vers l'entrée correspondante dans le répertoire parent lorsque vous souhaitez partager un fichier avec les autres utilisateurs.

Connectez-vous ensuite avec

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

Si vous souhaitez modifier la télécommande .profile(ou un autre fichier d'initialisation), vous pouvez probablement automatiser vos paramètres. De nombreux sites autorisent LC_*les variables d'environnement (normalement, elles sont utilisées pour les paramètres régionaux). Si ces deux conditions sont remplies, vous pouvez définir une variable qui n'est pas réellement utilisée pour les paramètres régionaux, par exempleLC_USER , côté client, et la tester sur le serveur .profile.

(Bien sûr, les comptes partagés sont une mauvaise idée, mais je me rends compte que vous n'êtes peut-être pas en mesure de changer cette situation.)


3
ssh -t user@host "remote='$PS1' bash -i"

Ensuite, à l'invite:

PS1=$remote

1
Une invite bash sophistiquée risque de se casser si elle n'est pas citée (venant de vous, je suis surpris). Et pourquoi la commande supplémentaire, et pas seulement "PS1='$PS1' bash -i"(et pourquoi pas execaussi)?
Gilles 'SO- arrête d'être méchant'

1
@ Gilles: Citations manquantes: négligence. Commande supplémentaire: il ne serait pas inhabituel PS1d'être écrasé lors du démarrage du shell. Aucun exécutable: lors des tests sur mon système, cela ne semblait pas faire de différence - pas de processus supplémentaire.
pause jusqu'à nouvel ordre.

1
Oh, oui, c'est un bon point, le local .bashrcest susceptible d'écraser PS1.
Gilles 'SO- arrête d'être méchant'

2

Placez votre invite PS1 dans ~ / .ssh / environnement et la session ssh la transmettra à chaque hôte auquel vous vous connectez. Cela fonctionne pour moi avec openssh 4.3p2.


1
Cela ne fonctionne que si la configuration du serveur est activée PermitUserEnvironment, ce qui est désactivé par défaut.
Flimm

1

vous pouvez spécifier des variables d'environnement côté client et si le serveur ssh le permet (vérifiez man sshd-config), ces variables sont copiées dans la session lorsque vous vous connectez à la machine.

ainsi, vous devez configurer le .bashrc sur le serveur pour vérifier une PS1 existante (ou n'importe quelle variable) et ne définir PS1 que si elle n'est pas déjà définie.

ou, ce qui simplifie les choses, vous regroupez vos paramètres dans une fonction .. et déployez cette fonction soit en tant que fichier spécial de votre source à la demande ( source joes_bashrc) ou directement dans le .bashrc. avoir son propre fichier semble un peu plus robuste. les autres personnes peuvent utiliser vos paramètres mais ne sont pas obligées de le faire.


1

Ne partagez pas les connexions. SSH comme vous-même, puis faites sudo -su shareduser( -ssignifie «shell»).

Faites sudogarder votre répertoire personnel:

Defaults env_keep += "HOME"

Lorsque je serai promu, j'essaierai de promulguer cette politique, mais pour l'instant je suis coincé avec cela.
Undundednut

1

Si vous voulez le faire sans avoir besoin d'un scp supplémentaire, vous pouvez faire quelque chose comme ceci:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

Cela générera un .bashrc.n basé sur le serveur bashrc mais avec vos remplacements.


C'est pourquoi certaines personnes ont peur des terminaux.

0

Si vous êtes prêt à s'immiscer dans imperceptiblement sur vos collègues, et vous pouvez leur faire confiance de ne pas interférer avec votre préférence, alors je suggère une combinaison de la réponse de cyrus , la réponse de akira et la réponse de Dennis Williamson .

  1. Sur chaque serveur, modifiez ~/.bashrcet ajoutez
    if ["$ Unf" = 1] # Code spécial pour Unfundednut
    ensuite
        PS1 = " (votre invite souhaitée) "
         (toutes les autres personnalisations que vous souhaitez) 
    fi
    à la fin. Bien que vos collègues «n'apprécieraient pas que vous écriviez sur le profil de base», ils n'en seront pas conscients à moins qu'ils ne le recherchent.
  2. Lorsque vous vous connectez à un serveur distant, faites
    ssh -t utilisateur @ hôte "Unf = 1 bash -i"
    Bien que vous souhaitiez probablement mettre cela dans un alias ou une fonction shell dans votre compte local, il est suffisamment court - plus court que toutes les autres réponses - que vous pouvez facilement saisir simplement manuellement.

Je pense que cela est assez clair, mais: la sshcommande entraîne la Unfdéfinition de la variable sur le serveur distant lorsque vous vous y connectez. Cela invoquera votre code dans la télécommande .bashrc, ce qui mettra en vigueur vos personnalisations. Puisque vous placez votre code à la fin de .bashrc, il remplacera les paramètres généraux plus tôt dans le fichier.

Divulgation: je n'ai pas testé cela.


-1

La façon la plus simple est à mon humble avis:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'

Je ne suis pas sûr que cela fonctionne; il semble manquer une couche de guillemets. Même si c'était le cas, le paramètre PROMPT_COMMAND(qui s'exécute chaque fois que le shell émet une invite) semble être un moyen très difficile de résoudre ce problème. Et, comme il est quelque peu mystérieux, toute réponse suggérant qu'il devrait vraiment avoir une explication de son fonctionnement.
Scott

-2

Vous pouvez faire des choses comme monter votre maison sur sshfs / nfs, mais la solution la plus simple est de scp votre bashrc sur la nouvelle machine. Cela apporte également des alias et des trucs.


Comme je l'ai dit dans ma question, je partage ces identifiants avec d'autres personnes. Je suis sûr qu'ils ne m'apprécieraient pas d'écrire sur le profil de base.
Undundednut

1
Monter $ HOME sur NFS est fou. Je dis juste.
Wesley Rice,
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.