Bagaimana cara membawa .vimrc ketika saya SSH?

34

Pekerjaan saya cenderung melibatkan penggunaan SSH untuk terhubung ke berbagai mesin, dan kemudian menggunakan vim untuk mengedit file pada mesin tersebut. Masalahnya adalah saya harus terus menyalin file .vimrc saya. Sangat menjengkelkan untuk membuka vim dan tidak memiliki pengaturan apa pun. Apakah mungkin untuk membawa pengaturan vim saya dengan saya dari mesin ke mesin tanpa secara manual menyalinnya ke mana-mana?

Apreche
sumber
@ duffbeer703: yeah, suka set background=darkatau set background=light, sesuatu yang tidak disentuh distribusi Linux dan sama sekali tidak mengganggu bagi pengguna. </sarcasm>
Hubert Kario
Tanpa membaca jawabannya, saya merasa seperti ini secara teori dimungkinkan karena ssh-agent dan x-term dapat ditransfer, tetapi di sisi lain itu secara khusus ditangani oleh ssh & saya berasumsi ada beberapa solusi untuk menangani kasus tepi gila .
trysis

Jawaban:

24

Aku merasakan sakitmu. Saya memiliki semua file rc ~ /.* saya di bawah kontrol versi (Subversion), telah bekerja dengan baik sejak saya mulai pada tahun 1998, menggunakan CVS. Salah satu cara untuk melakukannya, adalah memeriksa semua file rc Anda seperti ini ketika Anda berdiri di direktori home Anda:

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.

Dengan cara ini file konfigurasi juga akan disinkronkan dan diperbarui di berbagai komputer ketika Anda menjalankan pembaruan svn.

sunny256
sumber
3
Saya kira ini sama baiknya dengan yang didapat. Triknya adalah saya harus mengatur repositori pada mesin yang dapat diakses dari semua mesin lain. Dengan topologi jaringan yang aman, itu tidak selalu mudah.
Apreche
Saya mulai melakukan ini baru-baru ini, sungguh menakjubkan. Saya tidak tahu bagaimana saya bertahan tanpa itu.
richo
5
Mungkin menggunakan git atau sistem kontrol versi terdistribusi lainnya. Dalam hal ini sudah cukup untuk memiliki akses ke mesin di mana file konfigurasi diperiksa.
ptman
44

Alih-alih membawa .vimrc ke setiap server yang harus Anda kerjakan, mengapa tidak mengedit file jarak jauh dari vim lokal Anda:

Dalam vim / gvim, jalankan:

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

atau mulai vim seperti ini:

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

Ini membuka file seamingly di tempat (itu sebenarnya menyalin file secara lokal), dan ketika Anda menyimpan, itu mengirim file yang diedit kembali ke server untuk Anda.

Ia meminta kata sandi ssh, tetapi ini dapat dirampingkan melalui kunci ssh.

Seperti yang disebutkan orang lain, satu-satunya kelemahan dari metode ini adalah Anda tidak mendapatkan persaingan jalur / file seperti saat Anda bekerja langsung di mesin.

Untuk info lebih lanjut, lihat tutorial berikut .

Tom Feiner
sumber
+1 untuk scp: // petunjuk tapi saya pikir solusi ini bisa sedikit rumit jika Anda perlu menyalin path setiap kali Anda mengedit file.
chmeee
1
Ya, ini terlalu rumit. Saya harus melakukan banyak poking pada mesin remote untuk menemukan file yang saya inginkan, dan sering harus mengedit dengan hak istimewa sudo.
Apreche
+1 ini bekerja sangat baik untuk saya. terima kasih :)
Darragh Enright
Ada kasus di mana Anda perlu masuk ke server utama (login.example.com) kemudian dari sana masuk ke server lokal (top.secret.example.com)
puk
Ini berfungsi dengan baik jika Anda memasang struktur file jarak jauh ke direktori lokal Anda, misalnya dengan fusermount.
Relet
18

Anda dapat membuat skrip bash untuk menyalinnya secara otomatis setiap kali Anda masuk, seperti ini:

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

Anda dapat menyebutnya ssh_vim, misalnya. Ini bukan solusi ideal tetapi akan menyelesaikan masalah Anda.

Anda dapat memperbaikinya untuk memeriksa terlebih dahulu jika sudah ada. Jika Anda tidak selalu menjalankan ssh dari mesin yang sama, Anda dapat mengubah skrip untuk mendapatkan file dari scp dari mesin lain.

