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
.
Odpowiedzi:
Zdalny monit jest ustawiany przez pilota
~/.bashrc
. Więc nadal musisz skopiować go na zdalny serwer. Możesz jednak użyć jednego~/.bashrc
dla wszystkich hostów i ustawić kolor zachęty na podstawie nazwy hosta:Uwagi:
Nie ustawiaj,
PS1
jeśli nie jest jeszcze ustawione (tzn. Jeśli powłoka nie jest interaktywna). Testowanie, czyPS1
nie 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$-
zawierai
).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[m
resetuje plan pierwszy i tło do wartości domyślnych. Tutaj:\w
pojawiają się na pierwszym planie / w tle terminala.\[033[48;5;XXXm\033[38;5;YYYm
ustawia tło / pierwszy plan naXXX
/YYY
.W przypadku skryptu, który zrzuca dostępne kolory, spróbuj
colortest
.Aby sprawdzić, jak wyglądałby monit:
źródło
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 anls
lub 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.profile
lub.bashrc
na 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.
źródło
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.
źródło
sshpass -p
jeśli to w ogóle możliwe! Argumenty wiersza poleceń uruchomionych programów są zwykle widoczne dla wszystkich użytkownikówps
, 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.sshpass
potrafi 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.Być może zainteresuje Cię to
context-color
, co opracowałem właśnie w tym celu: https://github.com/ramnes/context-colorJest to prosty skrypt, który po uruchomieniu generuje kolor na podstawie skrótu polecenia. Po zainstalowaniu go gdzieś w twoim domu
$PATH
możesz zrobić coś takiego.bashrc
:(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ć$CONTEXT
zmienne environment (export CONTEXT="hostname"
) lub po prostu użyć--context/-c
opcji (context-color -c "hostname"
).Przykład poniżej:
źródło