Назад | Перейти на главную страницу

Как использовать .vimrc, когда я использую SSH?

Моя работа, как правило, включает использование SSH для подключения к различным машинам, а затем использование vim для редактирования файлов на этих машинах. Проблема в том, что мне приходится постоянно копировать свой файл .vimrc. Очень неприятно открывать vim и не иметь никаких настроек. Можно ли переносить мои настройки vim с собой с машины на машину, не копируя их везде вручную?

Вместо того, чтобы передавать .vimrc на каждый сервер, с которым вам нужно работать, почему бы не отредактировать удаленные файлы с вашего локального vim:

В vim / gvim запустите:

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

или запустите vim так:

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

Это открывает файл на месте (фактически он копирует файл локально), а когда вы сохраняете, он отправляет отредактированный файл обратно на сервер для вас.

Он запрашивает пароль ssh, но это можно упростить с помощью ключей ssh.

Как отмечали другие, единственным недостатком этого метода является то, что вы не получаете конкуренции пути / файла, как при работе непосредственно на машине.

Для получения дополнительной информации, ознакомьтесь со следующим руководством.

Я чувствую твою боль. У меня все мои файлы ~ /.* 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.

Вы можете создать сценарий bash для автоматического копирования его каждый раз при входе в систему, например:

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

Вы можете назвать это, например, ssh_vim. Это не идеальное решение, но решит вашу проблему.

Вы можете улучшить его, чтобы сначала проверить, есть ли уже там. Если вы не всегда запускаете ssh с одного и того же компьютера, вы можете изменить сценарий, чтобы получить файл из scp с другого компьютера.

РЕДАКТИРОВАТЬ1

Кстати, вы также можете смонтировать файловую систему удаленного компьютера с помощью sshfs. Таким образом, вы получаете выгоду от своей среды и инструментов (не только .vimrc), и у вас есть автозавершение оболочки (чего у вас нет с помощью scp: //).

РЕДАКТИРОВАТЬ2

Я только что узнал, что вы можете создать свой файл .vimrc, используя scp: //, например:

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

Это работает из командной строки vim, но на данный момент я не знаю, как это автоматизировать. Похоже, он не работает ни с переключателем '-u', ни с .vimrc, ни с $ VIMINIT.

РЕДАКТИРОВАТЬ3

Я нашел это! Вы можете сделать это, чтобы запустить vim с .vimrc, взятым из вашего справочного хоста:

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

Опция '-c' выполняет команду сразу после запуска vim.

Вы можете создать псевдоним в своей оболочке, чтобы не печатать. В bash это будет так:

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

Если вы используете аутентификацию с открытым ключом, вы можете использовать это в своем ~/.ssh/config:

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

Мне он нравится больше, чем трюк со сценарием, предложенный выше, поскольку он не мешает вызову ssh команда (при указании дополнительных параметров и т. д.)

Пара решений:

1) Создайте общий ресурс NFS для своей домашней папки и сопоставьте его в нескольких местах.

2) Создайте небольшой скрипт для отправки вашего .vimrc на сервер, к которому вы подключаетесь, с файлом идентификатора / ключа. Это может выглядеть примерно так (псевдокод):

connectString = arg0  #username@ipaddress

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

Тот же ответ, что и sunny256, но используйте git вместо SubVersion.

Держите одну главную ветку с файлами, общими для всех компьютеров, и одну ветку для каждого нового компьютера.

Таким образом, вы можете иметь почти одинаковые файлы на большинстве компьютеров, и при этом не запутаться.

Я знаю, что это старый поток, но я использую sshfs, который монтирует файловую систему через предохранитель. Локальный vim выполняет все редактирование, поэтому нет причин копировать .vimrc.

У этого есть обратная сторона: другой терминал должен быть открыт для любых команд, которые необходимо запускать на удаленном сервере, но для редактирования я считаю этот способ лучшим.

Он также имеет дополнительное преимущество - возможность использовать системный буфер обмена.

я использую https://github.com/andsens/homeshick для управления моими точечными файлами и их хранения на github.

Homeshick написан на 100% bash и помогает вам управлять «замками», которые представляют собой просто репозитории git, содержащие каталог / home /. В нем есть команды для перемещения существующих точечных файлов в репо и замены их символическими ссылками. И для символической ссылки на все файлы в репо в ваш домашний каталог на новом компьютере.

Таким образом, общая идея состоит в том, чтобы хранить ваши точечные файлы в системе контроля версий и создавать на них символические ссылки с реального пути. Таким образом, ваше репо не должно начинаться с вашего домашнего каталога и содержать массу файлов, которые вы никогда не хотите добавлять.