EDIT1

Pada catatan terkait, Anda juga bisa me-mount sistem file mesin remote dengan sshfs. Dengan begitu Anda mendapat manfaat dari lingkungan dan alat Anda (tidak hanya .vimrc) dan Anda memiliki penyelesaian shell (yang Anda tidak harus menggunakan scp: //).

EDIT2

Saya baru tahu bahwa Anda dapat sumber file .vimrc Anda menggunakan scp: //, seperti ini:

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

Ini berfungsi dari baris perintah vim tetapi saat ini saya tidak tahu bagaimana mengotomatiskannya. Tampaknya tidak berfungsi baik dengan sakelar '-u' maupun di .vimrc atau dengan $ VIMINIT.

EDIT3

Aku menemukannya! Anda dapat melakukan ini untuk memulai vim dengan .vimrc yang diambil dari referensi Anda:

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

Opsi '-c' mengeksekusi perintah tepat setelah meluncurkan vim.

Anda dapat membuat alias di shell pilihan Anda untuk menghindari mengetik. Dalam bash akan seperti ini:

alias vim="vim -c ':source scp://you@your_computer//yourpath/.vimrc'"
chmeee
sumber
2
Ini hanya bekerja jika komputer Anda ssh'ing ke dapat terhubung kembali ke komputer Anda ssh'ing dari . Ini tidak selalu terjadi, misalnya jika komputer Anda berada di belakang NAT.
trysis
11

Jika Anda menggunakan otentikasi kunci publik, Anda dapat menggunakannya di ~/.ssh/config:

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

Saya menyukainya lebih baik daripada trik skrip yang disarankan di atas karena tidak mengacaukan permohonan sshperintah (ketika menentukan parameter tambahan, dll.)

omribahumi
sumber
Ini yang terbaik. Bagi saya, saya harus mengubah %u@%n:ke %r@%n:karena ssh nama berbeda dari nama pengguna laptop saya
Moshe
4

Beberapa solusi:

1) Buat share NFS untuk folder rumah Anda dan petakan di banyak lokasi.

2) Buat skrip kecil untuk mendorong .vimrc Anda ke server yang Anda sambungkan dengan file identitas / kunci. Itu bisa terlihat seperti ini (kodesemu):

connectString = arg0  #username@ipaddress

scp -i ~/.ssh/indentity connectString:~/ ~/.vimrc
ssh -i ~/.ssh/indentity connectString
moshen
sumber
1
kunci ssh akan menyelesaikan masalah kata sandi plaintext.
LiraNuna
alat apa yang akan Anda gunakan untuk membuat bagian NFS?
Wadih M.
@LiraNuna - sepertinya Anda menangkap saya sebelum momen 'duh' saya dan mengedit posting saya. @Wadih - NFSD biasanya diinstal pada sistem nix secara default. Anda juga dapat memasang saham NFS secara default (biasanya) juga.
moshen
1
Berbagi NFS adalah ide yang baik tetapi kemungkinan akan mengalami keterbatasan kemampuan untuk menyebarkan hal-hal seperti itu, terutama di lingkungan atau lokasi firewall di mana Anda tidak ingin memodifikasi server produksi (terutama dengan NFS)
ericslaw
Anda ericslaw yang benar. Saya membuat asumsi bahwa ini adalah beberapa mesin dalam satu jaringan.
moshen
4

Jawaban yang sama persis seperti sunny256, tetapi gunakan git bukan SubVersion.

Simpan satu cabang utama dengan file-file yang umum untuk semua komputer, dan miliki satu cabang untuk setiap komputer baru.

Dengan begitu Anda dapat memiliki file yang hampir sama di kebanyakan komputer, dan masih tidak menjadi bingung.

Johan
sumber
+1 Sebuah pertanyaan kecil: Saya ingin tahu apakah lebih baik menggunakan definisi eksternal untuk file-file umum dalam subversi? Dengan cara ini, Anda dapat memilikinya di satu tempat dan mengambil cabang mana pun
Eugene Yarmash
3

Saya tahu ini adalah utas lama, Tapi salah satu cara saya melakukannya adalah menggunakan sshfs yang me-mount sistem file melalui sekering. Vm lokal melakukan semua pengeditan, jadi tidak ada alasan untuk menyalin .vimrc sekitar.

Ini memang memiliki kelemahan bahwa terminal lain harus terbuka untuk setiap perintah yang perlu dijalankan pada server jauh, tetapi untuk mengedit saya menemukan cara ini yang terbaik.

