Làm cách nào để mang .vimrc khi tôi SSH?


34

Công việc của tôi có xu hướng liên quan đến việc sử dụng SSH để kết nối với các máy khác nhau và sau đó sử dụng vim để chỉnh sửa các tệp trên các máy đó. Vấn đề là tôi phải liên tục sao chép tệp .vimrc của mình xung quanh. Rất khó chịu khi mở vim và không có bất kỳ cài đặt nào. Có thể mang các thiết lập vim của tôi theo tôi từ máy này sang máy khác mà không cần sao chép thủ công ở mọi nơi không?


@ duffbeer703: yeah, thích set background=darkhoặc set background=light, một cái gì đó mà không có bản phân phối Linux nào chạm vào và hoàn toàn không gây khó chịu cho người dùng. </ mỉa mai>
Hubert Kario

Chưa đọc câu trả lời, tôi cảm thấy như vậy về mặt lý thuyết là có thể vì ssh-agent và x-term có thể được chuyển qua, nhưng mặt khác, chúng được xử lý cụ thể bởi ssh và tôi cho rằng có nhiều cách giải quyết để xử lý các trường hợp điên rồ .
phân tích

Câu trả lời:


24

Tôi cảm nhận được nỗi đau của bạn. Tôi có tất cả các tập tin RC ~ /.* của mình dưới sự kiểm soát phiên bản (Subversion), đã hoạt động rất tốt kể từ khi tôi bắt đầu vào năm 1998, sử dụng CVS. Một cách để làm điều đó là kiểm tra tất cả các tệp RC của bạn như thế này khi bạn đứng trong thư mục chính của mình:

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.

Bằng cách này, các tệp cấu hình cũng sẽ được đồng bộ hóa và cập nhật trên các máy tính khác nhau khi bạn chạy cập nhật svn.


3
Tôi đoán điều này là tốt như nó được. Mẹo nhỏ là tôi phải thiết lập một kho lưu trữ trên một máy có thể truy cập được từ tất cả các máy khác. Với cấu trúc liên kết mạng an toàn, điều đó không phải lúc nào cũng dễ dàng.
Apreche

Tôi bắt đầu làm điều này gần đây, nó là tuyệt vời. Tôi không biết làm thế nào tôi sống sót mà không có nó.
richo

5
Có thể sử dụng git hoặc một số hệ thống kiểm soát phiên bản phân tán khác. Trong trường hợp đó, việc truy cập vào một máy mà các tệp cấu hình được kiểm tra là đủ.
ptman

44

Thay vì mang .vimrc đến từng máy chủ bạn cần làm việc, tại sao không chỉnh sửa các tệp từ xa từ vim cục bộ của bạn:

Trong vim / gvim, chạy:

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

hoặc bắt đầu vim như thế này:

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

Thao tác này sẽ mở tệp một cách cẩn thận (nó thực sự sao chép tệp cục bộ) và khi bạn lưu, nó sẽ gửi tệp đã chỉnh sửa trở lại máy chủ cho bạn.

Nó yêu cầu mật khẩu ssh, nhưng điều này có thể được sắp xếp hợp lý thông qua các phím ssh.

Như những người khác đã đề cập đến nhược điểm duy nhất của phương pháp này là bạn không bị cạnh tranh đường dẫn / tệp như khi làm việc trực tiếp trên máy.

Để biết thêm thông tin, hãy xem hướng dẫn sau đây .


+1 cho scp: // gợi ý nhưng tôi nghĩ giải pháp này có thể hơi cồng kềnh nếu bạn cần sao chép đường dẫn mỗi khi bạn chỉnh sửa tệp.
chmeee

1
Vâng, điều này là quá cồng kềnh. Tôi phải chọc rất nhiều máy từ xa để tìm các tập tin tôi muốn và thường phải chỉnh sửa với đặc quyền sudo.
Apreche

+1 này hoạt động thực sự tốt cho tôi. cảm ơn :)
Darragh Enright

Có những trường hợp bạn cần đăng nhập vào một máy chủ chính (login.example.com) sau đó từ đó đăng nhập vào một máy chủ cục bộ (top.secret.example.com)
puk

Nó hoạt động độc đáo nếu bạn gắn cấu trúc tệp từ xa vào thư mục cục bộ của bạn, ví dụ như với fusermount.
Relet

18

Bạn có thể tạo một tập lệnh bash để sao chép nó tự động mỗi khi bạn đăng nhập, như thế này:

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

Bạn có thể gọi nó là ssh_vim, ví dụ. Đó không phải là một giải pháp lý tưởng nhưng sẽ giải quyết vấn đề của bạn.

Bạn có thể cải thiện nó để kiểm tra trước nếu đã có sẵn. Nếu không phải lúc nào bạn cũng chạy ssh từ cùng một máy, bạn có thể thay đổi tập lệnh để lấy tệp từ scp từ máy khác.

