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

4797
Will McCutchen

Ich behalte mein Heimatverzeichnis unter Versionskontrolle, so dass meine grundlegende Konfiguration 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 beinhaltet. Ich hätte jedoch lieber eine einfache user@host ~ $Eingabeaufforderung, wenn ich mich sshin eine Remote-Maschine einsetze.

Ich möchte in der Lage sein, mein Update .profileso zu aktualisieren, dass es $PS1bei der lokalen Ausführung ein kompliziertes und beim Ausführen in einer sshSitzung ein kompliziertes einrichtet.

Im Grunde möchte ich so etwas wie eine $AM_I_LOGGED_IN_VIA_SSHVariable in meinem testen .profile. Ist das möglich?

9

5 Antworten auf die Frage

8
Caleb

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 
7
geekosaur

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.

2
dannysauer

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

ps -p $PPID

oder einen anderen zufälligen ps-Trick (wenn Ihre Shell nicht festgelegt ist $PPID), um zu sehen, ob der übergeordnete Prozess der Shell Ihr Remote-Login-Prozess ist oder nicht. Dann, wenn Parent-is-remote-thingie $ PS1 wechseln. 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 auswählen (dh $( who am i | awk '$0=$NF')) und prüfen, ob der Host ein Remote oder Local ist, um zu entscheiden, ob Sie sich lokal oder remote angemeldet haben.

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

Oder lassen Sie uns wirklich verrückt werden. Wenn Sie eine moderne Shell verwenden, wie bash, ksh93 oder zsh, können Sie die Tatsache nutzen, dass $ PS1 bei der Ausführung neu bewertet wird. Sie könnten also einen Inline-Bedingungsblock hinzufügen, um die verrückten Git-Sachen zu erledigen, wenn sich Ihre cwd im Repository befindet und etwas anderes außerhalb. Zum Beispiel nehme ich hier an, dass meine Eingabeaufforderung [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" )grundsätzlich von dem Verzeichnis abhängt, in dem ich mich 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 nur dann wirklich farbenfrohe Gitarren-Sachen, 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-Zuordnung 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.

1
Ignacio Vazquez-Abrams

Wenn diese PermitUserEnvironmentOption in sshd aktiviert ist, können Sie das Vorhandensein eines Werts in Ihrem Skript ~/.ssh/environmenterstellen $PS1und dann erkennen, der ihn normalerweise festlegt.

0
tymik

As an addition to Ignacio's answer, to make things clear, PermitUSerEnvironment option must be enabled on server side for this to work. If server doesn't enable this option, you won't have colorful ssh session with that server.