Jak uzyskać kolorowy terminal przez ssh?

53

Kiedy łączę się przez ssh ze zdalnymi hostami, wszystko jest tylko jedną czcionką / kolorem. Chciałbym mieć kolory takie jak robię lokalnie, np. Zielony dla pliku wykonywalnego i niebieski dla dowiązań symbolicznych itp. I taki, że kiedy uruchamiam $ git diff na hoście ssh, pokazuje mi diff z kolorami =)

Dima
źródło
Czy to serwer Ubuntu, z którym się łączysz?
Stefano Palazzo
@ stefano-palazzo: do Debiana.
Dima,

Odpowiedzi:

35

Ponieważ na serwerze był xterm, pomyślałem, że coś jest nie tak .bashrc

I rzeczywiście! ls --color=autodziała tylko wtedy, gdy masz połączenie z TTY. Zmiana wszystko po prostu --colorsię .bashrcna zdalnym komputerze i wszystko jest teraz w ładnych kolorach.

Dima
źródło
42
Bardzo pomogłoby to odpowiedzieć, gdybyś powiedział, gdzie wstawisz --color = auto. .bashrc na serwerze? Jakie polecenia?
rfay
8
Ponieważ jest to stare pytanie, które jest nadal aktualne, chciałem tylko dodać, że w systemach Ubuntu, domyślny plik .bashrc zawiera instrukcję case, która określa, które terminy mają dozwolony kolor. Jeśli w swoim pliku .bashrc znajdziesz wiersz „case” $ TERM $ ”w”, dodając „xterm) color_prompt = yes ;;” włączy również kolor. Możesz także odkomentować wiersz „force_color_prompt = yes”, aby zawsze włączać go globalnie.
Mike E
2
to komentarz Mike E. naprawił to dla mnie
Frank Schrijver
3
Jestem zmieszany. Co to znaczy „zmienić wszystko na po prostu - kolor”? Czy mogę zobaczyć przykład?
still_dreaming_1
1
Czy rozmawiacie o lokalnym hoście, zdalnym hoście, czy obu?
Adam
19

To działało dla mnie:

ssh -t my_host my_command

-tbył kluczem. Wyjaśnione .

juanpastas
źródło
Działa to doskonale i jest bardzo wygodne dla zadań jednorazowych. Dzięki!
XtraSimplicity
Straciłem kolorowanie, gdy wykonałem su -polecenie w wierszu połączenia ssh
dubis
10

Wygląda na to, że kolory zostały już ~/.bashrcdla mnie ustawione , a problem polega na tym, że ssh nie używa pliku bashrc. Możesz użyć bashrc w swojej sesji ssh, dodając następujące elementy do ~/.bash_profile:

if [ -f ~/.bashrc ]; then
      . ~/.bashrc
fi
dariusz gorczyński
źródło
1
To działało dla mnie i było prostym i wydajnym sposobem na zrobienie tego!
od
7

Jaka jest zawartość twojej zmiennej env XTERM na serwerze, kiedy się z nią łączysz?

~ > export | grep -i term
TERM=xterm
Vedran Krivokuća
źródło
eksport $ | grep -i term deklaruj -x TERM = "xterm"
Dima
4

W moim przypadku brakująca część miała mieć kolorowe ls, grep itp., Które można dodać, dodając aliasy do pliku .bashrc:

alias ls='ls --color=auto'
alias grep='grep --color=auto'

itp.

Stuart Clark
źródło
2

Próbowałem zmienić ~./bashrcustawienia (zarówno na serwerze lokalnym, jak i zdalnym), ale nie działało.

Potem zauważyłem, że ~/.bashrczdalny serwer nawet nie zostanie wykonany, jeśli połączę się z nim przez ssh. Zrobiłem więc ~/.bashrczdalny serwer do wykonania poprzez umieszczenie go if [ -f ~/.bashrc ]; then . ~/.bashrc fina serwerze zdalnym ~/.bash_profile. (na podstawie https://stackoverflow.com/questions/820517/bashrc-at-ssh-login ).

Zatem to rozwiązanie nie wymagało ~/bashrcbezpośredniej zmiany żadnych plików, ale wymagało zmiany ~/bash_profilepliku zdalnego serwera, aby ~/bashrcplik zdalnego serwera został wykonany.

chris544
źródło
Ubuntu używa .profilei nie .bash_profilejest domyślnie, a domyślnie .profileźródło .bashrc.
muru
To jest poprawne. Ale czy jest .profilewykonywany domyślnie podczas logowania przez ssh?
chris544
Tak. Pod warunkiem, że nie zastąpisz go przy użyciu .bash_profile, bash działa .profilepo uruchomieniu jako powłoka logowania. A SSH zaczyna bash jako powłokę logowania.
muru
To prawda, że ~/.profilenie jest czytany, jeśli ~/.bash_profileistnieje. Ale czy ~/.bash_profiledomyślnie nie istnieje na Ubuntu?
chris544
Zobacz mój pierwszy komentarz jeszcze raz. Nie, nie ma. Używa Ubuntu .profile.
muru
2

Ponieważ kolory działały dobrze podczas bezpośredniego logowania, po prostu odkomentowałem wiersz force_color_prompt=yesw pliku ~/.bashrc, co dało mi również kolory w stosunku do ssh:

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes

(Ubuntu 18.04 LTS)

hinneLinks
źródło
Wydaje się, że jest to najbardziej proste rozwiązanie.
snwflk
1

W mojej sytuacji niedawno zainstalowałem chef-locali poprosił mnie o dodanie linii do .bash_profile. Kiedy się loguję, .bashrcnigdy więcej się nie ładuje, bo zobaczyłem .bash_profile.

Dodałem wiersz w .bash_profile:

source .bashrc
export PATH="/opt/chefdk/embedded/bin:$PATH"

Wylogowałem się, wróciłem i od razu otrzymałem kolorowy terminal.

Kevin
źródło
0

Jest komentarz z „Mike E” powyżej, który zawierał dla mnie odpowiedź, ale nie tylko jest trudny do odczytania, ale trudno jest zrozumieć, co on ma na myśli, jeśli nie używasz .bashrcdużo - a ja nie. t.

Po tym, jak się trochę przekręciłem, uzyskałem pożądane wyniki, zmieniając następujące wiersze ~/.bashrcna komputerze, na którym logowałem się za pomocą ssh:

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

do:

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
    xterm) color_prompt=yes;;
esac

Myślę, że mogłem właśnie dodać „| xterm” po „kolorze” w pierwszym wierszu lub wykopać i dowiedzieć się, dlaczego ssh używał „xterm” zamiast „xterm-color” i to zmienić, ale to działa i ja mam teraz inne rzeczy do zrobienia.

Mike Wise
źródło
0

Traciłem kolor podczas łączenia przez serwer proxy, ponieważ TERM=dumbnaprawiłem go:

ssh myproxy "ssh pi@localhost -p 5000 -tt 'TERM=xterm bash'"
ErichBSchulz
źródło
1
Powinieneś także przydzielić terminal przy pierwszym połączeniu, jeśli masz zamiar to zrobić.
muru