EDIT1

Trên một lưu ý liên quan, bạn cũng có thể gắn hệ thống tập tin của máy từ xa bằng sshfs. Bằng cách đó, bạn được hưởng lợi từ môi trường và công cụ của mình (không chỉ .vimrc) và bạn đã hoàn thành trình bao (mà bạn không sử dụng scp: //).

EDIT2

Tôi vừa phát hiện ra rằng bạn có thể nguồn tệp .vimrc của mình bằng scp: //, như thế này:

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

Điều này hoạt động từ dòng lệnh vim nhưng hiện tại tôi không biết cách tự động hóa nó. Nó dường như không hoạt động với công tắc '-u' cũng như trong .vimrc cũng như với $ VIMINIT.

EDIT3

Tôi tìm thấy nó! Bạn có thể làm điều này để bắt đầu vim với một .vimrc được lấy từ máy chủ tham chiếu của bạn:

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

Tùy chọn '-c' thực thi lệnh ngay sau khi khởi chạy vim.

Bạn có thể tạo một bí danh trong vỏ bạn chọn để tránh gõ. Trong bash nó sẽ như thế này:

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

2
Điều này chỉ hoạt động nếu máy tính bạn đang ssh'ing vào có thể kết nối trở lại máy tính bạn đang ssh'ing từ . Điều này không phải lúc nào cũng đúng, ví dụ nếu máy tính của bạn đứng sau NAT.
phân giải

10

Nếu bạn đang sử dụng xác thực khóa công khai, bạn có thể sử dụng điều này trong ~/.ssh/config:

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

Tôi thích nó hơn so với thủ thuật kịch bản được đề xuất ở trên vì nó không gây rối cho việc gọi sshlệnh (khi chỉ định tham số bổ sung, v.v.)


đây là thứ tốt nhất. Đối với tôi, tôi đã phải đổi %u@%n:thành %r@%n:vì tên người dùng ssh khác với tên người dùng máy tính xách tay của tôi
Moshe

4

Một vài giải pháp:

1) Tạo chia sẻ NFS cho thư mục nhà của bạn và ánh xạ nó ở nhiều vị trí.

2) Tạo một tập lệnh nhỏ để đẩy .vimrc của bạn đến máy chủ mà bạn đang kết nối với tệp nhận dạng / khóa. Nó có thể trông giống như thế này (mã giả):

connectString = arg0  #username@ipaddress

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

1
Các khóa ssh sẽ giải quyết vấn đề mật khẩu plaintext.
LiraNuna

bạn sẽ sử dụng công cụ nào để tạo chia sẻ NFS?
Wadih M.

@LiraNuna - có vẻ như bạn đã bắt gặp tôi trước khi tôi có khoảnh khắc 'duh' và chỉnh sửa bài đăng của mình. @Wadih - NFSD thường được cài đặt trên các hệ thống 'nix theo mặc định. Bạn cũng có thể gắn kết cổ phiếu NFS theo mặc định (thường).
moshen

1
Chia sẻ NFS là một ý tưởng tốt nhưng có thể sẽ gặp phải khả năng hạn chế để triển khai những thứ như vậy, đặc biệt là trong các môi trường có tường lửa hoặc các vị trí mà bạn không muốn sửa đổi các máy chủ sản xuất (đặc biệt là với NFS)
ericslaw

Bạn đúng ericslaw. Tôi đã đưa ra giả định rằng đây là nhiều máy trong một mạng.
moshen

4

Câu trả lời chính xác tương tự như sunny256, nhưng sử dụng git thay vì SubVersion.

Giữ một nhánh chính với các tệp chung cho tất cả các máy tính và có một nhánh cho mỗi máy tính mới.

Bằng cách đó, bạn có thể có hầu hết các tệp giống nhau trên hầu hết các máy tính và vẫn không bị lẫn lộn.


+1 Một câu hỏi nhỏ: Tôi tự hỏi liệu có tốt hơn khi sử dụng các định nghĩa bên ngoài cho các tệp phổ biến trong lật đổ không? Bằng cách này, bạn có thể có chúng ở một nơi và tìm đến bất kỳ chi nhánh nào
Eugene Yarmash

3

Tôi biết đây là một chủ đề cũ, nhưng một cách tôi làm là sử dụng sshfs để gắn hệ thống tập tin qua cầu chì. Các vim cục bộ thực hiện tất cả các chỉnh sửa, vì vậy không có lý do gì để sao chép .vimrc xung quanh.

Điều này có nhược điểm là một thiết bị đầu cuối khác sẽ phải mở cho bất kỳ lệnh nào cần chạy trên máy chủ từ xa, nhưng để chỉnh sửa tôi thấy cách này là tốt nhất.

