Як привести .vimrc навколо, коли я SSH?


34

Моя робота, як правило, передбачає використання SSH для підключення до різних машин, а потім використання vim для редагування файлів на цих машинах. Проблема в тому, що мені доводиться постійно копіювати свій .vimrc файл. Дуже прикро відкривати vim і не мати налаштувань. Чи можна переносити мої налаштування vim із собою на машину, не копіюючи її скрізь вручну?


@ duffbeer703: так, як, set background=darkабо set background=lightте, чого жоден дистрибутив Linux не торкається і є абсолютно ненав’язливим для користувача. </sarcasm>
Хуберт Каріо

Ще не прочитавши відповіді, я вважаю, що це теоретично можливо, оскільки ssh-агент і x-термін можуть бути перенесені, але з іншого боку, вони спеціально обробляються ssh, і я припускаю, що існує декілька обхідних шляхів вирішення шалених випадків .
трис

Відповіді:


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-оновлення.


3
Я думаю, це так добре, як це виходить. Хитрість полягає в тому, що я повинен налаштувати сховище на машині, доступній для всіх інших машин. З захищеною мережевою топологією це не завжди просто.
Апрех

Я почав це робити недавно, це дивовижно. Я не знаю, як я вижив без цього.
Річо

5
Можливо, використовуйте git або якусь іншу розподілену систему контролю версій. У цьому випадку достатньо мати доступ до машини, на якій перевіряються конфігураційні файли.
птман

44

Замість того, щоб приносити .vimrc на кожен сервер, над яким потрібно працювати, чому б не редагувати віддалені файли з вашого локального vim:

In 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.
Апрех

+1 для мене це дуже добре працює. дякую :)
Darragh Enright

Бувають випадки, коли вам потрібно увійти на головний сервер (login.example.com), а потім звідти увійти на локальний сервер (top.secret.example.com)
puk

Це добре працює, якщо ви змонтуєте віддалену структуру файлів у свій локальний каталог, наприклад, з fusermount.
релет

18

Ви можете зробити скрипт bash, щоб скопіювати його автоматично кожного разу при вході в систему, наприклад:

#!/usr/bin/env bash

scp ~/.vimrc $1:
ssh $1

Наприклад, це можна назвати ssh_vim. Це не ідеальне рішення, але вирішить вашу проблему.

Ви можете покращити його, щоб перевірити спочатку, чи вже є. Якщо ви не завжди запускаєте ssh з однієї машини, ви можете змінити сценарій, щоб отримати файл з scp з іншої машини.

EDIT1

