SSH yaparken nasıl .vimrc getirilir?


34

Çalışmam, çeşitli makinelere bağlanmak için SSH kullanma ve bu makinelerde dosyaları düzenlemek için vim kullanma eğilimindedir. Sorun şu ki .vimrc dosyamı sürekli kopyalamak zorunda kalıyorum. Vim açmak ve herhangi bir ayar olmaması çok can sıkıcı bir durum. Vim ayarlarımı yanımda makineden makineye her yere manuel olarak kopyalamaksızın taşımak mümkün mü?


@ duffbeer703: evet gibi set background=darkya set background=light, bir şey olduğu yok Linux dağıtımı dokunuşlar ve olduğu tamamen kullanıcı için göze batmayan. </sarcasm>
Hubert Kario

Henüz cevapları okumadan, ssh-agent ve x-terim devredilebildiği için bunun teorik olarak mümkün olduğunu düşünüyorum, ancak diğer taraftan ssh tarafından özel olarak ele alındıklarını ve çılgın kenar davalarını ele almak için birden fazla geçici çözüm bulunduğunu varsayıyorum. .
trysis

Yanıtlar:


24

Acını hissediyorum. ~ /.* rc dosyalarımın sürüm kontrolü altında (Subversion), 1998'de CVS kullanarak başladığımdan beri çok iyi çalıştı. Bunu yapmanın bir yolu, ana dizininizdeyken tüm rc dosyalarınızı bu şekilde kontrol etmektir:

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.

Bu yolla, svn güncellemesini çalıştırdığınızda, yapılandırma dosyaları çeşitli bilgisayarlar arasında da eşitlenecek ve güncellenecektir.


3
Sanırım bu olabildiğince iyi. İşin püf noktası, diğer tüm makinelerden erişilebilen bir makine için bir depo oluşturmam gerektiğidir. Güvenli bir ağ topolojisi ile bu her zaman kolay değildir.
Kıyamet Hazi

Bunu yakın zamanda yapmaya başladım, inanılmaz. Onsuz nasıl hayatta kaldığımı bilmiyorum.
richo,

5
Belki git veya başka bir dağıtılmış sürüm kontrol sistemi kullanın. Bu durumda, yapılandırma dosyalarının teslim alındığı bir makineye erişmeniz yeterlidir.
ptman

44

Üzerinde çalışmanız gereken her sunucuya .vimrc getirmek yerine, neden uzaktaki dosyaları yerel ağınızdan düzenlemeseniz:

Vim / gvim'de şunu çalıştırın:

:e scp://remoteuser@server.tld//path/to/document

ya da böyle vim başlayın:

vim scp://remoteuser@server.tld//path/to/document

Bu, dosyayı dikerek yerinde açar (aslında dosyayı yerel olarak kopyalar) ve kaydettiğinizde, düzenlenen dosyayı sizin için sunucuya geri gönderir.

Bir ssh şifresi ister, ancak bu ssh tuşları ile kolaylaştırılabilir.

Diğerlerinin de belirttiği gibi, bu yöntemin tek dezavantajı, doğrudan makinede çalışırken yaptığınız gibi yol / dosya rekabeti alamamanızdır.

Daha fazla bilgi için aşağıdaki eğitime göz atın .


Scp için +1: // ipucu, ancak dosyayı her düzenlediğinizde yolu kopyalamanız gerekirse, bu çözümün biraz hantal olabileceğini düşünüyorum.
chmeee

1
Evet, bu çok hantal. İstediğim dosyaları bulmak için uzaktaki makinelerin etrafında çok fazla alay etmem ve sık sık sudo ayrıcalığıyla düzenlemem gerekiyor.
Kıyamet Hazi

+1 bu benim için gerçekten iyi çalışıyor. thanks :)
Darragh Enright

Bir ana sunucuya (login.example.com) giriş yapmanız ve daha sonra yerel bir sunucuya giriş yapmanız gereken durumlar vardır (top.secret.example.com)
puk

Uzak dosya yapısını yerel dizininize örneğin fusermount ile bağlarsanız iyi çalışır.
relet

18

Her giriş yaptığınızda otomatik olarak kopyalamak için bir bash betiği yapabilirsiniz:

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

Örneğin, ssh_vim diyebilirsiniz. Bu ideal bir çözüm değil ama sorununuzu çözecek.

Zaten orada olup olmadığını kontrol etmek için onu iyileştirebilirsiniz. Her zaman aynı makineden ssh kullanmıyorsanız, dosyayı scp'den başka bir makineden almak için komut dosyasını değiştirebilirsiniz.

