Wie bring ich .vimrc herum, wenn ich SSH?

34

Meine Arbeit besteht in der Regel darin, SSH zu verwenden, um eine Verbindung zu verschiedenen Computern herzustellen, und dann vim zu verwenden, um Dateien auf diesen Computern zu bearbeiten. Das Problem ist, dass ich meine .vimrc-Datei ständig kopieren muss. Es ist sehr ärgerlich, vim zu öffnen und keine Einstellungen zu haben. Kann ich meine vim-Einstellungen von Maschine zu Maschine mitnehmen, ohne sie manuell überall hin zu kopieren?

Apreche
quelle
@ duffbeer703: Ja, wie set background=darkoder set background=light, etwas, das keine Linux-Distribution berührt und für den Benutzer völlig unauffällig ist. </ sarcasm>
Hubert Kario
Ich bin der Meinung, dass dies theoretisch möglich ist, ohne die Antworten gelesen zu haben, da ssh-agent und x-term übertragen werden können. Diese werden jedoch speziell von ssh behandelt .
Analyse

Antworten:

24

Ich fühle deinen Schmerz. Ich habe alle meine ~ /.* rc-Dateien unter Versionskontrolle (Subversion). Seitdem ich 1998 mit CVS angefangen habe, hat es großartig funktioniert. Eine Möglichkeit, dies zu tun, besteht darin, alle Ihre RC-Dateien wie folgt auszuchecken, wenn Sie in Ihrem Home-Verzeichnis stehen:

svn co svn+ssh://user@host/path/to/repo/trunk/home/user .
A    .signature
A    .vimrc
A    .bashrc
A    .screenrc
A    .psqlrc
[...]
Checked out revision 7645.

Auf diese Weise werden die Konfigurationsdateien auch auf den verschiedenen Computern synchronisiert und aktualisiert, wenn Sie svn update ausführen.

sunny256
quelle
3
Ich denke, das ist so gut wie es nur geht. Der Trick ist, dass ich ein Repository auf einem Computer einrichten muss, auf den von allen anderen Computern aus zugegriffen werden kann. Bei einer sicheren Netzwerktopologie ist das nicht immer einfach.
Apreche,
Ich habe vor kurzem damit angefangen, es ist erstaunlich. Ich weiß nicht, wie ich ohne sie überlebt habe.
Richo
5
Verwenden Sie möglicherweise git oder ein anderes verteiltes Versionskontrollsystem. In diesem Fall reicht es aus, auf einen Computer zuzugreifen, auf dem die Konfigurationsdateien ausgecheckt sind.
ptman
44

Anstatt .vimrc auf jeden Server zu bringen, an dem Sie arbeiten müssen, können Sie die Remote-Dateien von Ihrem lokalen vim aus bearbeiten:

Führen Sie in vim / gvim Folgendes aus:

:e scp://[email protected]//path/to/document

oder starte vim so:

vim scp://[email protected]//path/to/document

Dadurch wird die Datei nahtlos geöffnet (sie kopiert die Datei tatsächlich lokal) und beim Speichern wird die bearbeitete Datei für Sie an den Server zurückgesendet.

Sie werden nach einem SSH-Kennwort gefragt, das jedoch über SSH-Schlüssel optimiert werden kann.

Wie andere bereits erwähnt haben, ist der einzige Nachteil dieser Methode, dass Sie keine Pfad- / Dateikonkurrenz erhalten, wie Sie es tun würden, wenn Sie direkt auf dem Computer arbeiten.

Weitere Informationen finden Sie im folgenden Tutorial .

Tom Feiner
quelle
+1 für den scp: // -Hinweis, aber ich denke, diese Lösung könnte etwas umständlich sein, wenn Sie den Pfad jedes Mal kopieren müssen, wenn Sie eine Datei bearbeiten.
Mittwoch,
1
Ja, das ist zu umständlich. Ich muss viel auf den Remote-Rechnern stöbern, um die gewünschten Dateien zu finden, und muss sie oft mit sudo-Rechten bearbeiten.
Apreche
+1 Das funktioniert wirklich gut für mich. Danke :)
Darragh Enright
Es gibt Fälle, in denen Sie sich bei einem Hauptserver anmelden müssen (login.example.com) und von dort aus bei einem lokalen Server anmelden müssen (top.secret.example.com)
puk
Es funktioniert gut, wenn Sie die entfernte Dateistruktur in Ihr lokales Verzeichnis einhängen, zum Beispiel mit fusermount.
Relet
18