Nó cũng có thêm lợi ích của việc có thể sử dụng bảng tạm hệ thống.


2

Tôi đang sử dụng https://github.com/andsens/homeshick để quản lý các dotfiles của mình và lưu trữ chúng trên github.

Homeshick được viết bằng bash 100% và giúp bạn quản lý "lâu đài" chỉ là các repos git có chứa thư mục / home /. Nó có các lệnh để di chuyển các tập tin dấu chấm hiện có vào repo và thay thế chúng bằng các liên kết tượng trưng. Và để liên kết tất cả các tệp trong repo vào thư mục chính của bạn trên một máy mới.

Vì vậy, ý tưởng chung là giữ các dotfiles của bạn trong một hệ thống kiểm soát phiên bản và liên kết tượng trưng với chúng từ đường dẫn thực. Bằng cách này, repo của bạn không cần phải bắt đầu từ thư mục nhà của bạn và chứa rất nhiều tệp bạn không muốn thêm.


Bạn có thể thêm một số thông tin từ liên kết? Điều đó sẽ cải thiện câu trả lời và cung cấp thông tin nếu liên kết bị hỏng.
Dave M

1
Tôi đã giải thích một số hoạt động và lý luận. Tôi đã không thấy giá trị trong việc sao chép tài liệu.
Aaron McMillin

1

Nếu bạn giống tôi và có nhiều máy phát triển (Máy ảo cũng vậy) vì nhiều lý do, bạn có thể kết hợp các phím ssh, bash_profile thông minh và RCS mà bạn chọn.

Tôi sẽ thứ hai sử dụng nfs / samaba / sshfs. Một nhược điểm là nếu bạn không có quyền truy cập mạng mọi lúc thì bạn không thể truy cập những gì bạn cần (bay, không có wifi, tường lửa, vấn đề định tuyến, v.v.). Các máy mà tôi giữ đồng bộ không phải lúc nào cũng có thể truy cập được nhưng tôi muốn chia sẻ thông tin giữa chúng.

Sau đây là cách tôi đi về nó mượn nhiều ý tưởng từ Internet.

.bash_profile có thể có cái gì đó như thế này

$HOME/bin/shell_ssh_agent

Tôi đã nhận được điều này từ một vài nơi nhưng không thể tìm thấy một liên kết đến nó bây giờ. Tệp 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

Bây giờ vào lần đăng nhập đầu tiên, bạn thiết lập chìa khóa của mình. Đăng xuất và vào và nó chỉ làm cho cuộc sống dễ dàng hơn.

Đặt tất cả các tập lệnh của bạn vào một RCS, điều này làm cho việc giữ cho các máy phát triển đồng bộ hóa dễ dàng hơn. Tôi dùng git. Xác thực với git là thông qua ssh vì vậy các phím ssh cũng giúp ở đây. Lưu ý tại thời điểm này bạn có thể đã sử dụng một cái gì đó như nfs. Tôi vẫn sẽ là một fan hâm mộ của một RCS vì một lý do mà tôi đề cập dưới đây.

Trường hợp sử dụng là

  1. đăng nhập lần đầu tiên, các phím được thiết lập
  2. nếu RCS không được thiết lập, hãy kiểm tra tập lệnh cá nhân của bạn (và cập nhật / hợp nhất khi cần, đây thậm chí có thể là một phần của .bash_profile nếu bạn muốn)
  3. chỉnh sửa vimrc, tập lệnh đặc biệt, v.v. và cam kết chúng
  4. khi đăng nhập vào các máy khác, hãy cập nhật / hợp nhất / kiểm tra. Điều này giữ cho mọi thứ đồng bộ; tức là không còn sao chép các tập tin mà đôi khi bạn dậm chân và bạn không muốn.
  5. như một lợi ích phụ, bạn có được sức mạnh của RCS. Đôi khi tôi thực hiện các thay đổi bất lợi cho các tập lệnh hoặc cấu hình và cần quay lại và tương tự.

Một cái gì đó tôi muốn thử tiếp theo là bọc đăng nhập / thiết lập ban đầu trong một tệp thực hiện mà tôi sao chép vào máy mới. Makefile sau đó có thể thực hiện công việc thiết lập các khóa, RCS, v.v ... Rõ ràng có một số chi phí ở đây nhưng nếu bạn kết thúc việc thiết lập nhiều máy thì đây là:

  1. tiết kiệm thời gian
  2. dễ dàng hơn để giữ cấu hình và tập lệnh cá nhân của các máy phát triển đồng bộ
  3. quản lý các thay đổi đối với các tập lệnh và cấu hình.

1