Edit1

İlgili bir notta, uzak makinenin dosya sistemini de sshfs ile bağlayabilirsiniz. Bu şekilde ortamınızdan ve araçlarınızdan faydalanırsınız (sadece .vimrc değil) ve kabuk tamamlama (scp: // kullanmadığınız).

EDIT2

.Vimrc dosyanızı scp: // kullanarak bu şekilde kaynaklayabileceğinizi öğrendim:

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

Bu, vim komut satırından çalışır, ancak şu anda onu nasıl otomatikleştireceğimi bilmiyorum. '-U' düğmesiyle veya .vimrc'de veya $ VIMINIT ile çalışmıyor gibi görünüyor.

EDIT3

Buldum! Bunu vim'i, referans sunucunuzdan alınan bir .vimrc ile başlatmak için yapabilirsiniz:

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

'-C' seçeneği, vim'i başlattıktan hemen sonra komutu yerine getirir.

Yazmayı önlemek için kabuğunuzda bir takma ad oluşturabilirsiniz. Kısaca şöyle olurdu:

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

2
Eğer ssh'ing bilgisayar Bu yalnızca çalışır içine geri ssh'ing olan bilgisayara bağlanabilir dan . Bu her zaman böyle değildir, örneğin bilgisayarınız NAT'un arkasındaysa.
trysis

10

Genel anahtar kimlik doğrulaması kullanıyorsanız, şunları kullanmak için kullanabilirsiniz ~/.ssh/config:

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

sshKomutun çağrılmasını engellememesi nedeniyle yukarıda önerilen senaryo numarasından daha çok hoşlanıyorum (ekstra parametreler belirtilirken vs.)


bu en iyisi. Benim için değiştirmem gerekti %u@%n:, %r@%n:çünkü ssh kullanıcı adı dizüstü bilgisayarımın kullanıcı adından farklıydı
Moshe

4

Birkaç çözüm:

1) Ana klasörünüz için bir NFS paylaşımı oluşturun ve bunu birden fazla konumda eşleyin.

2) .vimrc'nizi bir kimlik / anahtar dosyası ile bağlandığınız sunucuya itmek için küçük bir komut dosyası oluşturun. Bunun gibi bir şeye benzeyebilir (sözde kodu):

connectString = arg0  #username@ipaddress

scp -i ~/.ssh/indentity connectString:~/ ~/.vimrc
ssh -i ~/.ssh/indentity connectString

1
ssh anahtarları th düz metin parola sorununu çözecektir.
LiraNuna

NFS paylaşımı oluşturmak için hangi aracı kullanırsınız?
Wadih M.

@LiraNuna - 'duh' anım olmadan önce beni yakaladınız ve yayınımı düzenlemiş gibisiniz. @Wadih - NFSD genellikle 'nix sistemlerinde varsayılan olarak kurulur. Ayrıca NFS paylaşımlarını varsayılan olarak da (genellikle) bağlayabilirsiniz.
moshen

1
NFS paylaşımı iyi bir fikir ancak muhtemelen üretim sunucularını değiştirmek istemediğiniz güvenlik duvarı olan ortamlarda veya üretim sunucularını (özellikle NFS ile) değiştirmek istemediğiniz yerlerde bu tür şeyleri dağıtma konusunda sınırlı yetenekle karşılaşacak
ericslaw

Sen doğru ericslaw. Tek bir ağ içinde bunların birden fazla makine olduğu varsayımında bulundum.
moshen

4

Tam olarak sunny256 ile aynı cevap, ancak SubVersion yerine git kullanın.

Bir ana dalı, tüm bilgisayarlar için ortak olan ve her bir yeni bilgisayar için de bir dalı olan dosyalarda tutun.

Bu yolla çoğu bilgisayarda neredeyse aynı dosyalara sahip olabilirsiniz ve hala kafanız karışmaz.


+1 Küçük bir soru: Subversion'da ortak dosyalar için harici tanımları kullanmanın daha iyi olup olmadığını merak ediyorum? Bu yolla onları bir yerde
toplayabilir

3

Bunun eski bir iş parçacığı olduğunu biliyorum, fakat bunu yapmamın bir yolu dosya sistemini sigortaya bağlayan sshfs kullanmak. Yerel vim tüm düzenlemeleri yapar, bu nedenle etrafında .vimrc'yi kopyalamak için hiçbir sebep yoktur.

