Использование локальных настроек через SSH - PullRequest
8 голосов
/ 19 апреля 2009

Можно ли в сеансе SSH использовать все ваши локальные файлы конфигурации (.bash_profile, .vimrc и т. Д.) При входе в систему? Таким образом, у вас будет такая же конфигурация, скажем, для редактирования файлов в vim в удаленном сеансе.

Ответы [ 9 ]

13 голосов
/ 05 ноября 2014

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

SSHRC

sshrc - это инструмент (фактически просто функция большого bash), который копирует локальные rc-файлы без постоянной записи их в $HOME пользователя, удаляющего пользователя. Идея заключается в том, что может быть общая учетная запись администратора, которую используют другие люди. Также представляется настраиваемым для разных удаленных хостов.

.ssh / config и LocalCommand

В этом блоге предлагается способ автоматического запуска команды при входе на удаленный хост. Он захватывает и передает набор файлов на удаленный компьютер, а затем распаковывает их на $ HOME на удаленном компьютере:

Ваш местный ~/.ssh/config будет выглядеть так:

Host *
   PermitLocalCommand yes
   LocalCommand tar c -C${HOME} .bashrc .bash_profile .exports .aliases .inputrc .vimrc .screenrc \
               | ssh -o PermitLocalCommand=no %n "tar mx -C${HOME}"

Вы можете изменить вышеперечисленное так, чтобы команда запускалась только на определенных хостах (вместо подстановочного знака *) или также настраиваться для других хостов. При использовании этого метода может быть достаточно дублирования для каждого хоста - хотя вы можете упаковать все tar c ... | ssh .. "tar mx .." в скрипт, возможно.

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

8 голосов
/ 19 апреля 2009

Используйте репозиторий dotfiles.git

Что я делаю, так это храню все мои конфигурационные файлы в файле dotfiles.git на центральном сервере.

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

ssh myhost
cd ~/dotfiles
git pull --rebase
cd ~
ln -sf dotfiles/$username/linux/.* . 

Примечание:

  1. Чтобы поместить это в сценарий оболочки, вы можете автоматизировать процесс выполнения команд на удаленном компьютере, отправив по конвейеру ssh .

  2. «$ username» существует для того, чтобы вы могли поделиться своими файлами конфигурации с другими людьми, с которыми вы работаете.

  3. "ln -sf" создает символические ссылки на все ваши точечные файлы, перезаписывая любые локальные файлы, так что ~ / .emacs связан с контролируемым версией файлом ~ / dotfiles / $ username / .emacs.

  4. Использование подкаталога "linux" просто для того, чтобы позволить изменения конфигурации на разных платформах. У меня также есть каталог mac в папке dotfiles / $ username / mac. Большинство файлов в каталоге / mac являются символическими ссылками из каталога linux, поскольку они очень похожи, но есть некоторые исключения.

  5. Наконец, обратите внимание, что вы можете сделать это еще более изощренным, используя имена хостов и тому подобное, а не просто «linux». С помощью dotfiles.git вы также можете совершать набеги на дотфайлы от своих друзей, что удивительно - у каждого есть свои маленькие хитрости и хитрости.

5 голосов
/ 19 апреля 2009

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

Я предлагаю сохранить ваши конфигурационные файлы в Subversion или некоторых других VCS. Вот как я это делаю .

2 голосов
/ 14 марта 2013

Я делаю такие вещи каждый день. У меня есть около 15 bash rc-файлов и .vimrc, несколько vim плагин-скриптов, .screenrc и некоторые другие rc-файлы. У меня есть скрипт синхронизации (написанный на bash), который использует команду cool rsync для синхронизации всех этих файлов с удаленными серверами. Каждый раз, когда я обновляю некоторые файлы на своем главном сервере, я вызываю скрипт для синхронизации их с удаленными серверами.

Настройка репозитория svn/git/hg на главном сервере также работает для меня, но мои удаленные серверы необходимо многократно переустанавливать для тестирования. Поэтому я считаю, что удобнее использовать rsync.

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

2 голосов
/ 19 апреля 2009

Ну, нет, потому что, как говорит Энди Лестер , эту работу выполняет удаленный компьютер, и у него нет доступа к вашей локальной машине для получения .vimrc ...

С другой стороны, вы можете использовать sshfs для локального монтирования удаленной файловой системы и локального редактирования файлов. Это не требует установки чего-либо на удаленной машине. Не уверен, насколько это эффективно, может быть, не очень хорошо для редактирования больших файлов по медленным ссылкам.

Или в Komodo IDE имеется аккуратная опция «Открыть >> Удаленный файл», которая позволяет редактировать файлы на удаленном компьютере. машины, автоматически сканируя их назад и вперед.

1 голос
/ 19 апреля 2009

Вы всегда можете просто скопировать файлы на компьютер перед подключением по ssh:

#!/bin/bash

scp ~/.bash_profile ~/.vimrc user@host:
ssh user@host

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

1 голос
/ 19 апреля 2009

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

0 голосов
/ 28 октября 2015

Вот простой bash-скрипт, который я использовал для этой цели. Он синхронизирует некоторые папки, которые я хотел бы скопировать, используя rsync, а затем добавляет папку ~/bin на удаленные машины .bashrc, если ее там еще нет. Лучше всего, если вы скопировали ваши ключи ssh на каждый сервер . Я использую этот подход вместо «репозитория dotfiles», так как на многих серверах, к которым я подключаюсь, git отсутствует.

Таким образом, чтобы использовать его, вы должны сделать что-то вроде этого:

./bin_sync_to_machine.sh server1

bin_sync_to_machine.sh

function show_help()
{
  echo ""
  echo "usage: SERVER {SERVER2 SERVER3 etc...}"
  echo ""

  exit
}

if [ "$1" == "help" ]
then
  show_help
fi

if [ -z "$1" ]
then
  show_help
fi

# Sync ~/bin and some dot files to remote server using rsync
for SERVER in $*; do
  rsync -avrz --progress ~/bin/ -e ssh $SERVER:~/bin     
  rsync -avrz --progress ~/.vim/ -e ssh $SERVER:~/.vim
  rsync -avrz --progress ~/.vimrc -e ssh $SERVER:~/.vimrc
  rsync -avrz --progress ~/.aliases $SERVER:~/.aliases
  rsync -avrz --progress ~/.aliases $SERVER:~/.bash_aliases

  # Ensure remote server has ~/bin in the path
  ssh $SERVER '~/bin/path_add_to_path.sh'
done

path_add_to_path.sh

pathadd() {
    if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
        PATH="${PATH:+"$PATH:"}$1"
    fi
}

# Add to current path if running in a shell
pathadd ~/bin

# Add to ~/.bashrc 
if ! grep -q PATH:~/bin ~/.bashrc; then 
  echo "PATH=\$PATH:~/bin" >> ~/.bashrc
fi
if ! grep -q source ~/.aliases ~/.bashrc; then 
  echo "source ~/.aliases" >> ~/.bashrc
fi
0 голосов
/ 06 июня 2015

Я думаю, что https://github.com/fsquillace/pearl-ssh делает то, что вам нужно.

Я написал это давным-давно, до рождения sshrc, и он имеет больше преимуществ по сравнению с sshrc:

  • Это не требует зависимости от xxd для обоих хостов (которые могут быть недоступны на удаленном хосте)
  • Pearl-ssh использует более эффективный алгоритм кодирования
  • Это всего лишь ~ 20 строк кода (очень легко понять!)

Например:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit
...