Mein Team ist für Tausende von Linux / Unix-Computern verantwortlich, daher wird das Root-Konto natürlich von den Administratoren "geteilt". Ich bevorzuge den vi-Modus, andere bevorzugen den emacs-Modus.
Wie kann ich die Readline von bash bei der SSH-Anmeldung an einem beliebigen Computer auf den vi-Modus setzen, ohne alle anderen dazu zu zwingen, auch den vi-Modus zu verwenden?
Im Wesentlichen möchte ich die Wirkung set -o vi
nach dem Anmelden haben, ohne es jedes Mal eingeben zu müssen und ohne es allen anderen aufzuzwingen (so sehr der Emacs-Modus für mich ärgerlich ist, ist der vi-Modus für sie ärgerlich).
Ich weiß, dass dies kein Problem wäre, wenn jeder seine eigenen Konten bei sudo verwenden würde, um privilegierte Befehle auszuführen, aber aufgrund von Umständen, die außerhalb meiner Kontrolle liegen, ist dies leider keine Option.
set -o vi
bevor ich die Kontrolle über die Shell habe.set -o vi
Befehl senden und dann in den interaktiven Modus wechseln.sshd
richtet der OpenSSH mehrere Umgebungsvariablen ein, anhand derer Sie feststellen können, wer sich am anderen Ende befindet. BeispielsweiseSSH_CLIENT
enthält die Verbindungs IP-Adresse (und den ausgehend / eingehend Port des Clients als auch). Wenn~/.bashrc
Sie damit herumspielen , können Sie möglicherweise Dinge nur für Sie tun .Antworten:
Hier ist eine dumme Methode, die wirklich nur mit der Authentifizierung mit öffentlichem Schlüssel gut funktioniert:
Stellen Sie zunächst sicher, dass Ihr lokaler Computer installiert ist
nc
.Zweitens, noch auf Ihrem lokalen Computer, erstellen Sie ein Skript (ich werde es nennen
connect-to-server
) und platzieren Sie es an einem Ort, den Sie${PATH}
kennen *:Ändern Sie als Nächstes das
.bashrc
auf dem Remote-System, um Folgendes einzuschließen:Bearbeiten Sie schließlich auf Ihrem lokalen Computer Folgendes
~/.ssh/config
:Nachteile dieses Ansatzes (und warum ich es albern nenne):
.yourname
Datei noch nicht gelöscht wurde. In diesem Fall erhält er auch die Dateiset -o vi
.ssh serverNickname command
,command
wird.bashrc
die.yourname
Datei am wichtigsten ausgeführt, aber (da sie nie bezogen wird) bleibt die Datei erhalten. Daher wäre es höflich, einen zweiten Alias in Ihrer SSH-Konfiguration zu haben, der den Pseudo-Proxy nicht verwendet.Tatsächlich besteht der einzige Vorteil dieses Ansatzes darin, dass Ihrem
ssh
Befehl keine zusätzlichen Argumente gegeben werden müssen.* Wenn Sie auf Remote-Systemen nichts ändern müssen, finden Sie hier einen alternativen Pseudo-Proxy, der eine temporäre Datei erstellt
.bashrc
:Dies hat dieselben Nachteile wie die andere Methode, sodass Sie immer noch einen zweiten Alias in Ihrer
ssh
Konfiguration wünschen , der den Pseudo-Proxy nicht aufruft.quelle
Ich würde gehen für:
Aber wenn Sie ein Administrator sind, können Sie etwas saubereres ausprobieren. Sie können beispielsweise die
SendEnv
Option ssh auf der Clientseite verwenden, um eine bestimmte Variable zu übertragen, sieAcceptEnv
in dersshd
Konfiguration (Serverseite) verwenden, um sie zu akzeptieren, und auf dieser Grundlage die Root-.bashrc
Datei ändern , um das Verhalten entsprechend dem Wert der Variablen anzupassen.Dies bedeutet, dass die
sshd
Konfiguration auf allen Hosts sowie auf deren Hosts geändert werden muss.bashrc
. Nicht gerade eine "eigenständige" Methode ...quelle
Für eine einfache clientseitige Lösung:
Dies wird , wenn die Shell Initialisierungsskripts explizit Anwendungen Root fehlschlagen
set -o emacs
oder SätzeEDITOR
zuemacs
, oder wenn root -.initrc
Datei aufruftemacs
Tastenbelegungen.Der Rest dieser Antwort betrifft serverseitige Lösungen.
Dies funktioniert, wenn Sie
ssh
in die Maschine einsteigen und dann Folgendes verwendensudo -i
:Für Ihre
/root/.bashrc
:Auf diese Weise können Sie eine persönliche
bashrc
Datei mit dem Namen erstellen,/root/.bashrc-patrick
in der Sie tun können, was Sie möchtenset -o vi
.Kombinieren Sie dies mit einem etwas naiven Ansatz, um diese RC-Datei aufzunehmen, abhängig von
$SSH_CLIENT
:Dies funktioniert natürlich nur, wenn Sie ständig eine Verbindung von derselben IP-Adresse herstellen ...
Ein anderer Ansatz, der das Kommentarfeld des jeweiligen verwendeten SSH-Schlüssels verwendet und funktioniert, wenn Sie den SSH-Agenten an den Server weiterleiten:
Dadurch wird das Kommentarfeld für den Schlüssel ausgewählt, mit dem Sie eine Verbindung zum Server hergestellt haben. Das
head -n 1
ist da, falls Sie zufällig mehrere Ihrer Schlüssel in derauthorized_keys
Datei haben.Sie können dann
$ssh_comment
eine RC-Datei für die Quelle auswählen, entweder direkt wie beim$SUDO_USER
obigen Ansatz (bei dem der Kommentar in$ssh_comment
möglicherweise bereinigt werden muss, wenn es sich um einen Pfadnamen handelt) oder über einecase
Anweisung wie beim$SSH_CLIENT
Ansatz.quelle
SSH_CLIENT
undSUDO_USER
ist das, was ich derzeit verwende, aber es erfordert serverseitige Änderungen und es ist nicht besonders zuverlässig. Ich hatte auf eine reine clientseitige Lösung gehofft. Vielen Dank für den Vorschlag.Wenn Sie es wirklich ohne Änderungen auf der Serverseite tun möchten, entweder:
1) Führen Sie so etwas wie
Ich denke nicht, dass die Dokumentation dazu zu klar ist, wird aber
-o option
erwähnt und scheint zu funktionieren.2) Verwenden Sie erwarten:
Das
expect
Skript:Machen Sie es ausführbar und führen Sie Folgendes aus:
Dies setzt voraus, dass Sie sich anmelden können, ohne Kennwörter einzugeben (für den Remote-Host oder für Ihre Schlüssel). Andernfalls müsste das Expect-Skript dies berücksichtigen. Aber mit vielen Maschinen haben Sie das wahrscheinlich schon. Außerdem habe ich für ein Dollarzeichen und ein Leerzeichen erwartet , bearbeiten Sie das entsprechend Ihrer Eingabeaufforderung:
"# "
vielleicht.Wenn etwas, das vor der Eingabeaufforderung gedruckt wurde, dieselben Zeichen enthält, müssen Sie der erwarteten Zeichenfolge etwas Spezifischeres hinzufügen.
Außerdem unterstützt dieses Skript keine zusätzlichen Argumente
ssh
. Wenn Sie einen expliziten Befehl zum Ausführen geben möchten, benötigen Sie wahrscheinlich keinen vi-Modus. Wenn Sie jedoch beispielsweise Port-Tunneling benötigen, ist dies möglicherweise ein Problem.Aber auf jeden Fall denke ich wirklich, dass dies auf den Zielsystemen mit separaten Konten (
sudo
oder einfach nur alter UID 0) gelöst werden sollte . Eine personalisierte Konfiguration wäre auch in vielen anderen Fällen nützlich, und im Allgemeinen verfügen Sie über eine Reihe von Konfigurationsdateien und Umgebungsvariablen, die Sie festlegen möchten. (Bedenken Sie, dass sich die Administratoren möglicherweise nicht über den Wert$EDITOR
oder den Inhalt vonvirc
oder was auch immer einig sind .)Auch das Entfernen von Benutzern wäre mit separaten Konten einfacher.
Jede Möglichkeit, Dateien auf allen Hosts zu synchronisieren, würde dies ebenfalls trivial lösen, indem Sie sich mit etwas wie
ssh -t user@host 'patricks_shell.sh'
oder anmelden könnenssh -t user@host 'bash --rcfile patrick.rc'
.quelle
interact
. Es existiert nicht, Eingabeaufforderungen können sehr unterschiedlich sein, ebenso wie die Motds / Ausgaben von Profilen. Vielen Dank für den Vorschlag.Sie können eine benutzerdefinierte RC-Datei gemäß dieser Anleitung erstellen:
Benutzer rc Datei | Secure Shell: Der endgültige Leitfaden
oder fügen Sie eine Befehlszeilenaktion in Ihre Datei "authorized_keys" ein:
SSH-Konfiguration Remote-Befehl automatisch ausführen | Unix & Linux Stack Exchange
quelle