Bu, uzak sunucuda çalışması gereken herhangi bir komut için başka bir terminalin açık olması gerekme dezavantajına sahiptir, ancak düzenleme için bu yolu en iyi buluyorum.

Ayrıca, sistem panosunu kullanabilme avantajına da sahiptir.


2

Nokta dosyalarımı yönetmek için https://github.com/andsens/homeshick kullanıyorum ve onları github'da saklıyorum.

Homeshick% 100 bash ile yazılmıştır ve / home / dizini içeren sadece git repoları olan "kaleleri" yönetmenize yardımcı olur. Mevcut nokta dosyalarını depoya taşımak ve sembolik simgeleriyle değiştirmek için komutları vardır. Ayrıca depodaki tüm dosyaları yeni bir makinedeki ana dizininize bağlamak.

Genel fikir, nokta dosyalarınızı bir sürüm kontrol sisteminde tutmak ve onlara gerçek yoldan bakmak. Bu şekilde reponuzun ana dizininizden başlaması gerekmez ve hiç eklemek istemediğiniz tonlarca dosya içerir.


Bağlantıdan biraz bilgi ekleyebilir misiniz? Bağlantı koparsa bu cevabı geliştirir ve bilgi sağlar.
Dave M

1
Bazı işlem ve akıl yürütmeyi açıkladım. Belgelerin kopyalanmasında değer görmedim.
Aaron McMillin

1

Eğer benim gibiyseniz ve çeşitli nedenlerden dolayı birçok geliştirme makinelerine (Sanal Makineler) sahipseniz, ssh anahtarlarını, akıllı bash_profile ve seçtiğiniz bir RCS'yi birleştirebilirsiniz.

İkinci olarak nfs / samaba / sshfs kullanıyordum. Bir geri çekilme, her zaman ağ erişiminiz yoksa, ihtiyacınız olan şeylere erişemezsiniz (uçuş, wifi yok, güvenlik duvarları, yönlendirme sorunları, vb.). Senkronize ettiğim makinelerin tümüne aynı anda erişilemiyor, ancak aralarında bilgi paylaşmak istiyorum.

Aşağıda internetten pek çok fikir ödünç alarak nasıl devam ettiğimi anladım.

.bash_profile böyle bir şeye sahip olabilir

$HOME/bin/shell_ssh_agent

Bunu birkaç yerden aldım ama şimdi bağlantı bulamıyorum. Shell_ssh_agent dosyası:

#!/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

Şimdi ilk girişinizde anahtarlarınızı ayarlayın. Oturumu kapatıp açın ve hayatı kolaylaştırdı.

Tüm komut dosyalarınızı bir RCS'ye yerleştirin, bu, geliştirme makinelerini senkronize etmeyi kolaylaştırır. Git'i kullanıyorum. Git ile kimlik doğrulaması ssh üzerinden yapılır, bu yüzden ssh anahtarları da burada yardımcı olur. Bu noktada nfs gibi bir şey kullanabileceğinizi unutmayın. Aşağıda bahsettiğim bir sebepten dolayı hala bir RCS hayranı olurdum.

Kullanım durumda

  1. giriş ilk kez, tuşlar kurulum olsun
  2. Eğer RCS kurulmamışsa, kişisel komut dosyalarınızı kontrol edin (ve gerektiğinde güncelleyin / birleştirin, eğer isterseniz, bu .bash_profile dosyanızın bir parçası olabilir)
  3. vimrc, special scripts, etc düzenleme ve düzenleme
  4. diğer makinelere giriş yaptığınızda bir güncelleme / birleştirme / ödeme yapın. Bu her şeyi senkronize tutar; yani zaman zaman durduğunuz ve istemediğiniz dosyaları kopyalamanıza gerek kalmaz.
  5. Yan fayda olarak, bir RCS'nin gücünü elde edersiniz. Bazen senaryolarda veya konfigürasyonlarda elverişsiz değişiklikler yapıyorum ve geriye ve benzerlerini geri almam gerekiyor.

Daha sonra denemek istediğim bir şey, ilk giriş / kurulum işlemini yeni makineye kopyaladığım makefile içinde kaydırmak. Makefile daha sonra anahtarlarınızı, RCS'lerinizi vb. Ayarlama işini yapabilir. Açıkçası burada bazı ek yükler var ama sonunda bir çok makine ayarladıysanız bu:

  1. zaman kazandıran
  2. geliştirme makineleri yapılandırmalarını ve kişisel komut dosyalarını senkronize halde tutmak daha kolay
  3. komut dosyalarındaki ve yapılandırmalardaki değişikliklerin yönetimi.

