SSH时如何携带.vimrc?


34

我的工作往往涉及使用SSH连接到各种计算机,然后使用vim编辑这些计算机上的文件。问题是我必须不断地复制我的.vimrc文件。打开vim并且没有任何设置很烦人。是否可以在机器之间随身携带我的vim设置,而无需在任何地方手动复制它?


@ duffbeer703:是的,就像set background=dark或一样set background=light没有 Linux发行版可以触及,并且对用户来说完全不麻烦。</ sarcasm>
休伯特·卡里奥

在没有阅读答案的情况下,我认为这在理论上是可行的,因为可以将ssh-agent和x-term转移过来,但是另一方面,这些是由ssh专门处理的,我认为有多种解决方法可以处理疯狂的极端情况。
trysis

Answers:


24

我感到你很痛苦。我所有的〜/.* rc文件都在版本控制(Subversion)下,自1998年我开始使用CVS以来,它一直表现出色。一种方法是,当您站在主目录中时,签出所有这样的rc文件:

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.

这样,当您运行svn update时,配置文件也将在各种计算机上同步和更新。


3
我想这是最好的。诀窍在于,我必须在可从所有其他计算机访问的计算机上设置存储库。使用安全的网络拓扑,这并不总是那么容易。
2009年

我最近开始这样做,真是太神奇了。没有它,我不知道该如何生存。
richo 2010年

5
也许使用git或其他分布式版本控制系统。在这种情况下,足以访问检出配置文件的计算机。
ptman 2011年

44

除了将.vimrc带到您需要使用的每台服务器上之外,为什么不从本地vim编辑远程文件:

在vim / gvim中,运行:

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

或像这样启动vim:

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

这将以缝合方式在适当位置打开文件(实际上是在本地复制文件),并且在保存时,它将已编辑的文件发送回服务器给您。

它要求输入ssh密码,但是可以通过ssh密钥简化此密码。

正如其他人提到的那样,此方法的唯一缺点是您无法像直接在计算机上工作那样获得路径/文件竞争。

有关更多信息,请查看以下教程


+1为scp://提示,但是我认为如果您每次编辑文件时都需要复制路径,则此解决方案可能会有些麻烦。
chmeee

1
是的,这太麻烦了。我必须在远程计算机上进行大量查找才能找到所需的文件,并且经常必须使用sudo特权进行编辑。
2009年

+1对我来说真的很好。谢谢:)
达拉格·恩赖特

在有些情况下,你需要登录到主服务器(login.example.com),然后从那里登录到本地服务器的情况下(top.secret.example.com)
PUK

如果将远程文件结构挂载到本地目录(例如,使用fusermount),则效果很好。
转租

18

您可以制作一个bash脚本来在每次登录时自动复制它,如下所示:

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

例如,您可以将其称为ssh_vim。这不是理想的解决方案,但可以解决您的问题。

您可以改进它以首先检查是否已经存在。如果您不总是从同一台计算机上运行ssh,则可以更改脚本以从另一台计算机上的scp获取文件。

编辑1

与此相关的是,您还可以使用sshfs挂载远程计算机的文件系统。这样,您就可以从您的环境和工具(不仅是.vimrc)中受益,而且可以完成Shell(无需使用scp://)。

编辑2

我刚刚发现可以使用scp://来获取.vimrc文件,如下所示:

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

这可以从vim命令行运行,但是目前我不知道如何自动执行。它似乎不适用于'-u'开关,.vimrc或$ VIMINIT。

编辑3

我找到了!您可以执行以下操作以从参考主机中获取.vimrc来启动vim:

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

选项'-c'在启动vim之后立即执行命令。

您可以在选择的外壳中创建别名以避免输入。在bash中将是这样的:

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

2
这只能如果你ssh'ing电脑可连接回你ssh'ing计算机。并非总是如此,例如,如果您的计算机位于NAT之后。
trysis'1

10

如果您使用的是公钥身份验证,则可以在以下代码中使用它~/.ssh/config

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

我喜欢上面建议的脚本技巧,因为它不会弄乱ssh命令的调用(在指定额外的参数等时)


这是最好的。对我来说,我不得不更改%u@%n:为,%r@%n:因为ssh用户名不同于笔记本电脑的用户名
Moshe

4

几个解决方案:

1)为您的主文件夹创建一个NFS共享,并将其映射到多个位置。