Sie können ein Bash-Skript erstellen, um es bei jeder Anmeldung automatisch zu kopieren:

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

Sie können es zum Beispiel ssh_vim nennen. Es ist keine ideale Lösung, sondern löst Ihr Problem.

Sie können es verbessern, um zunächst zu überprüfen, ob es bereits vorhanden ist. Wenn Sie ssh nicht immer auf demselben Computer ausführen, können Sie das Skript ändern, um die Datei von scp von einem anderen Computer abzurufen.

EDIT1

In diesem Zusammenhang können Sie auch das Dateisystem des Remote-Computers mit sshfs mounten. Auf diese Weise profitieren Sie von Ihrer Umgebung und Ihren Tools (nicht nur .vimrc), und Sie verfügen über eine Shell-Vervollständigung (die Sie mit scp: // nicht verwenden können).

EDIT2

Ich habe gerade herausgefunden, dass Sie Ihre .vimrc-Datei mit scp: // wie folgt erstellen können:

:source scp://you@your_computer//yourpath/.vimrc

Dies funktioniert von der vim-Befehlszeile aus, aber im Moment weiß ich nicht, wie ich es automatisieren soll. Es scheint weder mit der Option '-u' noch mit .vimrc noch mit $ VIMINIT zu funktionieren.

EDIT3

Ich habe es gefunden! Sie können dies tun, um vim mit einer .vimrc-Datei zu starten, die Sie von Ihrem Referenz-Host bezogen haben:

vim -c ':source scp://you@your_computer//yourpath/.vimrc'

Die Option '-c' führt den Befehl direkt nach dem Start von vim aus.

Sie können einen Alias ​​in der Shell Ihrer Wahl erstellen, um das Eingeben zu vermeiden. In Bash wäre es so:

alias vim="vim -c ':source scp://you@your_computer//yourpath/.vimrc'"
chmeee
quelle
2
Dies funktioniert nur , wenn der Computer , den Sie ssh'ing in kann an den Computer anschließen zurück Sie ssh'ing aus . Dies ist beispielsweise nicht immer der Fall, wenn sich Ihr Computer hinter NAT befindet.
Trysis
10

Wenn Sie die Public-Key-Authentifizierung verwenden, können Sie diese in folgenden Situationen verwenden ~/.ssh/config:

Host *
   PermitLocalCommand yes
   LocalCommand bash -c 'scp -P %p %d/.vimrc %u@%n: &>/dev/null &'

Mir gefällt es besser als der oben vorgeschlagene Skript-Trick, da er den Aufruf des sshBefehls nicht beeinträchtigt (wenn zusätzliche Parameter usw. angegeben werden).

omribahumi
quelle
das ist das beste. Für mich musste ich ändern %u@%n:, %r@%n:weil der SSH-Benutzername von meinem Laptop-Benutzernamen abweicht
Moshe
4

Einige Lösungen:

1) Erstellen Sie eine NFS-Freigabe für Ihren Basisordner und ordnen Sie sie an mehreren Orten zu.

2) Erstellen Sie ein kleines Skript, um Ihre .vimrc-Datei mit einer Identitäts- / Schlüsseldatei an den Server zu senden, zu dem Sie eine Verbindung herstellen. Es könnte ungefähr so ​​aussehen (Pseudocode):

connectString = arg0  #username@ipaddress

scp -i ~/.ssh/indentity connectString:~/ ~/.vimrc
ssh -i ~/.ssh/indentity connectString
Moshen
quelle
1
SSH-Schlüssel lösen das Problem mit dem Klartext-Passwort.
LiraNuna
Mit welchem ​​Tool würden Sie eine NFS-Freigabe erstellen?
Wadih M.
@LiraNuna - scheinbar hast du mich erwischt, bevor ich meinen "duh" -Moment hatte und meinen Beitrag bearbeitet. @Wadih - NFSD wird normalerweise auf nix-Systemen standardmäßig installiert. Sie können auch (normalerweise) standardmäßig NFS-Freigaben bereitstellen.
Moshen,
1
Die gemeinsame Nutzung von NFS ist eine gute Idee, wird jedoch wahrscheinlich nur eingeschränkt in der Lage sein, solche Dinge
bereitzustellen
Du bist richtig ericslaw. Ich bin davon ausgegangen, dass es sich um mehrere Maschinen in einem einzigen Netzwerk handelt.
Moshen
4

