Bash monit o zmianę koloru, gdy jestem zalogowany na serwerze

15

Czy istnieje sposób, aby dynamiczny komunikat bash był dynamiczny, aby zmieniał kolor po zalogowaniu do serwera?

Chcę więc, aby podobny kolor był zielony, gdy w moim systemie, i zmienił się na czerwony, gdy podłączony do serwerów. Mam ogromną liczbę serwerów, na których nie chcę inaczej .bashrc.

nitiny
źródło
Prawdopodobnie nie. Ale wracając do tego superuser.com/questions/33712/…
losowo
1
Dlaczego nie zmienić twojego terminalu na czerwony (lub inny kolor), aby po podłączeniu do niego uzyskać domyślną biel?
Przywróć Monikę - ζ--

Odpowiedzi:

9

Zdalny monit jest ustawiany przez pilota ~/.bashrc. Więc nadal musisz skopiować go na zdalny serwer. Możesz jednak użyć jednego ~/.bashrcdla wszystkich hostów i ustawić kolor zachęty na podstawie nazwy hosta:

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

Uwagi:

  • Nie ustawiaj, PS1jeśli nie jest jeszcze ustawione (tzn. Jeśli powłoka nie jest interaktywna). Testowanie, czy PS1nie jest pusty, jest bardzo częstym sposobem decydowania, czy powłoka jest interaktywna, i nie chcesz mylić programów, które to robią. (Prawdopodobnie dokładniejszym testem jest sprawdzenie, czy $-zawiera i).

  • Jeśli chcesz, aby ten kod był uruchamiany podczas logowania do zdalnego serwera, powinieneś mieć zawsze jeden plik profilu zawsze źródłowy ~/.bashrc. Ale zakładam, że o tym wiesz.

  • W PS1, kody ucieczki muszą być zawarte w \[...\].

  • \[033[mresetuje plan pierwszy i tło do wartości domyślnych. Tutaj :\wpojawiają się na pierwszym planie / w tle terminala.

  • \[033[48;5;XXXm\033[38;5;YYYmustawia tło / pierwszy plan na XXX/ YYY.

  • W przypadku skryptu, który zrzuca dostępne kolory, spróbuj colortest.

  • Aby sprawdzić, jak wyglądałby monit:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
Matei David
źródło
7

Jeśli nie chcesz (nie możesz) uczynić pilotów osobnymi PS1, powiedziałbym „nie”, byłoby to co najmniej okropnie trudne. Weź pod uwagę, że w przypadku połączenia SSH strona lokalna nie ma rzeczywistego pojęcia o tym, co to jest monit powłoki i co jest czymś innym, dlatego też ustawianie kolorów dla monitu naprawdę musi pochodzić z pilota. Możesz ustawić kolory przed rozpoczęciem sesji, ale będą one skuteczne dla wszystkich danych wyjściowych, to znaczy dopóki an lslub edytor nie ustawi własnych kolorów.

Oczywiście możesz wymyślić jakieś opakowanie na sesję, aby wykryć wszystko, co wygląda jak monit i pokolorować, ale z łatwością doprowadziłoby to do fałszywych trafień (kolor w każdej linii z $?) I byłoby strasznie skomplikowane w porównaniu do zwykłego upuszczenia pojedyncza linia do twojego .profilelub .bashrcna każdym komputerze.

W przypadku wielu komputerów przydatne może być poszukiwanie rozwiązań umożliwiających synchronizację zmian konfiguracji na wszystkich z nich. Może to być narzędzie stworzone do tego, po prostu skrypt, lub po prostu uruchomiona pętla, aby skopiować na nich wszystkie pliki konfiguracyjne.

ilkkachu
źródło
2
Ten ostatni akapit jest kluczem. Jeśli OP zarządza „ogromną liczbą serwerów”, to zadziwiające, że każdy z nich musi być skonfigurowany indywidualnie.
Lekkość ściga się z Moniką
5

Używam skryptu opakowania z sshpass, który najpierw prześle profil tymczasowy, a następnie ssh za pomocą tego profilu (i usunie plik tymczasowy).

Dwie główne rzeczy skryptu to:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

Za pomocą tego możesz łatwo zdefiniować kolory sesji zdalnych.

Wiem, że to nie odpowiada bezpośrednio na twoje pytanie, ale może być wykorzystane do jego rozwiązania.

Mikael Kjær
źródło
3
Nie używaj, sshpass -pjeśli to w ogóle możliwe! Argumenty wiersza poleceń uruchomionych programów są zwykle widoczne dla wszystkich użytkowników ps, podobnie jak hasło. Nawet jeśli nie masz żadnych innych kont użytkowników w urządzeniu, możesz przypadkowo wydrukować je na ekranie. sshpasspotrafi odczytać hasło ze zmiennej środowiskowej, co nie jest zbyt trudne w użyciu. Rozważ także klucze ssh, jeśli i tak chcesz zapisać dane logowania do pliku.
ilkkachu
Masz rację i nie próbowałem promować tego. Właśnie wkleiłem przykład z mojego skryptu, który jest używany tylko do celów programistycznych i nie stanowi zagrożenia bezpieczeństwa. Zmienna SSHPASS pozostanie pusta dla systemów produkcyjnych, w których używane są klucze ssh. Zaktualizuję.
Mikael Kjær
1

Być może zainteresuje Cię to context-color, co opracowałem właśnie w tym celu: https://github.com/ramnes/context-color

Jest to prosty skrypt, który po uruchomieniu generuje kolor na podstawie skrótu polecenia. Po zainstalowaniu go gdzieś w twoim domu $PATHmożesz zrobić coś takiego .bashrc:

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

(gdzie --prompt/-p jest przełącznik, dzięki czemu kolor jest zastępowany monitami, a \[\e[0m\]sekwencja zmiany znaczenia resetuje kolor)

Domyślnie polecenie użyte do wygenerowania skrótu to whoami; hostname. Jeśli chcesz, aby kolor zmieniał się zgodnie z nazwą hosta, możesz zmienić $CONTEXTzmienne environment ( export CONTEXT="hostname") lub po prostu użyć --context/-copcji ( context-color -c "hostname").

Przykład poniżej:

próbny

ramnes
źródło