Bash richiede di cambiare colore quando accedo a un server


15

C'è un modo per rendere dinamico il prompt di bash, in modo che cambi colore quando si accede a un server?

Quindi voglio che il colore simile sia verde quando sul mio sistema e cambia in rosso quando è collegato ai server. Ho un numero enorme di server che non voglio mettere diversamente .bashrcsu tutti quelli.


Probabilmente no. Ma torniamo su superuser.com/questions/33712/…
random

1
Perché non rendere il tuo terminale rosso (o qualche altro colore) in modo che quando ti colleghi a loro ottieni un bianco predefinito?
Ripristina Monica - ζ--

Risposte:


9

Il prompt remoto è impostato dal telecomando ~/.bashrc. Quindi è ancora necessario copiarlo sul server remoto. Tuttavia, è possibile utilizzare un singolo ~/.bashrcper tutti gli host e impostare il colore del prompt in base al nome host:

[ "$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

Appunti:

  • Non impostare PS1se non è già impostato (ovvero se la shell non è interattiva). Testare se PS1non è vuoto è un modo molto comune per decidere se la shell è interattiva e non si desidera confondere i programmi che lo fanno. (Probabilmente un test più accurato sta controllando se $-contiene i.)

  • Se si desidera eseguire questo codice quando si accede a un server remoto, è necessario disporre sempre di uno dei file del profilo ~/.bashrc. Ma suppongo che tu lo sappia.

  • In PS1, i codici di escape devono essere racchiusi in \[...\].

  • \[033[mripristina il primo piano e lo sfondo sui valori predefiniti. Quindi qui, :\wappaiono in primo piano terminale / sfondo.

  • \[033[48;5;XXXm\033[38;5;YYYmimposta lo sfondo / primo piano su XXX/ YYY.

  • Per uno script che scarica i colori disponibili, prova colortest.

  • Per verificare l'aspetto del prompt:

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

7

Se non vuoi (non puoi) rendere i telecomandi separati PS1, allora direi "no", sarebbe almeno tremendamente difficile. Considera che su una connessione SSH la parte locale non ha idea reale di cosa sia un prompt della shell e di qualcos'altro, quindi l'impostazione dei colori per il prompt deve davvero provenire dal telecomando. È possibile impostare i colori prima di iniziare la sessione, ma sarebbero efficaci per tutto l'output, fino a quando un lso un editor non imposterà i propri colori.

Ovviamente potresti trovare un wrapper per la sessione per rilevare tutto ciò che sembra un prompt e per colorarlo, ma porterebbe facilmente a falsi positivi (colore su ogni riga con un $?) Ed essere terribilmente complicato rispetto al semplice rilascio di un linea singola per il tuo .profileo .bashrcsu ogni macchina.

Con un numero di macchine, potrebbe essere utile in ogni caso cercare soluzioni per sincronizzare le modifiche di configurazione su tutte. Che si tratti di uno strumento creato appositamente, o solo di uno script, o semplicemente di eseguire un ciclo per copiare un (set di) file di configurazione su tutti.


2
L'ultimo paragrafo è la chiave. Se OP sta gestendo "un numero enorme di server", è sorprendente che ognuno debba essere configurato individualmente in primo luogo.
Corse di leggerezza con Monica,

5

Sto usando uno script wrapper con sshpass che caricherà prima un profilo temporaneo e poi ssh usando questo profilo (ed eliminando il file temporaneo).

Le due cose principali della sceneggiatura sono queste:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

Usando questo puoi definire facilmente i colori delle sessioni remote.

So che questo non risponde direttamente alla tua domanda, ma potrebbe essere usato per risolverlo.


3
Non usare sshpass -pse possibile! Gli argomenti della riga di comando per i programmi in esecuzione sono in genere visibili a tutti gli utenti pse quindi sarà la password. Anche se non si dispone di altri account utente sulla macchina, è possibile stamparlo accidentalmente sullo schermo. sshpasspuò leggere la password da una variabile d'ambiente, che non è troppo difficile da usare. Inoltre, considera le chiavi ssh se vuoi comunque salvare le credenziali di accesso in un file.
ilkkachu,

Hai ragione e non stavo cercando di promuoverne l'uso. Stavo solo incollando un esempio dal mio script che viene utilizzato solo a scopo di sviluppo e non offre alcun rischio per la sicurezza. La variabile SSHPASS verrà lasciata vuota per i sistemi di produzione in cui vengono utilizzate le chiavi ssh. Aggiornerò
Mikael Kjær,

1

Potresti essere interessato context-color, che ho messo insieme per quello scopo preciso: https://github.com/ramnes/context-color

È uno script semplice che, una volta eseguito, genera un colore basato sull'hash dell'output di un comando. Con installato da qualche parte nel tuo $PATH, potresti fare qualcosa del genere nel tuo .bashrc:

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

(dove si --prompt/-ptrova l'interruttore in modo che il colore venga salvato per i prompt e \[\e[0m\]la sequenza di escape per ripristinare il colore)

Per impostazione predefinita, il comando utilizzato per generare l'hash è whoami; hostname. Se vuoi solo cambiare il colore in base al nome host, puoi cambiare l' $CONTEXTambiente variabile ( export CONTEXT="hostname") o semplicemente usare l' --context/-copzione ( context-color -c "hostname").

Vedi sotto per un esempio:

dimostrazione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.