У відповідній примітці ви також можете встановити файлову систему віддаленої машини за допомогою sshfs. Таким чином ви отримуєте вигоду від свого оточення та інструментів (не тільки .vimrc) і у вас є завершення оболонки (для чого у вас немає використання scp: //).

EDIT2

Я щойно дізнався, що ви можете джерелом файлу .vimrc за допомогою scp: //, як це:

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

Це працює з командного рядка vim, але на даний момент я не знаю, як його автоматизувати. Схоже, це не працює ні з перемикачем '-u', ні в .vimrc, ні з $ VIMINIT.

EDIT3

Я знайшов це! Ви можете зробити це, щоб запустити 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'"

2
Це працює тільки якщо комп'ютер ви ssh'ing в може підключити назад до комп'ютера , ви ssh'ing з . Це не завжди так, наприклад, якщо ваш комп'ютер відстає від NAT.
трис

11

Якщо ви використовуєте аутентифікацію з відкритим ключем, ви можете використовувати це у своїх ~/.ssh/config:

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

Мені це подобається краще, ніж запропонований вище трюк сценарію, оскільки він не псує виклик sshкоманди (коли вказує додаткові параметри тощо)


це найкраще. Для мене я повинен був змінити , %u@%n:щоб %r@%n:тому , що SSH ім'я користувача відрізняється від імені користувача мого лептопа
Моше

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 - здається, ти зловив мене до того, як я пережив свій "дух" момент і відредагував своє повідомлення. @Wadih - NFSD зазвичай встановлюється у системах nix за замовчуванням. Ви також можете змонтувати спільні акції NFS (як правило) за замовчуванням.
moshen

1
Обмін NFS - це гарна ідея, але, швидше за все, це матиме обмежену можливість розгортання подібних речей, особливо в умовах, що знаходяться під
захистом,

Ви правильний ерікслав. Я зробив припущення, що це кілька машин в межах однієї мережі.
Мошен

4

Точна відповідь, як Sunny256, але використовуйте git замість SubVersion.

Зберігайте одну головну гілку з файлами, яка є загальною для всіх комп'ютерів, і мати одну гілку для кожного нового комп'ютера.

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


+1 Невелике запитання: мені цікаво, чи краще використовувати зовнішні визначення для загальних файлів у підривному режимі? Таким чином, ви можете мати їх в одному місці та зайти в будь-яку гілку
Євген Ярмаш,

3

Я знаю, що це стара нитка, але один із способів я це роблю, використовуючи sshfs, який монтує файлову систему над запобіжником. Місцевий vim виконує все редагування, тому немає причин копіювати .vimrc навколо.

У цьому є недолік, що інший термінал повинен бути відкритий для будь-яких команд, які потребують запуску на віддаленому сервері, але для редагування я вважаю цей спосіб найкращим.

Він також має додаткову користь від можливості використання системного буфера обміну.


2

Я використовую https://github.com/andsens/homeshick, щоб керувати своїми дотфайлами та зберігати їх у github.

Homeshick написаний на 100% баш, і допомагає вам керувати "замками", які є просто git repos, які містять / home / каталог. У ньому є команди переміщати наявні точкові файли в репо і замінювати їх символьними посиланнями. І щоб зв'язати всі файли репо в домашній каталог на новій машині.

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


Чи можете ви додати трохи інформації за посиланням? Це поліпшить відповідь та надасть інформацію, якщо посилання перерветься.
Дейв М

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

Щось я хочу спробувати далі, це загорнути початковий вхід / налаштування в makefile, який я копіюю на нову машину. Тоді makefile може виконати роботу з налаштуванням ваших ключів, RCS тощо. Очевидно, що тут є деякі накладні витрати, але якщо ви закінчите налаштування багатьох машин, це:

  1. економія часу
  2. простіше тримати синхронізацію конфігурацій та особистих скриптів машин розвитку
  3. управління змінами скриптів та конфігурацій.

1

Я використовую makefile, у якому є список усіх серверів, на які я входжу, і коли я вношу зміни на своїй локальній машині, 'make' запускається автоматично, використовуючи makefile, який оновлює всі сервери з будь-якими змінами або будь-якими плагінами


Схоже, це химерний спосіб виконання сценарію. Зробити відмінно під час створення одного файлу з іншого, але я не хотів би використовувати його в ситуації, коли кожне правило є " .PHONY."
anthony


1

Для цього я написав простий інструмент, який дозволить вам власне транспортувати файл .vimrc кожного разу, коли ви ssh , використовуючи вбудовані параметри конфігурації SSHd нестандартним способом.

Ніякі додаткові svn, scp, copy/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'

Тепер спробуйте запустити 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
}

0

У мене така ж ситуація, але це не просто " .vimrc". У мене теж є такі речі

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

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

Таким чином, всі інші машини, з якими я працюю, оновлюються! Я можу просто додати нову машину до списку "акаунтів" і зробити єдиний розподіл машини, щоб запустити її.

Не потрібно багато, і ви можете почати з малого і зробити його складнішим, як підете. Як ви можете собі уявити після 30 років, моє розповсюдження зараз досить складне, тому я не буду його розміщувати тут. Зайве говорити, що це також робить такі речі, як підміняти певну конфігурацію на інші для деяких мереж, очищення дому (EG: сміття, файли кешу), переконайтесь, що дозволи для дому є правильними тощо.

ПРИМІТКА Я дозволяю лише ввійти в систему ssh, що не захищається паролем, з однієї "домашньої" машини для всіх інших, ніколи більше не повертаючись! Будь-який перехресний ssh ​​захищений паролем.


-1

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

Коли ваші серверні ферми налічують більше кількох десятків (думаю, тисячі), то щось легко налаштувати навколишнє середовище на «незайманому» полі - це справжній рятувальник

Часто, коли я входжу в коробку, вона створює мій хомедір вперше!


Очікувати - дуже крихкий спосіб робити що-небудь. Інша ОС, архітектура чи навіть оновлення, і вона може зламатися. Гаразд для чогось невеликого, але не розширюваного з часом.
Антоній

-1

Це було реалізовано за допомогою наступного баш-онлінера. Оскільки це робиться з Process Substitution, тимчасові файли не створюються.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.