Bash-Aufforderung zum Ändern der Farbe, wenn ich bei einem Server angemeldet bin

15

Gibt es eine Möglichkeit, die Bash-Eingabeaufforderung dynamisch zu gestalten, sodass sie ihre Farbe ändert, wenn sie auf einem Server angemeldet ist?

Daher möchte ich, dass die Farbe auf meinem System grün und auf rot wechselt, wenn eine Verbindung zu Servern besteht. Ich habe eine riesige Anzahl von Servern, auf denen ich nicht anders arbeiten möchte .bashrc.

Nitine
quelle
Wahrscheinlich nicht. Aber zurück zu superuser.com/questions/33712/…
random
1
Warum sollten Sie Ihr Terminal nicht rot (oder in einer anderen Farbe) machen, damit Sie beim Herstellen einer Verbindung ein Standardweiß erhalten?
Wiedereinsetzung von Monica - Aug--

Antworten:

9

Die Remote-Eingabeaufforderung wird von der Fernbedienung festgelegt ~/.bashrc. Sie müssen es also noch auf den Remote-Server kopieren. Sie können jedoch einen einzigen ~/.bashrcfür alle Hosts verwenden und die Eingabeaufforderungsfarbe basierend auf dem Hostnamen festlegen:

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

Anmerkungen:

  • Nicht festlegen, PS1wenn es nicht bereits festgelegt ist (dh, wenn die Shell nicht interaktiv ist). Das Testen, ob PS1nicht leer ist, ist eine sehr häufige Methode, um zu entscheiden, ob die Shell interaktiv ist, und Sie möchten Programme, die dies tun, nicht verwirren. (Vermutlich ist es ein genauerer Test, zu prüfen, ob er $-enthält i.)

  • Wenn Sie möchten, dass dieser Code bei der Anmeldung an einem Remoteserver ausgeführt wird, sollten Sie immer eine der Profildateien als Quelle haben ~/.bashrc. Aber ich nehme an, Sie wissen das.

  • In PS1müssen die Escape-Codes eingeschlossen sein \[...\].

  • \[033[mSetzt Vordergrund und Hintergrund auf Standard zurück. Also hier :\wim Terminal Vordergrund / Hintergrund erscheinen.

  • \[033[48;5;XXXm\033[38;5;YYYmSetzt den Hintergrund / Vordergrund auf XXX/ YYY.

  • Versuchen Sie es mit einem Skript, das die verfügbaren Farben ausgibt colortest.

  • So überprüfen Sie, wie die Eingabeaufforderung aussehen würde:

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

Wenn Sie nicht wollen (können), dass die Fernbedienungen eine separate haben PS1, dann würde ich "nein" sagen, es wäre zumindest schrecklich schwierig. Bedenken Sie, dass die lokale Seite bei einer SSH-Verbindung keine wirkliche Vorstellung davon hat, was eine Shell-Eingabeaufforderung und was etwas anderes ist, und dass das Festlegen der Farben für die Eingabeaufforderung daher wirklich von der Fernbedienung kommen muss. Sie können Farben vor dem Starten der Sitzung festlegen, sie sind jedoch für alle Ausgaben wirksam, dh bis ein lsoder ein Editor eigene Farben festlegt.

Natürlich könnte man sich einen Wrapper für die Sitzung einfallen lassen, um alles, was wie eine Eingabeaufforderung aussieht, zu erkennen und einzufärben, aber es würde leicht zu falschen Positiven führen (Farbe in jeder Zeile mit einem $?) Und wäre schrecklich kompliziert im Vergleich zum Ablegen von a einzelne Linie zu Ihrem .profileoder .bashrcauf jeder Maschine.

Bei einer Reihe von Computern kann es in jedem Fall hilfreich sein, nach Lösungen zu suchen, um Konfigurationsänderungen auf allen Computern zu synchronisieren. Sei es ein Werkzeug, das dafür gemacht wurde, oder einfach ein Skript oder einfach eine Schleife, um eine (Reihe von) Konfigurationsdatei (en) auf alle zu kopieren.

ilkkachu
quelle
2
Dieser letzte Absatz ist der Schlüssel. Wenn OP "eine große Anzahl von Servern" verwaltet, ist es erstaunlich, dass jeder von ihnen zunächst einzeln konfiguriert werden muss.
Leichtigkeit Rennen mit Monica
5

Ich verwende ein Wrapper-Skript mit sshpass, das zuerst ein temporäres Profil und dann ssh mit diesem Profil hochlädt (und die temporäre Datei löscht).

Die zwei Hauptpunkte des Skripts sind:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

Hiermit können Sie einfach die Farben der Remote-Sitzungen definieren.

Ich weiß, dass dies Ihre Frage nicht direkt beantwortet, aber es könnte verwendet werden, um sie zu lösen.

Mikael Kjær
quelle
3
Nicht verwenden, sshpass -pwenn überhaupt möglich! Befehlszeilenargumente für die Ausführung von Programmen sind in der Regel für alle Benutzer in sichtbar. Dies psgilt auch für das Kennwort. Auch wenn Sie keine anderen Benutzerkonten auf dem Gerät haben, können Sie diese versehentlich auf dem Bildschirm ausdrucken. sshpasskann das Kennwort von einer Umgebungsvariablen lesen, die nicht zu schwer zu verwenden ist. Ziehen Sie auch ssh-Schlüssel in Betracht, wenn Sie die Anmeldeinformationen trotzdem in einer Datei speichern möchten.
Ilkkachu
Sie haben Recht und ich habe nicht versucht, die Verwendung zu fördern. Ich habe gerade ein Beispiel aus meinem Skript eingefügt, das nur für Entwicklungszwecke verwendet wird und kein Sicherheitsrisiko darstellt. Die Variable SSHPASS bleibt für Produktionssysteme leer, in denen SSH-Schlüssel verwendet werden. Ich werde aktualisieren.
Mikael Kjær
1

Es könnte Sie interessieren context-color, was ich genau für diesen Zweck zusammengestellt habe: https://github.com/ramnes/context-color

Es ist ein einfaches Skript, das bei der Ausführung eine Farbe basierend auf dem Hash einer Befehlsausgabe ausgibt. Wenn es irgendwo in Ihrem System installiert ist $PATH, können Sie Folgendes in Ihrem System tun .bashrc:

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

(Wo --prompt/-pbefindet sich der Schalter, damit die Farbe für Eingabeaufforderungen maskiert wird, und in \[\e[0m\]der Maskierungssequenz wird die Farbe zurückgesetzt)

Standardmäßig lautet der Befehl zum Generieren des Hashs whoami; hostname. Wenn Sie nur möchten, dass sich die Farbe entsprechend dem Hostnamen ändert, können Sie die $CONTEXTvariable Umgebung ändern ( export CONTEXT="hostname") oder einfach die --context/-cOption verwenden ( context-color -c "hostname").

Ein Beispiel finden Sie unten:

Demo

Ramnes
quelle