Stellen Sie $ PS1 auf dem lokalen Computer und in der SSH-Sitzung anders ein

9

Ich halte mein Home-Verzeichnis unter Versionskontrolle, so dass meine Grundkonfiguration auf jedem Computer leicht verfügbar ist.

Meine Bash-Eingabeaufforderung auf meinem lokalen Computer ist eine komplizierte, farbenfrohe Sache, die das aktuelle Git-Repository und seinen Status enthält. Aber ich hätte lieber eine einfache user@host ~ $Eingabeaufforderung, wenn ich sshin einen Remote-Computer gehe.

Ich möchte in der Lage sein, meine zu aktualisieren, .profiledamit sie $PS1beim lokalen Ausführen kompliziert und beim Ausführen in einer sshSitzung vereinfacht wird .

Grundsätzlich möchte ich so etwas wie eine $AM_I_LOGGED_IN_VIA_SSHVariable in meinem testen .profile. Ist das möglich?

Will McCutchen
quelle

Antworten:

8

Wenn Sie sich über SSH anmelden, werden mehrere zusätzliche Umgebungsvariablen festgelegt. Sie können diese als Test verwenden, um Ihre PS1 in Ihrem .profile festzulegen.

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi
Caleb
quelle
7

Wenn Sie Ihre Umgebung (überprüfen env | grep SSH) finden Sie mehrere Kandidaten wie finden $SSH_CLIENT, $SSH_CONNECTIONund $SSH_TTY; Die genaue Liste hängt von der sshdVersion ab.

Geekosaurier
quelle
2

Wenn Ihr sshd keine nützlichen Variablen bereitstellt, können Sie verwenden

ps -p $PPID

oder ein anderer zufälliger ps-Trick (wenn Ihre Shell nicht festgelegt ist $PPID), um festzustellen, ob der übergeordnete Prozess der Shell Ihr Remote-Anmeldeprozess ist oder nicht. Dann, wenn Eltern-Fern-Ding sind, wechseln Sie $ PS1. Laden Sie dann OpenSSH herunter und verwenden Sie die Vorschläge von Geekosaur / Caleb, da Ihr SSH-Server Junk ist. ;)

Sie können auch die Ausgabe von "who am i" verwenden, das letzte Feld (dh $( who am i | awk '$0=$NF')) abrufen und überprüfen, ob es sich um einen Remote- oder einen lokalen Host handelt, um zu entscheiden, ob Sie sich lokal oder remote angemeldet haben.

Oder Sie können die Ausgabe von $(hostname)einschalten, damit Ihre Shell auf bestimmten Hosts das entsprechende $ PS1 verwendet.

Oder lassen Sie uns wirklich verrückt werden. Wenn Sie eine moderne Shell wie bash, ksh93 oder zsh verwenden, können Sie die Tatsache nutzen, dass $ PS1 bei der Ausführung neu bewertet wird. Sie könnten also einen bedingten Inline-Block einfügen, um das verrückte Git-Zeug zu erledigen, wenn sich Ihr cwd im Repository befindet und etwas anderes außerhalb. Zum Beispiel nehme ich hier meine Eingabeaufforderung in Abhängigkeit von dem Verzeichnis vor, in dem ich mich [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" )befinde.

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$

Sicher, die $ PS1-Definition wird in Ihrem Profil verrückt aussehen, aber Sie erhalten dann nur dann super buntes Git-Zeug, wenn Sie sich tatsächlich im Git-Repository befinden, während Sie an anderer Stelle normale Farben haben. :) Beachten Sie, dass Sie für die PS1-Zuweisung einfache Anführungszeichen verwenden müssen. Sie möchten nicht, dass die Variablen erweitert werden, wenn PS1 zugewiesen wird. Sie möchten, dass sie erweitert werden, wenn $ PS1 später ausgewertet wird. Also einfache Anführungszeichen.

dannysauer
quelle
1

Wenn PermitUserEnvironmentin sshd aktiviert ist, können Sie einen Wert in Ihrem Skript ~/.ssh/environmenterstellen $PS1und dann erkennen, der ihn normalerweise festlegt.

Ignacio Vazquez-Abrams
quelle
0

Als Ergänzung zu Ignacios Antwort muss zur Verdeutlichung die PermitUSerEnvironmentOption auf der Serverseite aktiviert sein, damit dies funktioniert. Wenn der Server diese Option nicht aktiviert, haben Sie keine farbenfrohe SSH-Sitzung mit diesem Server.

tymik
quelle