Die exakt gleiche Antwort wie sunny256, aber benutze git anstelle von SubVersion.

Behalten Sie einen Hauptzweig mit den Dateien bei, die für alle Computer gelten, und einen Zweig für jeden neuen Computer.

Auf diese Weise können Sie auf den meisten Computern fast die gleichen Dateien haben und sind dennoch nicht zu verwirrt.

Johan
quelle
+1 Eine kleine Frage: Ich frage mich, ob es besser ist, externe Definitionen für die gemeinsamen Dateien in Subversion zu verwenden. Auf diese Weise können Sie sie an einem Ort haben und zu jeder Filiale holen
Eugene Yarmash
3

Ich weiß, dass dies ein alter Thread ist, aber eine Möglichkeit, wie ich es tue, ist die Verwendung von sshfs, mit dem das Dateisystem über Fuse gemountet wird. Das lokale VIM übernimmt die gesamte Bearbeitung, sodass es keinen Grund gibt, die .vimrc-Datei zu kopieren.

Dies hat den Nachteil, dass ein anderes Terminal für alle Befehle geöffnet sein muss, die auf dem Remote-Server ausgeführt werden müssen, aber für die Bearbeitung finde ich diesen Weg am besten.

Es hat auch den zusätzlichen Vorteil, dass die System-Zwischenablage verwendet werden kann.

exussum
quelle
2

Ich verwalte meine Punktedateien mit https://github.com/andsens/homeshick und speichere sie auf github.

Homeshick ist zu 100% in Bash geschrieben und hilft Ihnen beim Verwalten von "Burgen", die nur Git-Repos sind, die ein / home / -Verzeichnis enthalten. Es verfügt über Befehle, um vorhandene Punktedateien in das Repo zu verschieben und durch Symlinks zu ersetzen. Und um alle Dateien im Repository mit Ihrem Home-Verzeichnis auf einem neuen Computer zu verknüpfen.

Die allgemeine Idee ist also, Ihre Punktedateien in einem Versionskontrollsystem zu belassen und sie vom realen Pfad aus mit Symlinks zu verknüpfen. Auf diese Weise muss Ihr Repo nicht von Ihrem Heimatverzeichnis ausgehen und eine Menge Dateien enthalten, die Sie niemals hinzufügen möchten.

Aaron McMillin
quelle
Können Sie über den Link einige Informationen hinzufügen? Das würde die Antwort verbessern und Informationen liefern, wenn der Link bricht.
Dave M
1
Ich erklärte einige der Operation und Argumentation. Ich habe beim Kopieren der Dokumentation keinen Wert gesehen.
Aaron McMillin
1

Wenn Sie so sind wie ich und aus verschiedenen Gründen viele Entwicklungsmaschinen (auch virtuelle Maschinen) haben, können Sie SSH-Schlüssel, ein intelligentes bash_profile und ein RCS Ihrer Wahl kombinieren.

Ich würde zweitens nfs / samaba / sshfs verwenden. Ein Nachteil ist, dass Sie, wenn Sie nicht ständig über Netzwerkzugriff verfügen, nicht auf das zugreifen können, was Sie benötigen (Fliegen, kein WLAN, Firewalls, Routing-Probleme usw.). Die Maschinen, die ich synchron halte, sind nicht alle gleichzeitig erreichbar, aber ich möchte Informationen zwischen ihnen austauschen.

Im Folgenden beschreibe ich, wie ich viele Ideen aus dem Internet entlehnt habe.

.bash_profile könnte so etwas haben

$HOME/bin/shell_ssh_agent

Ich habe das von ein paar Stellen bekommen, kann aber jetzt keinen Link dazu finden. Die Datei shell_ssh_agent:

#!/bin/bash

SSH_ENV=$HOME/.ssh/environment

#echo "starting"