Ini juga memiliki manfaat tambahan karena dapat menggunakan clipboard sistem.

exussum
sumber
2

Saya menggunakan https://github.com/andsens/homeshick untuk mengelola dotfile saya, dan menyimpannya di github.

Homeshick ditulis dalam 100% bash, dan membantu Anda mengelola "kastil" yang hanya repositori git yang berisi direktori / home /. Ini memiliki perintah untuk memindahkan file dot yang ada ke repo dan menggantinya dengan symlink. Dan untuk menghubungkan semua file dalam repo ke direktori home Anda pada mesin baru.

Jadi ide umumnya adalah menyimpan dotfile Anda dalam sistem kontrol versi, dan symlink ke mereka dari jalur nyata. Dengan cara ini repo Anda tidak perlu memulai dari direktori home Anda dan berisi banyak file yang tidak ingin Anda tambahkan.

Aaron McMillin
sumber
Bisakah Anda menambahkan beberapa info dari tautan? Itu akan meningkatkan jawaban dan memberikan info jika tautan rusak.
Dave M
1
Saya menjelaskan beberapa operasi dan alasannya. Saya tidak melihat nilai dalam menyalin dokumentasi.
Aaron McMillin
1

Jika Anda seperti saya dan memiliki banyak mesin pengembangan (Mesin Virtual juga) karena berbagai alasan Anda dapat menggabungkan kunci ssh, bash_profile pintar, dan RCS pilihan Anda.

Saya akan menggunakan nfs / samaba / sshfs. Satu penarikan kembali adalah jika Anda tidak memiliki akses jaringan sepanjang waktu maka Anda tidak dapat mengakses apa yang Anda butuhkan (terbang, tidak ada wifi, firewall, masalah perutean, dll). Mesin yang saya sinkronkan tidak semuanya dapat dijangkau pada saat yang bersamaan tetapi saya ingin berbagi informasi di antara mereka.

Berikut ini adalah cara saya meminjam banyak ide dari Internet.

.bash_profile dapat memiliki sesuatu seperti ini

$HOME/bin/shell_ssh_agent

Saya mendapatkan ini dari beberapa tempat tetapi tidak dapat menemukan tautan ke sana sekarang. File 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

Sekarang pada login pertama Anda mengatur kunci Anda. Keluar dan masuk dan itu membuat hidup lebih mudah.

Letakkan semua skrip Anda di RCS, ini membuat menjaga mesin pengembangan dalam sinkronisasi lebih mudah. Saya menggunakan git. Otentikasi dengan git adalah melalui ssh sehingga kunci ssh juga membantu di sini. Perhatikan pada titik ini Anda bisa menggunakan sesuatu seperti nfs. Saya masih akan menjadi penggemar RCS karena alasan yang saya sebutkan di bawah ini.

Kasus penggunaannya adalah

  1. masuk pertama kali, kunci siap
  2. jika RCS tidak diatur periksa skrip pribadi Anda (dan perbarui / gabungkan saat diperlukan, ini bahkan bisa menjadi bagian dari .bash_profile Anda jika Anda menginginkannya)
  3. edit vimrc, skrip khusus, dll dan komit
  4. ketika masuk ke komputer lain melakukan pembaruan / penggabungan / checkout. Ini membuat semuanya sinkron; yaitu tidak ada lagi menyalin file yang kadang-kadang Anda menginjak dan Anda tidak mau.
  5. sebagai manfaat samping Anda mendapatkan kekuatan RCS. Saya kadang-kadang membuat perubahan yang tidak menguntungkan pada skrip atau konfigurasi dan perlu memutar kembali dan sejenisnya.

Sesuatu yang ingin saya coba berikutnya adalah membungkus login / setup awal dalam makefile yang saya salin ke mesin baru. Makefile kemudian dapat melakukan pekerjaan mengatur kunci Anda, RCS, dll. Jelas ada beberapa overhead di sini tetapi jika Anda akhirnya menyiapkan banyak mesin ini adalah:

  1. penghemat waktu
  2. lebih mudah untuk menjaga konfigurasi dan skrip pribadi mesin pengembangan dalam sinkronisasi
  3. pengelolaan perubahan pada skrip dan konfigurasi.
putaran
sumber
1

