Schiebe meine PS1-Eingabeaufforderung über ssh

19

Ich benutze eine bestimmte "PS1" -Aufforderung, die mir gefällt. Ich teile einige Logins mit anderen Leuten auf einigen anderen Servern. Ich habe mich gefragt, ob es eine Möglichkeit gibt, in meinem lokalen Bash-Profil eine Remote-Eingabeaufforderung oder eine andere Möglichkeit als das Kopieren und Einfügen bei jedem Remote-Zugriff anzugeben.

Nicht finanzierte Nuss
quelle

Antworten:

17

Laden Sie auf jedem Remote-Computer eine Datei ~/.my_custom_bashrcmit Ihrer benutzerdefinierten bashKonfiguration hoch (in diesem Fall PS1=...) und starten Sie sie sshmit:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

Sie können leicht eine bashFunktion als Wrapper für die Lesbarkeit verwenden.

cYrus
quelle
10

Wenn Sie die PS1Variable nur senden möchten und sie kein '(einfaches Anführungszeichen) enthält, versuchen Sie Folgendes:

ssh targethost -t "PS1='$PS1'; exec bash"

Das lokale .bashrcüberschreibt möglicherweise PS1(danke an Dennis Williamson für den Hinweis).

Es gibt Möglichkeiten, Umgebungsvariablen über ssh zu übertragen , diese sind jedoch in der Serverkonfiguration normalerweise deaktiviert. Wenn die PermitUserEnvironmentDirektive in der Serverkonfiguration aktiviert ist und jeder Benutzer ein eigenes Schlüsselpaar hat (ja, vielleicht haben Sie nicht so viel Glück), können Sie environment="PS1=…"die Zeile ~/.ssh/authorized_keysentsprechend Ihrem Schlüssel hinzufügen .

Wenn Sie Ihre eigene Konfiguration für ein freigegebenes Benutzerkonto beibehalten möchten, können Sie ein eigenes Konfigurationsdateiverzeichnis erstellen und die HOMEUmgebungsvariable so einstellen , dass sie auf dieses Verzeichnis verweist.

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

Erstellen Sie im mrstatic.homeVerzeichnis symbolische Links, die auf den entsprechenden Eintrag im übergeordneten Verzeichnis verweisen, wenn Sie eine Datei für die anderen Benutzer freigeben möchten.

Dann melde dich an mit

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

Wenn Sie die Fernbedienung .profile(oder eine andere Initialisierungsdatei) ändern möchten, können Sie Ihre Einstellungen möglicherweise automatisieren. Viele Sites lassen LC_*Umgebungsvariablen durch (normalerweise werden sie für Gebietsschemaeinstellungen verwendet). Wenn beide Bedingungen erfüllt sind, können Sie beispielsweise LC_USERauf der Clientseite eine Variable festlegen, die nicht für Gebietsschemas verwendet wird , und diese auf dem Server testen .profile.

(Natürlich sind gemeinsame Konten eine schlechte Idee, aber ich weiß, dass Sie möglicherweise nicht in der Lage sind, diese Situation zu ändern.)

Gilles 'SO - hör auf böse zu sein'
quelle
3
ssh -t user@host "remote='$PS1' bash -i"

Dann an der Eingabeaufforderung:

PS1=$remote
Bis auf weiteres angehalten.
quelle
1
Eine ausgefeilte Bash-Eingabeaufforderung wird wahrscheinlich unterbrochen, wenn sie nicht in Anführungszeichen gesetzt wird (ich bin überrascht, dass Sie sie verwenden). Und warum der zusätzliche Befehl und nicht nur "PS1='$PS1' bash -i"(und warum auch nicht exec)?
Gilles 'SO- hör auf, böse zu sein'
1
@ Gilles: Fehlendes Zitat: Schlamperei. Zusätzlicher Befehl: Es wäre nicht ungewöhnlich PS1, wenn er beim Starten der Shell überschrieben würde. No exec: Während des Testens auf meinem System schien es keinen Unterschied zu machen - kein zusätzlicher Prozess.
Bis auf weiteres angehalten.
1
Oh ja, das ist ein guter Punkt, der .bashrcwahrscheinlich überschrieben wird PS1.
Gilles 'SO- hör auf böse zu sein'
2

Stelle deine PS1-Eingabeaufforderung in ~ / .ssh / environment und ssh session überträgt sie auf jeden Host, den du anmeldest. Es funktioniert bei mir mit openssh 4.3p2.

Valmik
quelle
1
Dies funktioniert nur, wenn die Serverkonfiguration aktiviert wurde PermitUserEnvironment, die standardmäßig deaktiviert ist.
Flimm
1

Sie können Umgebungsvariablen auf der Client-Seite angeben. Wenn der SSH-Server dies zulässt (check man sshd-config), werden diese Variablen in die Sitzung kopiert, wenn Sie sich auf dem Computer anmelden.

