Использование локальных настроек через SSH

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


person Verhogen    schedule 19.04.2009    source источник


Ответы (10)


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

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

person Andy Lester    schedule 19.04.2009
comment
Я также храню файлы конфигурации в репозитории svn, но я извлекаю их в отдельный каталог, а затем использую сценарий установки для удаления исходных файлов и создания символических ссылок на файлы в репозитории. Таким образом, мне не нужно вручную удалять файлы. - person moinudin; 19.04.2009
comment
пинг на битую ссылку. - person Olle Härstedt; 25.11.2015

Я только что наткнулся на две альтернативы простому выполнению 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 .." в скрипт.

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

person thom_nic    schedule 05.11.2014
comment
Я пробовал с LocalCommand tar cz -C${HOME} .vimrc | ssh -o PermitLocalCommand=no %r@%n "tar mzx -C${HOME}", но всегда получаю tar /Users/lony не может выполнить: Файл или каталог не найден, я что-то пропустил? - person lony; 28.10.2016
comment
У меня была такая же ошибка, и я заставил ее работать, проверив HOME. Я заменил HOME фактическим путем, потому что мой локальный домашний каталог отличается от удаленного. Мое решение: LocalCommand tar c -C /Users/username .vimrc | ssh -o PermitLocalCommand=no %n "tar mx -C /home/username" - person Ben; 19.11.2016

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

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

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

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

Примечание:

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

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

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

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

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

person ramanujan    schedule 19.04.2009
comment
Я делаю это сам, но я обнаружил, что наиболее неудобной частью является то, что мой репозиторий dotfiles git является частным, поэтому для git clone на новом удаленном хосте мне также нужно скопировать мои ключи git ssh. Я думаю, что использование переадресация ssh-агента может помочь облегчить это, но пока еще один шаг. - person thom_nic; 15.03.2017

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

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

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

person NickZoic    schedule 19.04.2009

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

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

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

person pynexj    schedule 14.03.2013
comment
@mreq: мой скрипт использует некоторые другие частные инструменты, поэтому вы не можете использовать его напрямую. Самая важная часть — это команда rsync: rsync -c -L --files-from /root/to-be-rsynced root $host:$home. rsync имеет довольно много волшебных опций, и те, которые я использую, могут вам не подойти. :) - person pynexj; 17.06.2013

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

person DragonFax    schedule 19.04.2009

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

#!/bin/bash

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

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

person Chas. Owens    schedule 19.04.2009

Вот простой скрипт 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
person Brad Parks    schedule 28.10.2015

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

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

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

https://github.com/gWOLF3/viSSHous

person glenn    schedule 01.11.2019

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

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

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

Например:

$> echo "alias q=exit" > ~/.config/kyrat/bashrc
$> kyrat [email protected]
myserver.com $> q
exit
person user967489    schedule 06.06.2015