2)创建一个小脚本,以使用身份/密钥文件将.vimrc推送到您要连接的服务器。它可能看起来像这样(伪代码):

connectString = arg0  #username@ipaddress

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

1
ssh键将解决纯文本密码问题。
LiraNuna

您将使用什么工具来创建NFS共享?
Wadih M.

@LiraNuna-似乎您在我遇到“ duh”时刻并编辑我的帖子之前就抓住了我。@Wadih-NFSD通常默认安装在'nix系统上。您也可以默认情况下(通常)安装NFS共享。
moshen

1
NFS共享是一个好主意,但部署此类事物的能力可能会受到限制,尤其是在防火墙环境或您不想修改生产服务器的位置(尤其是使用NFS)
ericslaw

您是正确的ericslaw。我假设这些是单个网络中的多台计算机。
moshen

4

答案与sunny256完全相同,但使用git代替SubVersion。

使用所有计算机通用的文件保留一个主分支,并且每台新计算机都有一个分支。

这样一来,您可以在大多数计算机上拥有几乎相同的文件,而不会感到困惑。


+1一个小问题:我想知道对Subversion中的通用文件使用外部定义是否更好?这样,您可以将它们放在一个地方并获取任何分支
Eugene Yarmash

3

我知道这是一个旧线程,但是我做的一种方法是使用sshfs将文件系统安装在保险丝上。本地vim进行所有编辑,因此没有理由复制.vimrc。

这确实有一个缺点,那就是必须为需要在远程服务器上运行的任何命令打开另一个终端,但是对于编辑,我发现这种方式是最好的。

它还具有能够使用系统剪贴板的附加好处。


2

我正在使用https://github.com/andsens/homeshick来管理我的点文件,并将它们存储在github上。

Homeshick用100%bash编写,可帮助您管理“城堡”,这些城堡只是包含/ home /目录的git repos。它具有将现有点文件移至存储库中并用符号链接替换它们的命令。并将符号库中的所有文件符号链接到新计算机上的主目录中。

因此,通常的想法是将您的点文件保存在版本控制系统中,并从实际路径对其进行符号链接。这样,您的回购不需要从您的主目录开始,也不需要包含许多您不想添加的文件。


您可以从链接中添加一些信息吗?如果链接断开,这将改善答案并提供信息。
Dave M

1
我解释了一些操作和推理。复制文档没有价值。
亚伦·麦克米林

1

如果您和我一样,并且出于各种原因拥有许多开发机(也包括虚拟机),则可以组合使用ssh密钥,智能bash_profile和您选择的RCS。

我会第二次使用nfs / samaba / sshfs。缺点之一是,如果您一直没有网络访问权限,那么您将无法访问所需的内容(飞行,没有wifi,防火墙,路由问题等)。我保持同步的计算机不是同时可以同时访问的,但是我想在它们之间共享信息。

以下是我如何从互联网上借鉴许多想法的方法。

.bash_profile可能有这样的内容

$HOME/bin/shell_ssh_agent

我是从几个地方得到的,但是现在找不到它的链接。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

现在,首次登录时,您就可以设置密钥了。注销并登录,这使生活变得更加轻松。

将所有脚本放入RCS中,这使得保持开发机器同步更加容易。我使用git。git的身份验证是通过ssh进行的,因此ssh密钥在这里也有帮助。请注意,此时您可能已经使用了nfs之类的东西。由于下面提到的原因,我仍然会喜欢RCS。