function start_agent {
    #echo "reaping agents"
    killall ssh-agent
    #echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
    #echo succeeded
    chmod 600 ${SSH_ENV}
    . ${SSH_ENV}
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
    . ${SSH_ENV}
    #echo "sourced ssh env"
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null || { start_agent; }
else
    start_agent;
fi

Jetzt beim ersten Login richten Sie Ihre Schlüssel ein. Logge dich aus und wieder ein und es hat dir das Leben einfacher gemacht.

Platzieren Sie alle Ihre Skripte in einem RCS, um die Synchronisierung der Entwicklungsmaschinen zu vereinfachen. Ich benutze Git. Die Authentifizierung mit git erfolgt über ssh, daher helfen auch hier ssh-Schlüssel. Beachten Sie, dass Sie an dieser Stelle so etwas wie nfs hätten verwenden können. Ich wäre immer noch ein Fan eines RCS aus einem Grund, den ich unten erwähne.

Der Anwendungsfall ist

  1. Beim ersten Anmelden werden die Schlüssel eingerichtet
  2. Wenn RCS nicht eingerichtet ist, überprüfen Sie Ihre persönlichen Skripte (und aktualisieren / zusammenführen, wenn nötig, dies könnte sogar Teil Ihres .bash_profile sein, wenn Sie es möchten).
  3. Bearbeiten Sie vimrc, spezielle Skripte usw. und legen Sie sie fest
  4. Wenn Sie auf einem anderen Computer angemeldet sind, führen Sie ein Update / Zusammenführen / Auschecken durch. Dies hält alles synchron; dh Sie kopieren keine Dateien mehr, über die Sie manchmal stapfen und die Sie nicht wollten.
  5. Als Nebeneffekt erhalten Sie die Leistung eines RCS. Ich nehme manchmal ungünstige Änderungen an Skripten oder Konfigurationen vor und muss ein Rollback und dergleichen durchführen.

Als nächstes möchte ich versuchen, das erste Login / Setup in ein Makefile zu packen, das ich auf den neuen Rechner kopiere. Das Makefile kann dann die Aufgabe übernehmen, Ihre Schlüssel, RCS usw. einzurichten. Offensichtlich ist hier ein gewisser Overhead zu verzeichnen, aber wenn Sie am Ende viele Maschinen einrichten, ist dies:

  1. ein Zeitsparer
  2. Es ist einfacher, die Konfigurationen und persönlichen Skripte von Entwicklungsmaschinen synchron zu halten
  3. Verwaltung von Änderungen an Skripten und Konfigurationen.
rev
quelle
1

Ich verwende ein Makefile mit einer Liste aller Server, auf denen ich mich anmelde. Wenn ich auf meinem lokalen Computer eine Änderung vornehme, wird make mit dem Makefile automatisch ausgeführt, wodurch alle Server mit Änderungen oder Plugins aktualisiert werden

Lloyd Moore
quelle
Scheint eher eine ausgefallene Art, ein Drehbuch zu schreiben. Make ist großartig, wenn eine Datei aus einer anderen erstellt wird, aber ich würde es nicht gerne in einer Situation verwenden, in der jede Regel ein " .PHONY." ist
Anthony
1

sshrc löst dieses Problem. Sie geben Ihre .vimrc in ~ / .sshrc.d / ein und fügen export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"sie dann zu `/.sshrc hinzu.

Alexander Garden
quelle
1

Ich habe ein einfaches Tool dafür geschrieben, mit dem Sie Ihre .vimrc-Datei nativ transportieren können, wenn Sie ssh verwenden , indem Sie die in SSHd integrierten Konfigurationsoptionen auf eine nicht standardmäßige Weise verwenden.

Keine zusätzliche svn, scp, copy/pasteusw. erforderlich.

Es ist einfach, leicht und funktioniert standardmäßig mit allen Serverkonfigurationen, die ich bisher getestet habe.

https://github.com/gWOLF3/viSSHous

Glenn W
quelle
0

Verwendung der Variablen VIMINIT:

export VIMINIT='set number'

und Weiterleiten an Remote-Server:

ssh remoteuser@remoteserver -o SendEnv=LC_VIMINIT -t 'export VIMINIT=$LC_VIMINIT && bash'

ist einfach mit .bash_profiles oder .bashrc

export VIMINIT='
set number
'

export LC_VIMINIT=$VIMINIT

sshh (){
ssh -o SendEnv=LC_VIMINIT $1 -t 'export VIMINIT=$LC_VIMINIT && bash'

Versuchen Sie nun, vim auf einem Remote-Server mit sshh für die Verbindung auszuführen:

sshh remoteuser@remoteserver

Wenn Sie möchten, können Sie Ihre Plugins auch auf den Remote-Server übertragen:

export LC_VIMINIT="
set number
set nocompatible
filetype off
set rtp+=~/.[USER]_vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'


set shell=/bin/bash
call vundle#end()
filetype plugin indent on
"

export VIMINIT=$LC_VIMINIT

sshh (){
        if [[ $1 ]]; then
                ssh-copy-id $1 &>/dev/null &&
                rsync -lzr --partial --del ~/.[USER]_vim ${1}: &&
                ssh -o SendEnv=LC_VIMINIT $1 -t 'export VIMINIT=$LC_VIMINIT && bash';
        else
                echo "Provide remote user@host";
        fi
}
Apoc
quelle
0

Ich habe die gleiche Situation, aber es ist nicht nur " .vimrc". Ich habe auch Dinge wie

  • Bash-Konfiguration, Eingabeaufforderung und Funktionen,
  • SSH-Konfigurations- und Autorisierungsdateien,
  • Shell-Skripte habe ich gerne griffbereit.
  • natürlich mein vimrc, aber auch einige vim funktionen und syntax highlighting files.

Meine Lösung (die vor 30 Jahren ursprünglich mit "dist" begann!) Besteht darin, einen nächtlichen Cron einzurichten, um eine minimale Heimkonfiguration für alle Maschinen, auf denen ich arbeite, zu synchronisieren, damit diese nachts aktualisiert werden.

Auf diese Weise werden alle anderen Maschinen, mit denen ich arbeite, auf dem neuesten Stand gehalten! Ich kann einfach einen neuen Computer zur Liste der Konten hinzufügen und eine einzelne Computerverteilung durchführen, um ihn zu starten.

Muss nicht viel sein, und Sie können klein anfangen und es im Laufe der Zeit komplexer gestalten. Wie Sie sich nach 30 Jahren vorstellen können, ist meine Distribution jetzt ziemlich komplex, daher werde ich sie hier nicht mehr veröffentlichen. Es ist unnötig zu erwähnen, dass es auch Dinge wie das Austauschen einer Konfiguration für andere für einige Netzwerke, die Bereinigung von Privathaushalten (z. B. Papierkorb, Cache-Dateien), die Sicherstellung, dass alle Privathaushaltsberechtigungen korrekt sind usw. ausführt.

ANMERKUNG Ich erlaube nur die passwortlose SSH-Anmeldung von einem 'Heim' Computer zu allen anderen, nie wieder zurück! Jeder Cross-SSH ist passwortgeschützt.

anthony
quelle
-1

Sie könnten ein EXPECT-Skript in Betracht ziehen, mit dem Sie Ihren Pfad und Ihre Umgebung (wie EXRC-Variablen) festlegen können, wenn Sie eine bestimmte Taste drücken. Es sollte nicht zu lange dauern, bis jemand ein ähnliches Skript veröffentlicht.

Wenn Ihre Serverfarmen mehr als ein paar Dutzend Serverfarmen umfassen (denken Sie an Tausende), ist es ein echter Lebensretter, wenn Sie Ihre Umgebung einfach auf einer "jungfräulichen" Box einrichten

Wenn ich mich bei einer Box anmelde, wird häufig zum ersten Mal mein Homedir erstellt!

ericslaw
quelle
Erwartung ist eine sehr fragile Art, etwas zu tun. Ein anderes Betriebssystem, eine andere Architektur oder sogar ein Upgrade, und es kann kaputt gehen. Okay für etwas Kleines, aber mit der Zeit nicht erweiterbar.
Anthony
-1

Es wurde mit dem folgenden Bash Oneliner realisiert. Da dies mit Process Substitution erfolgt, werden keine temporären Dateien erstellt.

ssh -t user@host '
bash --rcfile <(
    echo -e ' $(cat <(echo "function lvim() { vim -u <(echo "$(cat ~/.vimrc|base64)"|base64 -d) \$@ ; }") \
                    ~/dotfiles/{.bashrc,sh_function,sh_alias,bash_prompt} \
                    <(echo -e alias vim=lvim) | \
                    base64 
               ) ' \
    |base64 -d)'

https://gist.github.com/blacknon/a47083f3bbbd0374998bdf7e3b3396cc

Naofumi Uesugi
quelle