21

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

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

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

8 ответов8

17

Вы можете временно скопировать ваш .bashrc на удаленный компьютер с другим именем. Например, используя .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

После этого вы можете войти на удаленный компьютер:

user@local$ ssh user@remote

и source файл .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Теперь вы можете использовать ваш .bashrc и ваши функции. Когда вы закончите свою работу, вы можете удалить файл ~/.bashrc_temp на удаленной машине и выйти из системы.

Копирование файла и вход на удаленный компьютер могут быть выполнены с помощью функции bash:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Обновление:

Вы также можете скопировать .bashrc в /tmp на удаленной машине и в исходный код /tmp/.bashrc_temp .

Обновление 2:

Вы можете войти на удаленный компьютер с помощью ssh -t. Это автоматически использует ваш темп .bashrc . Обновлена функция s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}
9

Дженс-на предоставил отличный ответ. Я потратил немного времени и переделал его, чтобы немного улучшить работу. Таким образом, вы можете передать в SSH любой параметр, например, номера портов. Разница в том, что он использует команду ssh для загрузки файла .bashrc вместо scp , который использует разные имена параметров команды.

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

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Запустите его следующим образом:

sshs user@server

Название « sshs » для "Источник SSH". Используйте ssh когда вы не хотите получать исходный код, и используйте sshs когда вы это делаете.

https://gist.github.com/jonahbron/5549848

7

Я думаю, что sshrc это то, что вы ищете:https://github.com/Russell91/sshrc

sshrc работает так же, как ssh, но он также получает ~/.sshrc после удаленного входа в систему.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Вы можете использовать это для установки переменных среды, определения функций и запуска команд после входа в систему. Это так просто, и это не повлияет на других пользователей на сервере - даже если они тоже используют sshrc. Для более сложной конфигурации, продолжайте читать.

5

Не уверен в ограничениях, но я смог заставить это работать с чем-то вроде:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"
2

Я думаю, что 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
2

Это то, что я придумал. Это позволяет вам поддерживать обычный rc-файл, но также делать все в одном ssh-соединении (то есть, нужно войти в систему только один раз, а не делать scp в первую очередь).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Я не уверен, насколько большим может быть этот rc-файл, поскольку в какой-то момент он может быть максимальным.

1

Один из вариантов заставить его работать с одним сеансом SSH - использовать переменную для хранения вашего bash-файла, а не копировать его.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Кажется, работает на меня.

1

Я искал решение такой проблемы, как ваша, и понял, что я действительно искал sshfs. Может быть, вы тоже можете использовать это?

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

http://fuse.sourceforge.net/sshfs.html

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .