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
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 ssh
in eine Remote-Maschine einsetze.
Ich möchte in der Lage sein, mein Update .profile
so zu aktualisieren, dass es $PS1
bei der lokalen Ausführung ein kompliziertes und beim Ausführen in einer ssh
Sitzung ein kompliziertes einrichtet.
Im Grunde möchte ich so etwas wie eine $AM_I_LOGGED_IN_VIA_SSH
Variable in meinem testen .profile
. Ist das möglich?
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
Wenn Sie Ihre Umgebung (überprüfen env | grep SSH
) finden Sie mehrere Kandidaten wie finden $SSH_CLIENT
, $SSH_CONNECTION
und $SSH_TTY
; Die genaue Liste hängt von der sshd
Version ab.
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.
Wenn diese PermitUserEnvironment
Option in sshd aktiviert ist, können Sie das Vorhandensein eines Werts in Ihrem Skript ~/.ssh/environment
erstellen $PS1
und dann erkennen, der ihn normalerweise festlegt.
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.