Ustaw $ PS1 inaczej na komputerze lokalnym i w sesji ssh

9

Trzymam swój katalog domowy pod kontrolą wersji, aby moja podstawowa konfiguracja była łatwo dostępna na dowolnym komputerze.

Mój wiersz poleceń bash na moim komputerze lokalnym to skomplikowana, kolorowa rzecz, która obejmuje bieżące repozytorium git i jego stan. Ale wolę mieć prosty user@host ~ $wiersz polecenia, gdy sshprzechodzę do komputera zdalnego.

Chciałbym móc zaktualizować mój, .profiletak aby był skomplikowany $PS1podczas uruchamiania lokalnego i uproszczony podczas uruchamiania w sshsesji.

Zasadniczo chciałbym $AM_I_LOGGED_IN_VIA_SSHprzetestować coś w rodzaju zmiennej .profile. Czy to jest możliwe?

Will McCutchen
źródło

Odpowiedzi:

8

Podczas logowania przez SSH ustawianych jest kilka dodatkowych zmiennych środowiskowych. Możesz użyć ich jako testu do ustawienia PS1 w .profile.

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi
Caleb
źródło
7

Jeśli zaznaczysz swoje środowisko ( env | grep SSH) znajdziesz kilku kandydatów, takich jak $SSH_CLIENT, $SSH_CONNECTIONi $SSH_TTY; dokładna lista zależy od sshdwersji.

geekozaur
źródło
2

Jeśli twój sshd nie dostarcza użytecznych zmiennych, możesz użyć

ps -p $PPID

lub inną losową sztuczkę ps (jeśli twoja powłoka nie jest ustawiona $PPID), aby sprawdzić, czy proces macierzysty powłoki jest procesem zdalnego logowania, czy nie. Następnie, jeśli rodzic-zdalny-rzecz-przełącznik $ PS1. Następnie pobierz OpenSSH i skorzystaj z sugestii geekozaura / Caleba, ponieważ twój serwer ssh jest śmieci. ;)

Możesz też użyć danych wyjściowych „kim jestem”, złapać ostatnie pole (tj. $( who am i | awk '$0=$NF')) I sprawdzić, czy host jest zdalny, czy lokalny, aby zdecydować, czy zalogowałeś się lokalnie, czy zdalnie.

Lub możesz włączyć wyjście, $(hostname)aby powłoka używała odpowiedniego $ PS1 na określonych hostach.

Albo naprawdę zwariujmy. Jeśli używasz nowoczesnej powłoki - jak bash, ksh93 lub zsh, możesz skorzystać z faktu, że $ PS1 jest ponownie wyceniany po wykonaniu. Więc możesz dołączyć wbudowany blok warunkowy, aby zrobić szalone rzeczy z git, jeśli twój cwd znajduje się w repozytorium, a coś innego na zewnątrz. Na przykład tutaj wprowadzam szybką zmianę w zależności od katalogu, w którym jestem, używając [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" ), w zasadzie.

default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$

Jasne, definicja $ PS1 będzie wyglądać szalona w twoim profilu, ale wtedy otrzymasz super-kolorowe-git-rzeczy tylko wtedy, gdy faktycznie jesteś w repozytorium git, podczas gdy masz normalne kolory gdzie indziej. :) Pamiętaj, że musisz używać pojedynczych cudzysłowów wokół zadania PS1. Nie chcesz, aby zmienne były rozszerzane, gdy przypisany jest PS1; chcesz je rozwinąć, gdy $ PS1 zostanie oszacowany później. Więc pojedyncze cudzysłowy.

dannysauer
źródło
1

Jeśli PermitUserEnvironmentjest włączony w sshd, możesz użyć go ~/.ssh/environmentdo utworzenia, $PS1a następnie po prostu wykrycia w skrypcie wartości, która normalnie ją ustawia.

Ignacio Vazquez-Abrams
źródło
0

Jako dodatek do odpowiedzi Ignacio, aby było jasne, PermitUSerEnvironmentnależy włączyć opcję po stronie serwera, aby to zadziałało. Jeśli serwer nie włączy tej opcji, nie będziesz mieć kolorowej sesji ssh z tym serwerem.

tymik
źródło