Tôi sử dụng tệp tạo tệp có danh sách tất cả các máy chủ mà tôi đăng nhập và khi tôi thực hiện thay đổi trên máy cục bộ của mình, 'make' được chạy bằng cách sử dụng tệp tạo tệp tự động cập nhật tất cả các máy chủ với bất kỳ thay đổi hoặc bất kỳ bổ trợ nào


Có vẻ giống như một cách ưa thích để làm một kịch bản. Làm cho thật tuyệt vời khi xây dựng một tệp từ một tệp khác, nhưng tôi không muốn sử dụng nó trong tình huống mà mọi quy tắc là một " .PHONY."
anthony

1

sshrc giải quyết vấn đề này. Bạn đặt .vimrc của bạn vào ~ / .sshrc.d / và sau đó thêm export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"vào `/.sshrc.


1

Tôi đã viết một công cụ đơn giản cho việc này sẽ cho phép bạn vận chuyển tệp .vimrc của mình bất cứ khi nào bạn ssh , bằng cách sử dụng các tùy chọn cấu hình tích hợp SSHd theo cách không chuẩn.

Không thêm svn, scp, copy/paste, vv yêu cầu.

Nó đơn giản, gọn nhẹ và hoạt động theo mặc định trên tất cả các cấu hình máy chủ mà tôi đã thử nghiệm cho đến nay.

https://github.com/gWOLF3/viSSHous


0

Sử dụng biến VIMINIT:

export VIMINIT='set number'

và chuyển tiếp nó đến máy chủ từ xa:

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

rất dễ sử dụng .bash_profiles hoặc .bashrc

export VIMINIT='
set number
'

export LC_VIMINIT=$VIMINIT

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

Bây giờ hãy thử chạy vim trên máy chủ từ xa bằng sshh để kết nối:

sshh remoteuser@remoteserver

Nếu bạn muốn Bạn cũng có thể đưa plugin của mình đến máy chủ từ xa:

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

Tôi có tình huống tương tự, nhưng đó không chỉ là " .vimrc". Tôi cũng có những thứ như

  • cấu hình bash, nhắc nhở và chức năng,
  • tập tin cấu hình và ủy quyền ssh,
  • shell script tôi muốn có tiện dụng.
  • tất nhiên là vimrc của tôi, nhưng cũng có một số hàm vim và các tệp tô sáng cú pháp.

Giải pháp của tôi (bắt đầu từ 30 năm trước với "dist" ban đầu!) Là thiết lập một cron hàng đêm để rsync một cấu hình nhà tối thiểu cho tất cả các máy tôi làm việc, để nó cập nhật hàng đêm.

Bằng cách đó, tất cả các máy khác mà tôi làm việc được cập nhật! Tôi chỉ có thể thêm một máy mới vào danh sách 'tài khoản' và thực hiện phân phối máy duy nhất để khởi động máy.

Không cần nhiều, và bạn có thể bắt đầu nhỏ và làm cho nó phức tạp hơn khi bạn đi. Như bạn có thể tưởng tượng sau 30 năm phân phối của tôi bây giờ khá phức tạp, vì vậy tôi sẽ không đặt nó ở đây. Không cần phải nói nó cũng thực hiện những việc như trao đổi một số cấu hình cho các mạng khác cho một số mạng, dọn dẹp nhà cửa (EG: thùng rác, tệp bộ nhớ cache), đảm bảo tất cả các quyền của nhà đều chính xác, v.v.

LƯU Ý Tôi chỉ cho phép đăng nhập ssh không có mật khẩu từ một máy 'nhà' cho tất cả những người còn lại, không bao giờ quay lại! Bất kỳ ssh chéo đều được bảo vệ bằng mật khẩu.


-1

Bạn có thể xem xét một tập lệnh EXPECT cho phép bạn đặt đường dẫn và môi trường của mình (như các biến EXRC) khi nhấn một tổ hợp phím nhất định. Không nên quá lâu trước khi ai đó đăng một kịch bản tương tự.

Khi trang trại máy chủ của bạn có số lượng hơn vài chục (nghĩ là hàng ngàn) thì việc có thứ gì đó dễ dàng thiết lập môi trường của bạn trên hộp 'trinh tiết' là một cứu cánh thực sự

Thông thường khi tôi đăng nhập vào một hộp, nó sẽ tạo ra homedir của tôi lần đầu tiên!


Mong đợi là một cách rất mong manh để làm bất cứ điều gì. Một hệ điều hành, Kiến trúc khác nhau, hoặc thậm chí là một bản nâng cấp, và nó có thể bị hỏng. Được rồi cho một cái gì đó nhỏ, nhưng không thể mở rộng khi thời gian trôi qua.
anthony

-1

Nó đã được nhận ra với bash oneliner sau đây. Bởi vì nó được thực hiện với Quá trình thay thế, các tệp tạm thời không được tạo.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.