Saya menggunakan makefile yang memiliki daftar semua server yang saya masuki dan ketika saya membuat perubahan pada mesin lokal saya, 'make' dijalankan menggunakan makefile secara otomatis yang memperbarui semua server dengan perubahan atau plugin apa pun

Lloyd Moore
sumber
Tampaknya lebih seperti cara mewah dalam membuat naskah. Make hebat ketika membangun satu file dari yang lain, tetapi saya tidak ingin menggunakannya dalam situasi di mana setiap aturan adalah " .PHONY."
anthony
1

sshrc memecahkan masalah ini. Anda menaruh .vimrc di ~ / .sshrc.d / dan kemudian tambahkan export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"ke `/.sshrc.

Alexander Garden
sumber
1

Saya menulis alat sederhana untuk ini yang akan memungkinkan Anda untuk mentransport file .vimrc Anda secara native kapan pun Anda ssh , dengan menggunakan opsi konfigurasi bawaan SSHd dengan cara yang tidak standar.

Tidak ada tambahan svn, scp, copy/paste, dll diperlukan.

Sederhana, ringan, dan berfungsi secara default pada semua konfigurasi server yang telah saya uji sejauh ini.

https://github.com/gWOLF3/viSSHous

Glenn W
sumber
0

Menggunakan variabel VIMINIT:

export VIMINIT='set number'

dan meneruskannya ke server jauh:

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

mudah menggunakan .bash_profiles atau .bashrc

export VIMINIT='
set number
'

export LC_VIMINIT=$VIMINIT

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

Sekarang coba jalankan vim di server jauh menggunakan sshh untuk koneksi:

sshh remoteuser@remoteserver

Jika Anda mau, Anda dapat membawa plugin Anda ke server jarak jauh juga:

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
sumber
0

Saya memiliki situasi yang sama, tetapi bukan hanya " .vimrc". Saya juga punya hal-hal seperti

  • konfigurasi bash, prompt dan fungsi,
  • konfigurasi ssh dan file otorisasi,
  • skrip shell saya ingin berguna.
  • tentu saja vimrc saya, tetapi juga beberapa fungsi vim dan file highlight sintaks.

Solusi saya (dimulai 30 tahun yang lalu dengan "dist" awalnya!) Adalah mengatur cron malam untuk rsync konfigurasi rumah minimal untuk semua mesin yang saya kerjakan, sehingga pembaruan setiap malam.

Dengan begitu semua mesin lain yang bekerja dengan saya selalu terbarui! Saya bisa menambahkan mesin baru ke daftar 'akun' dan melakukan distribusi mesin tunggal untuk memulainya.

Tidak perlu banyak, dan Anda bisa mulai dari yang kecil dan membuatnya lebih kompleks saat Anda pergi. Seperti yang dapat Anda bayangkan setelah 30 tahun distribusi saya sekarang agak rumit, jadi saya tidak akan menaruhnya di sini. Tak perlu dikatakan itu juga melakukan hal-hal seperti menukar beberapa konfigurasi untuk yang lain untuk beberapa jaringan, pembersihan rumah (EG: trash, file cache), memastikan izin rumah semuanya benar, dan sebagainya.

CATATAN Saya hanya mengizinkan login ssh tanpa kata sandi dari satu mesin 'rumah' ke yang lainnya, tidak pernah kembali lagi! Setiap ssh silang dilindungi kata sandi.

anthony
sumber
-1

Anda mungkin mempertimbangkan skrip EXPECT yang memungkinkan Anda untuk mengatur jalur dan lingkungan Anda (seperti variabel EXRC) setelah menekan keystroke tertentu. Seharusnya tidak terlalu lama sebelum seseorang memposting skrip yang serupa.

Ketika server Anda menyimpan lebih dari beberapa lusin (kira-kira ribuan) maka memiliki sesuatu dengan mudah mengatur lingkungan Anda pada kotak 'perawan' adalah penyelamat nyata

Seringkali ketika saya masuk ke sebuah kotak, itu menciptakan homedir saya untuk pertama kalinya!

ericslaw
sumber
Harapkan adalah cara yang sangat rapuh untuk melakukan sesuatu. OS, Arsitektur, atau bahkan peningkatan yang berbeda, dan itu dapat rusak. Oke untuk sesuatu yang kecil, tetapi tidak dapat diperluas seiring berjalannya waktu.
anthony
-1

Itu diwujudkan dengan oneliner bash berikut. Karena ini dilakukan dengan Proses Pergantian, file sementara tidak dibuat.

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
sumber