1

Oturum açtığım tüm sunucuların bir listesini içeren ve yerel makinemde bir değişiklik yaptığımda 'make' kullanan bir makefile kullanıyorum, 'make', tüm sunucuları herhangi bir değişiklik veya eklentiyle güncelleyen makefile'ı otomatik olarak çalıştırıyor


Bir senaryo yapmanın süslü bir yolu gibi görünüyor. Bir dosyayı diğerinden oluştururken yapmak harikadır, ancak her kuralın bir " .PHONY." olduğu bir durumda kullanmak istemem
anthony

1

sshrc bu sorunu çözer. .Vimrc'nizi ~ / .sshrc.d / dizinine koyun ve ardından export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"/.sshrc dizinine ekleyin .


1

Bunun için SSHd yerleşik yapılandırma seçeneklerini standart olmayan bir şekilde kullanarak .vimrc dosyanızı ssh ile her zaman yerel olarak taşımanıza izin verecek basit bir araç yazdım .

Hiçbir ek svn, scp, copy/pastevb gerektiriyordu.

Basit, hafiftir ve şu ana kadar test ettiğim tüm sunucu yapılandırmalarında varsayılan olarak çalışır.

https://github.com/gWOLF3/viSSHous


0

VIMINIT değişkenini kullanma:

export VIMINIT='set number'

ve uzak sunucuya iletme:

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

.bash_profiles veya .bashrc kullanmak kolaydır

export VIMINIT='
set number
'

export LC_VIMINIT=$VIMINIT

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

Şimdi uzak sunucuda vsh komutunu kullanarak sshh bağlantısını deneyin:

sshh remoteuser@remoteserver

İsterseniz eklentilerinizi uzaktaki sunucuya da götürebilirsiniz:

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
}

0

Aynı durum var ama sadece " .vimrc" değil . Benim de gibi şeyler var

  • bash yapılandırması, sorma ve işlevler,
  • ssh yapılandırma ve yetkilendirme dosyaları,
  • kabuk betiklerini kullanışlı bulmayı severim.
  • Tabii ki benim vimrc, ama aynı zamanda bazı vim fonksiyonları ve sözdizimi dosyaları vurgulayarak.

Çözümüm (başlangıçta 30 yıl önce "dist" ile başladı!) Üzerinde çalıştığım tüm makinelere minimum bir ev yapılandırması sağlamak için her gece bir cron oluşturmak, böylece her gece güncelleniyor.

Bu şekilde çalıştığım tüm diğer makineler güncel kalıyor! 'Hesaplar' listesine yeni bir makine ekleyebilir ve başlatmak için tek bir makine dağıtımı yapabilirim.

Çok olması gerekmez ve küçükten başlayabilir ve gittikçe daha karmaşık hale getirebilirsiniz. Tahmin edebileceğiniz gibi 30 yıl sonra dağılımım artık oldukça karmaşık, bu yüzden buraya koymuyorum. Söylemeye gerek yok, bazı ağlar için başkaları için bazı konfigürasyonları değiştirmek, ev temizliği (EG: çöp kutusu, önbellek dosyaları), ev izinlerinin hepsinin doğru olduğundan emin olmak gibi şeyleri de yaptığını söylemeye gerek yok.

DİKKAT Sadece bir 'ev' makinesinden parolasız ssh oturum açmasına izin veriyorum, bir daha asla geri dönmem! Herhangi bir çapraz ssh şifre korumalıdır.


-1

Belirli bir tuşa basıldığında yolunuzu ve ortamınızı (EXRC değişkenleri gibi) ayarlamanıza izin veren bir EXPECT komut dosyası düşünebilirsiniz. Birisi benzer bir senaryo göndermeden önce çok uzun olmamalı.

Sunucu çiftlikleriniz birkaç düzineden fazla bir sayı (binlerce) düşününce, o zaman ortamınızı 'bakire' bir kutuya kolayca yerleştirmek gerçek bir hayat kurtarıcı

Genellikle bir kutuya giriş yaptığımda ilk kez homedir'imi oluşturur!


Beklemek, bir şey yapmanın çok kırılgan bir yoludur. Farklı bir işletim sistemi, mimari, hatta yükseltme, ve bozabilir. Tamam, küçük bir şey için tamam ama zaman geçtikçe genişletilemez.
anthony

-1

Aşağıdaki bash oneliner ile gerçekleştirildi. İşlem Değiştirme ile yapıldığından, geçici dosyalar oluşturulmaz.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.