Sie müssten also die .bashrc-Datei auf dem Server konfigurieren, um eine vorhandene PS1 (oder eine beliebige Variable) zu überprüfen, und PS1 nur festlegen, wenn sie nicht bereits festgelegt ist.

Oder, um source joes_bashrcdie Arbeit zu vereinfachen, bündeln Sie Ihre Einstellungen in einer Funktion .. und stellen diese Funktion entweder als spezielle Datei Ihrer Quelle auf Anfrage ( ) oder direkt auf der .bashrc bereit. Eine eigene Datei zu haben scheint etwas robuster zu sein. Die anderen Benutzer verwenden möglicherweise Ihre Einstellungen, sind jedoch nicht dazu gezwungen.

Akira
quelle
1

Logins nicht teilen. SSH wie Sie, dann tun sudo -su shareduser( -sbedeutet "Shell").

Stellen sudoSie sicher, dass Sie Ihr Home-Verzeichnis behalten:

Defaults env_keep += "HOME"
Grawity
quelle
Wenn ich befördert werde, werde ich versuchen, diese Richtlinie in Kraft zu setzen, aber im Moment bleibe ich dabei.
Unfundednut
1

Wenn Sie es tun möchten, ohne einen zusätzlichen scp zu benötigen, können Sie so etwas tun:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

Dadurch wird eine .bashrc.n-Datei generiert, die auf der bashrc-Datei des Servers, jedoch mit Ihren Außerkraftsetzungen, basiert.

Neuron
quelle
Aus diesem Grund haben manche Menschen Angst vor Terminals.
0

Wenn Sie bereit sind unmerklich auf Ihren Kollegen zu stören, und Sie können ihnen vertrauen nicht mit Ihrer Präferenz zu stören, dann schlage ich eine Kombination aus Cyruss Antwort , Akiras Antwort und die Antwort von Dennis Williamson .

  1. Bearbeiten ~/.bashrcund hinzufügen Sie auf jedem Server
    if ["$ Unf" = 1] # Spezialcode für Unfundednut
    dann
        PS1 = " (Ihre gewünschte Eingabeaufforderung) "
         (alle anderen gewünschten Anpassungen) 
    fi
    Am Ende. Während Ihre Kollegen "es nicht schätzen würden, über das Basisprofil zu schreiben", werden sie sich dessen nicht bewusst sein, es sei denn, sie suchen danach.
  2. Wenn Sie sich bei einem Remote-Server anmelden, tun Sie Folgendes
    ssh -t Benutzer @ Host "Unf = 1 Bash -i"
    Während Sie das wahrscheinlich in einen Alias ​​oder eine Shell-Funktion in Ihrem lokalen Konto einfügen möchten, ist es kurz genug - kürzer als alle anderen Antworten -, sodass Sie es einfach manuell eingeben können.

Ich glaube, dass dies ziemlich klar ist, aber: Der sshBefehl bewirkt, dass die UnfVariable auf dem Remote-Server festgelegt wird, wenn Sie sich anmelden. Dadurch wird Ihr Code in der Fernbedienung aufgerufen .bashrc, wodurch Ihre Anpassungen wirksam werden. Da Sie Ihren Code am Ende von einfügen .bashrc, werden die allgemeinen Einstellungen zu einem früheren Zeitpunkt in der Datei überschrieben.

Offenlegung: Ich habe dies nicht getestet.

Scott
quelle
-1

Der einfachste Weg ist meiner Meinung nach:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'
Matias Barrios
quelle
Ich bin mir nicht sicher, ob das funktioniert. es scheint eine Schicht von Anführungszeichen zu fehlen. Selbst wenn dies der PROMPT_COMMANDFall ist, scheint das Festlegen (das jedes Mal ausgeführt wird, wenn die Shell eine Eingabeaufforderung ausgibt) eine sehr umständliche Methode zur Lösung dieses Problems zu sein. Und da es etwas geheimnisvoll ist, sollte jede Antwort, die darauf hindeutet, eine Erklärung darüber enthalten, wie es funktioniert.
Scott
-2

Sie könnten Dinge tun, wie das Mounten Ihres Hauses über sshfs / nfs, aber die einfachste Lösung besteht darin, Ihren bashrc auf die neue Maschine zu übertragen. Das bringt auch Aliase und so.

Dentrasi
quelle
Wie ich in meiner Frage festgestellt habe, teile ich diese Logins mit anderen Personen. Ich bin mir ziemlich sicher, dass sie es nicht schätzen würden, wenn ich über das Basisprofil schreibe.
Unfundednut
1
Das Mounten von $ HOME über NFS ist verrückt. Ich sag bloß'.
Wesley Rice