Invite basique pour changer de couleur lorsque je suis connecté à un serveur

15

Existe-t-il un moyen de dynamiser l'invite bash afin qu'elle change de couleur lorsqu'elle est connectée à un serveur?

Je veux donc que la couleur soit verte lorsque sur mon système et passe au rouge lorsqu'elle est connectée aux serveurs. J'ai un grand nombre de serveurs que je ne veux pas mettre sur un autre .bashrc.

nitines
la source
Probablement pas. Mais revenons-y superuser.com/questions/33712/…
aléatoire
1
Pourquoi ne pas rendre votre terminal rouge (ou une autre couleur) afin que lorsque vous vous connectez à eux, vous obtenez un blanc par défaut?
Rétablir Monica - ζ--

Réponses:

9

L'invite à distance est définie par la télécommande ~/.bashrc. Vous devez donc toujours le copier sur le serveur distant. Cependant, vous pouvez utiliser un seul ~/.bashrcpour tous les hôtes et définir la couleur d'invite en fonction du nom d'hôte:

[ "$PS1" ] || return 0                           # continue only when interactive
case $(hostname -s) in
laptop*)
    prompt_color='\033[48;5;16m\033[38;5;46m'    # green(46) on black(16)
    ;;
server*)
    prompt_color='\033[48;5;16m\033[38;5;196m'   # red(196) on black(16)
    ;;
esac
ORIG_PS1=$PS1                                    # in case needed
PS1='<\['${prompt_color}'\]\h\[\033[m\]:\w>\$ '
unset prompt_color

Remarques:

  • Ne définissez pas PS1s'il n'est pas déjà défini (c'est-à-dire si le shell n'est pas interactif). Tester si PS1n'est pas vide est un moyen très courant de décider si le shell est interactif, et vous ne voulez pas confondre les programmes qui le font. (On peut dire qu'un test plus précis vérifie s'il en $-contient i.)

  • Si vous souhaitez que ce code s'exécute lorsque vous vous connectez à un serveur distant, l'un des fichiers de profil doit toujours être source ~/.bashrc. Mais je suppose que vous le savez.

  • Dans PS1, les codes d'échappement doivent être inclus \[...\].

  • \[033[mréinitialise le premier plan et l'arrière-plan par défaut. Alors ici, :\wapparaissez dans le premier plan / arrière-plan du terminal.

  • \[033[48;5;XXXm\033[38;5;YYYmdéfinit l'arrière-plan / premier plan sur XXX/ YYY.

  • Pour un script qui sauvegarde les couleurs disponibles, essayez colortest.

  • Pour vérifier à quoi ressemblerait l'invite:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
Matei David
la source
7

Si vous ne voulez pas (ne pouvez pas) faire en sorte que les télécommandes soient séparées PS1, alors je dirais «non», ce serait au moins terriblement difficile. Considérez que sur une connexion SSH, le côté local n'a aucune idée réelle de ce qu'est une invite de shell et de quoi d'autre, et donc la définition des couleurs pour l'invite doit vraiment provenir de la télécommande. Vous pouvez définir des couleurs avant de démarrer la session, mais elles seraient efficaces pour toutes les sorties, c'est-à-dire jusqu'à ce qu'un lsou un éditeur définisse ses propres couleurs.

Bien sûr, vous pourriez trouver un wrapper pour la session pour détecter tout ce qui ressemble à une invite et le coloriser, mais cela conduirait facilement à des faux positifs (couleur sur chaque ligne avec un $?) Et serait terriblement compliqué par rapport à la simple suppression d'un ligne unique vers votre .profileou .bashrcsur chaque machine.

Avec un certain nombre de machines, il peut être utile dans tous les cas de rechercher des solutions pour synchroniser les modifications de configuration sur chacune d'entre elles. Que ce soit un outil conçu pour cela, ou simplement un script, ou simplement exécuter une boucle pour copier un (ensemble de) fichier (s) de configuration sur tous.

ilkkachu
la source
2
Ce dernier paragraphe est la clé. Si OP gère "un grand nombre de serveurs", il est étonnant que chacun doive être configuré individuellement en premier lieu.
Courses de légèreté avec Monica
5

J'utilise un script wrapper avec sshpass qui téléchargera d'abord un profil temporaire puis ssh en utilisant ce profil (et supprimera le fichier temporaire).

Les deux choses principales du script sont les suivantes:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

En utilisant cela, vous pouvez facilement définir les couleurs des sessions distantes.

Je sais que cela ne répond pas directement à votre question, mais cela pourrait être utilisé pour le résoudre.

Mikael Kjær
la source
3
Ne pas utiliser sshpass -psi possible! Les arguments de ligne de commande pour exécuter des programmes sont généralement visibles par tous les utilisateurs de ps, et le mot de passe aussi. Même si vous n'avez pas d'autre compte utilisateur sur la machine, vous pouvez l'imprimer accidentellement sur l'écran. sshpasspeut lire le mot de passe à partir d'une variable d'environnement, ce qui n'est pas trop difficile à utiliser. En outre, pensez aux clés ssh si vous souhaitez de toute façon enregistrer les informations de connexion dans un fichier.
ilkkachu
Vous avez raison et je n'essayais pas d'en promouvoir l'utilisation. Je viens de coller un exemple de mon script qui n'est utilisé qu'à des fins de développement et ne présente aucun risque pour la sécurité. La variable SSHPASS sera laissée vide pour les systèmes de production où les clés ssh sont utilisées. Je mettrai à jour.
Mikael Kjær
1

Vous pourriez être intéressé par context-colorce que j'ai rassemblé dans ce but précis: https://github.com/ramnes/context-color

Il s'agit d'un script simple qui, lorsqu'il est exécuté, génère une couleur basée sur le hachage d'une sortie de commande. Une fois installé quelque part dans votre $PATH, vous pourriez faire quelque chose comme ceci dans votre .bashrc:

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(où --prompt/-pest le commutateur pour que la couleur soit échappée pour les invites, et \[\e[0m\]la séquence d'échappement pour réinitialiser la couleur)

Par défaut, la commande utilisée pour générer le hachage est whoami; hostname. Si vous voulez juste que la couleur change en fonction du nom d'hôte, vous pouvez changer l' $CONTEXTenvironnement variable ( export CONTEXT="hostname") ou simplement utiliser l' --context/-coption ( context-color -c "hostname").

Voir ci-dessous pour un exemple:

démo

ramnes
la source