Если вы похожи на меня и имеете много машин для разработки (в том числе виртуальных) по разным причинам, вы можете комбинировать ключи ssh, smart bash_profile и RCS по вашему выбору.

Во-вторых, я бы использовал nfs / samaba / sshfs. Один недостаток заключается в том, что если у вас нет постоянного доступа к сети, вы не можете получить доступ к тому, что вам нужно (полет, отсутствие Wi-Fi, межсетевые экраны, проблемы с маршрутизацией и т. Д.). Не все машины, которые я синхронизирую, доступны одновременно, но я хочу обмениваться информацией между ними.

Вот как я это сделал, заимствуя много идей из Интернета.

.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. при входе на другие машины выполните обновление / слияние / проверку. Это позволяет синхронизировать все; т.е. больше не нужно копировать файлы, которые иногда вы топчете и не хотите.
  5. в качестве дополнительного преимущества вы получаете мощность RCS. Иногда я вношу неблагоприятные изменения в скрипты или конфиги, и мне нужно откатиться и тому подобное.

Что-то, что я хочу попробовать дальше, - это обернуть начальный вход / настройку в make-файл, который я копирую на новую машину. Затем make-файл может выполнять работу по настройке ваших ключей, RCS и т. Д. Очевидно, здесь есть некоторые накладные расходы, но если вы в конечном итоге настроите много машин, это будет:

  1. экономия времени
  2. проще синхронизировать конфигурации и личные сценарии машин разработки
  3. управление изменениями в скриптах и ​​конфигах.

Я использую make-файл, в котором есть список всех серверов, на которые я вхожу, и когда я вношу изменения на моем локальном компьютере, make запускается автоматически с использованием make-файла, который обновляет все серверы любыми изменениями или любыми плагинами.

sshrc решает эту проблему. Вы помещаете свой .vimrc в ~ / .sshrc.d /, а затем добавляете export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC" в `/.sshrc.

Я написал для этого простой инструмент, который позволит вам изначально переносить ваш .vimrc файл всякий раз, когда вы ssh, нестандартным способом используя встроенные параметры конфигурации SSHd.

Никаких дополнительных svn,scp,copy/pasteи т. д. требуется.

Он простой, легкий и работает по умолчанию на всех конфигурациях серверов, которые я тестировал до сих пор.

https://github.com/gWOLF3/viSSHous

Используя переменную 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'

Теперь попробуйте запустить vim на удаленном сервере, используя sshh для подключения:

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
}

У меня такая же ситуация, но это не просто ".vimrc". У меня также есть такие вещи, как

  • конфигурация, подсказки и функции bash,
  • файлы конфигурации и авторизации ssh,
  • сценарии оболочки, которые я хотел бы иметь под рукой.
  • конечно мой vimrc, но также некоторые функции vim и файлы подсветки синтаксиса.

Мое решение (начатое 30 лет назад с "dist" изначально!) - настроить ночной cron для rsync минимальной домашней конфигурации на всех машинах, на которых я работаю, чтобы он обновлялся каждую ночь.

Таким образом, все остальные машины, с которыми я работаю, будут обновляться! Я могу просто добавить новую машину в список «учетных записей» и выполнить раздачу на одну машину, чтобы запустить ее.

Необязательно много, вы можете начать с малого и усложнять задачу по ходу дела. Как вы понимаете, по прошествии 30 лет мой дистрибутив стал довольно сложным, поэтому я не буду здесь его описывать. Излишне говорить, что он также выполняет такие действия, как замена некоторых конфигураций для других для некоторых сетей, очистка дома (например, мусор, файлы кеша), обеспечение правильности всех разрешений для дома и так далее.

ПРИМЕЧАНИЕ Я разрешаю вход по SSH без пароля только с одной «домашней» машины для всех остальных, и никогда больше не вернется! Любой перекрестный ssh ​​защищен паролем.

Вы можете рассмотреть сценарий EXPECT, который позволяет вам установить ваш путь и среду (например, переменные EXRC) при нажатии определенного нажатия клавиши. Не должно пройти слишком много времени, прежде чем кто-нибудь опубликует аналогичный сценарий.

Когда количество ферм на вашем сервере превышает несколько десятков (думаю, тысячи), то наличие чего-то, что легко настроить вашу среду на `` девственном '' боксе, станет настоящим спасением.

Часто, когда я вхожу в систему, он создает мой домашний адрес впервые!

Это было реализовано с помощью следующего 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