用例是

  1. 首次登录,按键进行设置
  2. 如果未设置RCS,请签出您的个人脚本(并在需要时进行更新/合并,如果需要,它甚至可以成为.bash_profile的一部分)
  3. 编辑vimrc,特殊脚本等并提交
  4. 登录其他计算机时,请执行更新/合并/签出。这样可以使所有内容保持同步;即不再复制文件,有时您会and脚而又不想这么做。
  5. 作为附带的好处,您可以获得RCS的强大功能。有时我会对脚本或配置进行不利的更改,并且需要回滚等。

我接下来要尝试的操作是将初始登录/设置包装在我复制到新计算机的makefile中。然后,makefile可以完成设置密钥,RCS等的工作。显然这里有一些开销,但是如果最终要设置很多机器,这是:

  1. 节省时间
  2. 更容易保持开发机器的配置和个人脚本同步
  3. 管理脚本和配置的更改。

1

我使用的makefile包含我登录到的所有服务器的列表,当我在本地计算机上进行更改时,将使用makefile自动运行“ make”,该makefile将使用所有更改或任何插件更新所有服务器


似乎更像是一种制作脚本的奇特方式。从另一个文件构建一个文件时,make很棒,但是我不想在每个规则都是“ .PHONY.” 的情况下使用它
安东尼

1

sshrc解决了这个问题。您将.vimrc放入〜/ .sshrc.d /中,然后添加export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"到`/.sshrc中。


1

我为此编写了一个简单的工具,该工具允许您以非标准方式使用SSHd内置配置选项在ssh时本地传输.vimrc文件

无需额外的svnscpcopy/paste,等需要。

它简单,轻巧,并且默认情况下可以在我到目前为止测试过的所有服务器配置上使用。

https://github.com/gWOLF3/viSSHous


0

使用变量VIMINIT:

export VIMINIT='set number'

并将其转发到远程服务器:

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

使用.bash_profiles或.bashrc很容易

export VIMINIT='
set number
'

export LC_VIMINIT=$VIMINIT

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

现在尝试使用sshh在远程服务器上运行vim进行连接:

sshh remoteuser@remoteserver

如果您愿意,也可以将插件带到远程服务器:

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

我也有同样的情况,但不只是“ .vimrc”。我也有类似的东西

  • bash配置,提示和功能,
  • ssh配置和授权文件,
  • 我喜欢方便的shell脚本。
  • 当然是我的vimrc,还有一些vim函数和语法高亮文件。

我的解决方案(从30年前开始使用“ dist”开始!)是设置每晚一次的cron,以将最小的家庭配置同步到我使用的所有计算机上,以便每晚更新一次。

这样,我使用的所有其他机器都保持最新状态!我可以将一台新计算机添加到“帐户”列表中,然后进行一次单机分发以将其启动。

不需要太多,您可以从小处着手,并在进行时使其变得更复杂。您可以想象30年后我的分布现在相当复杂,因此我不会在这里列出。不用说,它还可以进行某些配置,例如为某些网络交换其他配置,进行家庭清理(例如:垃圾,缓存文件),确保家庭权限都正确等等。

注意:我只允许从一台“家用”计算机到所有其余计算机的无密码ssh登录,再也不会返回!任何cross ssh均受密码保护。


-1

您可能会考虑使用EXPECT脚本,该脚本允许您在按下某个按键时设置路径和环境(例如EXRC变量)。不久之后,有人发布类似的脚本。

当您的服务器场数量超过几十(想几千)时,在“原始”盒子上轻松地设置您的环境将是真正的救星

通常,当我登录到框时,它会首次创建我的homedir!


期望是做任何事情的非常脆弱的方式。不同的操作系统,体系结构甚至升级,都可能会中断。可以处理一些小事,但随着时间的推移无法扩展。
安东尼

-1

它是通过以下bash oneliner实现的。因为它是通过“流程替换”完成的,所以不会创建临时文件。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.